Привет, друзья!
Начал разбираться с АВРом
Имею:
AT90CAN128
avr-gcc (под Linux)
оптимизация -O0Набросал код для мигания лампочкой через обыкновенную задержку - работает,
а через таймер - нет!
Долго ковырялся и выяснил, что при срабатывании прерывания от таймера проц перезапускается:
CODE
#define __AVR_AT90CAN128__
#include <avr/interrupt.h>
#include <avr/wdt.h>
/**
interrupt vector for TIMER0
*/
//ISR(_VECTOR(TIMER0_OVF_vect)) //TIMER0_OVF_vect or 17
ISR(_VECTOR(17))
{
TIFR0 = 1<<TOV0; // сбросить флаг прерывания
wdt_reset();
}
void sleep(int n)
{
int volatile i, j;
for(j=0; j<n; j++)
for(i=0; i<0xFFFF; i++)
wdt_reset();
}
int main(int argc, char *argv[])
{
cli();
wdt_enable(WDTO_2S); //сторожевой таймер 2 сек
wdt_reset();
//configure PORTD
DDRD = 0xFF; // is output
PORTD ^= 0x80;
sleep(8);
//configure TIMER0
TCCR0A = _BV(CS00)|_BV(CS02); //Устанавливаем предделитель clk/1024
TIFR0 = 1<<TOV0; // сбросить флаг прерывания
TCNT0 = 0;
TIMSK0 = 1<<TOIE0; //включаем таймер
wdt_reset();
sei();
while(1);
return 0;
}
пытался получить ASM-листинг с помощъю команды:
avr-objdump -S $file.o >$file.listне понравился он мне, то ли это не много не то, то ли проблема с компиляцией, а именно, почему при объявлении
ISR(_VECTOR(TIMER0_OVF_vect))в листинге нет зарегестрированных прерываний, а при
ISR(_VECTOR(17))прерывание регистрируется, но по адресу 0х44, хотя в описании сказано, что адрес переполнения TIMER0 - 0x22 ?
CODE
timer0.o: file format elf32-avr
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 4a 00 jmp 0x94 ; 0x94 <__ctors_end>
4: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
8: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
c: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
10: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
14: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
18: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
1c: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
20: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
24: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
28: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
2c: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
30: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
34: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
38: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
3c: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
40: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
44: 0c 94 6b 00 jmp 0xd6 ; 0xd6 <__vector_17>
48: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
4c: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
50: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__bad_interrupt>
Вопрос - что не так?