Открываете файл листинга чем нить типа редактора аврстудии или блокнота на крайняк и смотрите созданную таблицу прерываний. И сверяете адреса с даташитом. По умолчанию gcc для всех прерываний делает один обработчик - bad_interrupt. Типа если Вы прерываний не заказывали, то любое прерывание ошибка. Этот обработчик тупо делает безусловный переход на нулевой адрес, по сути перезагружает контроллер. Если Вы описали какой либо обработчик то по адресу соответствующего вектора будет переход к обработчику. У Вас сиё выглядит так:
Код:
|
00000000 ‹__vectors›:
0: 0c 94 4c 00 jmp 0x98 ; 0x98 ‹__ctors_end›
4: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
8: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
10: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
14: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
18: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
1c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
20: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
24: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
28: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
2c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
30: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
34: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
38: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
3c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
40: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
44: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
48: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
4c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
50: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
54: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
58: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
5c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
60: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
64: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
68: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
6c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
70: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
74: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
78: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
7c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
80: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
84: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
88: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
8c: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
90: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt›
94: 0c 94 6b 00 jmp 0xd6 ; 0xd6 ‹__bad_interrupt› |
Это таблица прерываний, везде безусловный переход по адресу 0xD6, там размещен обработчик __bad_interrupt. Выглядит он так:
Код:
|
000000d6 ‹__bad_interrupt›:
d6: 0c 94 00 00 jmp 0 ; 0x0 ‹__vectors› |
Сравните с исправленным проектом и поймете в чем различие, там по одному из адресов таблицы прерываний будет переход к обработчику ISR (TIMER1_COMPA_vect).
Кстати заодно и посмотрите как прерывание отрабатывается. Только вот асм под AVR подучить придётся.