Сообщение от roma9112
|
Может я не прав, но обычно область с адресами прерываний не особенно пользуют когда прерывания не нужны, наверное, что бы если МК попадет туда, то не ушел бы в неведомыю даль.
|
Если какие-то прерывания не нужны или их совсем ни одного не надо то просто перед rjmp xxxx ставлю nop - если контроллер сюда и попадает то просто ничего не делая идет безопасно вниз опять на свою прогу , и не надо reti даже приписывать , если надо включить какую нибудь обработку прерывания то просто убираю этот nop и по оставшемуся rjmp начинает все лбрабатываться нормально , так что reti совсем не нужно ставить чтобы не тратить лишних тактов в заход в прерывание и тут же выход из него .Саму таблицу с записями векторов оставляю на месте - от ее удаления места микроскопически мало освобождается , при обьеме прог к примеру от 2000 строк до 50000 строк асма эти несколько десятков освободившихся строчек как укус комара слону ,свободного места не прибавляют , так что ее просто оставляю на месте , забив все ненужные прерывания nop -ом , и теперь даже если в программе выходы в эти прерывания и где-то по недосмотру случайно и останутся включенные (по включающим флагам в соответствующих регистрах) - то ничего все равно не происходит , где nop -ы там вся обработка выключена и никаких уходов вдаль и подвисаний на этом нет .
После .org 0x0000 далее адреса каждого из векторов можно и не указывать - по таблице датачета на этот AVR они и так потом идут по порядку на каждый следующий адрес по умолчанию .
;================================================= =======================
.cseg ; Начало кодового сегмента
.org 0x0000
rjmp RESET ; Обработка сброса (включен)
nop ;rjmp EXT_INT0 ; внешнее прерывание IRQ0 (выключен)
nop ;rjmp EXT_INT1 ; внешнее прерывание IRQ1 (выключен)
rjmp TIM1_CAPT ; Обработка захвата таймера/счетчика T1 (включен)
rjmp TIM1_COMPA ; Совпадение А таймера/счетчика T1 (включен)
rjmp TIM1_COMPB ; Совпадение В таймера/счетчика T1(включен)
rjmp TIM1_OVF ; Обработка переполнения таймера/счетчика T1(включен)
nop ;rjmp TIM0_OVF ; Обработка переполнения таймера/счетчика T0 (выключен)
nop ;rjmp SPI_STC ; Передача по SPI завершена (выключен)
nop ;rjmp USART_RXC ; USART RX прием завершен(выключен)
nop ;rjmp USART_UDRE ; Регистр данных USART пуст(выключен)
nop ;rjmp USART_TXC ; USART TX Передача завершена(выключен)
rjmp ANA_COMP ; Обработка прерывания аналогового (включен)компаратора
rjmp EXT_INT2 ; Обработка внешнего прерывания IRQ2(включен)
rjmp TIM0_COMP ; Обработка совпадения (включен)таймера/счетчика T0
rjmp EE_RDY ; EEPROM готово(включен)
rjmp SPM_RDY ; Store Program memory-готово(включен)
;=======================================
RESET:
;инициализация стека
ldi R16,high(RAMEND)
out SPH,temp
ldi R16,low(RAMEND)
out SPL,temp
.......
Вот примерно применительно к Вашему куску проги , что там конкретно в точности надо выключите или включите там сами .
Сами подпрограммы обработок прерывания можете распололжить в самом конце всей проги за пределами цикла основной программы , вместе м обычными подпрограммами , так легче дописывать , изменять и переносить куски подпрограмм с одного кристалла AVR-а на другой к примеру .
общее начало...
Ваша таблица векторов ,начальная инициализация и прочее....
начало основной программы , или одной из нескольких постоянно выполняемых....
A1:
...
...
...
rjmp A1 ;конец основной программы
А далее идут уже все остальные подпрограммы
B1:
...
ret
B2:
...
ret
EXT_INT0: ;подпрограммы обработки прерываний могут быть с любыми
; именами ,помимо тех что предлагает датачет , хоть "дядя Вася"
; но всегда метка здесь в подпрограмме обработки прерывания
; и в таблице с rjmp-ами должны в точности совпадать ,чтобы
; AVR "не ушел вдаль" непонятно куда , и к тому же располагать
; сами подпрограммы обработки прерывания здесь уже можно в
;любом порядке как удобно друг за другом или даже в перемежку с
;обычными подпрограммами .
...
reti
TIM1_CAPT: ;не по порядку таблицы
...
reti
EXT_INT1:
...
reti
VASYA1: ;обычная подпрограмма ,"Вася" например
...
ret
TIM1_COMPA:
....
reti
TIM1_COMPB:
....
reti
;ну и так далее пока еще хватит памяти микроконтроллера и Вашей фантазии что он там еще должен выполнять .