Помогите плз, найти косяк!
В прерывании значение sec находится в памяти по адресу 0х60, а в теле программы почемуто становится R18????
Если убрать коммент перед строкой инициализации sec=0; то компилятор вообще выкидывает весь код после сравнения...(и сравнение тоже). Подскажите может какие-то опции для компиляции использовать?
И вообще в какую сторону копать? Конечно можно все это перенести в прерывание, но хотелось бы разобраться...
AVRStudio 4.18 Bild 700
Исходный код:
|
Код:
|
unsigned char sek;
inline void led_r_off()
{
PORTB &= ~( 1 ‹‹ PB0 );
}
inline void led_r_on()
{
PORTB |= ( 1 ‹‹ PB0 );
}
ISR(TIMER1_OVF_vect)
{
// reinit counter
TCNT1H = 133;
TCNT1L = 238;
sek++;
}
int main(void)
{
uint8_t temp;
uint16_t km;
//-- Red LED is on PB0
DDRB |= ( 1 ‹‹ PB0 );
PORTB |= ( 1 ‹‹ PB0 ); // red on
// Timer1 settings: ~ 8000000 ticks (1 sec)
TCCR1B = (1‹‹CS12); // prescaler = 256
TCNT1H = 133;
TCNT1L = 238;
TIMSK = (1‹‹TOIE1); // Timer1 Overflow Interrupt Enable
// sek=0;
sei();
while(1)
{
led_r_on();
_delay_ms(50);
led_r_off();
_delay_ms(50);
if (sek==240)
{
sek=0;
km++;
temp=(uint8_t)(km››8);
EEPROM_write(11, temp);
temp=(uint8_t)(km&0xFF);
EEPROM_write(10, temp);
}
}
return 0;
} |
==============================================
Дизассемблер выглядит так: (прерывание и конец программы)
25: {
+00000024: 921F PUSH R1 Push register on stack
+00000025: 920F PUSH R0 Push register on stack
+00000026: B60F IN R0,0x3F In from I/O location
+00000027: 920F PUSH R0 Push register on stack
+00000028: 2411 CLR R1 Clear Register
+00000029: 938F PUSH R24 Push register on stack
27: TCNT1H = 133;
+0000002A: E885 LDI R24,0x85 Load immediate
+0000002B: BD8D OUT 0x2D,R24 Out to I/O location
28: TCNT1L = 238;
+0000002C: EE8E LDI R24,0xEE Load immediate
+0000002D: BD8C OUT 0x2C,R24 Out to I/O location
29: sek++;
+0000002E: 91800060 LDS R24,0x0060 Load direct from data space
+00000030: 5F8F SUBI R24,0xFF Subtract immediate
+00000031: 93800060 STS 0x0060,R24 Store direct to data space
30: }
+00000033: 918F POP R24 Pop register from stack
+00000034: 900F POP R0 Pop register from stack
+00000035: BE0F OUT 0x3F,R0 Out to I/O location
+00000036: 900F POP R0 Pop register from stack
+00000037: 901F POP R1 Pop register from stack
+00000038: 9518 RETI
===================
-------
===================
30: if (sek==240)
+0000006F: 3F20 CPI R18,0xF0 Compare with immediate
+00000070: F7E1 BRNE PC-0x03 Branch if not equal
133: km++;
+00000071: 9601 ADIW R24,0x01 Add immediate to word
34: while(EECR & (1‹‹EEWE));
+00000072: 99E1 SBIC 0x1C,1 Skip if bit in I/O register cleared
+00000073: CFFE RJMP PC-0x0001 Relative jump
35: EEAR = uiAddress;
+00000074: BB7F OUT 0x1F,R23 Out to I/O location
+00000075: BB6E OUT 0x1E,R22 Out to I/O location
36: EEDR = ucData;
+00000076: BB9D OUT 0x1D,R25 Out to I/O location
37: EECR |= (1‹‹EEMWE);
+00000077: 9AE2 SBI 0x1C,2 Set bit in I/O register
38: EECR |= (1‹‹EEWE);
+00000078: 9AE1 SBI 0x1C,1 Set bit in I/O register
34: while(EECR & (1‹‹EEWE));
+00000079: 99E1 SBIC 0x1C,1 Skip if bit in I/O register cleared
+0000007A: CFFE RJMP PC-0x0001 Relative jump
35: EEAR = uiAddress;
+0000007B: BB5F OUT 0x1F,R21 Out to I/O location
+0000007C: BB4E OUT 0x1E,R20 Out to I/O location
36: EEDR = ucData;
+0000007D: BB8D OUT 0x1D,R24 Out to I/O location
37: EECR |= (1‹‹EEMWE);
+0000007E: 9AE2 SBI 0x1C,2 Set bit in I/O register
38: EECR |= (1‹‹EEWE);
+0000007F: 9AE1 SBI 0x1C,1 Set bit in I/O register
+00000080: E020 LDI R18,0x00 Load immediate
+00000081: CFEB RJMP PC-0x0014 Relative jump
-