Цитата(Metal_Heart @ Jan 7 2010, 22:38)

оптимизация -O0
Раз уж вы только начали - во избежание дурацких недоразумений в дальнейшем - никогда не используйте -O0. хотя бы -O1, а вообще для AVR лучше всего в 99% случаев -Os.
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

Набросал код для мигания лампочкой через обыкновенную задержку - работает,
а через таймер - нет!
Дайте, пожалуйста, свое определение понятия "не работает".
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

Долго ковырялся и выяснил, что при срабатывании прерывания от таймера проц перезапускается:
Или он перезапускается по собаке если прерывания не вызываются и собака не сбрасывается.
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

Код
#define __AVR_AT90CAN128__
Этого делать не нужно. Этот макрос определяет сам компилятор по ключу -mmcu=
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

Код
//ISR(_VECTOR(TIMER0_OVF_vect)) //TIMER0_OVF_vect or 17
ISR(_VECTOR(17))
Никогда не используйте "магические цифры". Лучше потратьте какое-то время на выяснение, почему не работает с символьными именами. Сэкономите себе кучу времени и нервов в будущем при сопровождении проекта.
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

почему при объявлении
ISR(_VECTOR(TIMER0_OVF_vect))
в листинге нет зарегестрированных прерываний, а при
ISR(_VECTOR(17))
прерывание регистрируется
Вы перемудрили:
Код
ISR(TIMER0_OVF_vect)
{
}
При таких непонятках помогает вывод в файл исходника после обработки препроцессором:
avr-cpp -mmcu=at90can128 file.c > file.i
Цитата(Metal_Heart @ Jan 7 2010, 22:38)

, но по адресу 0х44, хотя в описании сказано, что адрес переполнения TIMER0 - 0x22 ?
Потому что наш друг Атмел сильно удружил нам всем, решив в своих даташитах считать программную память не в байтах, а в словах. Чем запутал всех и в первую очередь себя (посмотрите как они изворачиваются в описании команды LPM, которая фактически принимает байтовый адрес, и SPM). Разработчики avr-gcc (как, впрочем, и разработчики IAR) на эту хитрость не повелись и продолжают считать память в байтах.