AVR ATmega64 с использованием двух 8-битных таймеров - PullRequest
0 голосов
/ 07 января 2012

Я хотел бы использовать оба 8-разрядных таймера микроконтроллера ATmega 64 .

Я использовал следующий код для объявления их прерываний сравнения:

.org 0x0012 ; Timer2  8 bit counter
     rjmp TIM2
.org 0x001E ; Timer0 8 bit counter
    rjmp TIM1

Я заметил, что если я ввожу первое прерывание (0x0012), второй таймер не работает ... его прерывание никогда не генерируется.Почему это происходит и как мне это решить?

Я тоже замечаю что-то странное.Если я изменим их порядок, я получу ошибку:

Ошибка 3 Перекрытие в .cseg: addr = 0x1e конфликтует с 0x1e: 0x1f

1 Ответ

4 голосов
/ 23 января 2012

На ATmega другие прерывания блокируются во время выполнения любого вектора прерывания.

Это полезная функция по разным причинам. Это предотвращает прерывание прерывания самого себя, предотвращает потенциальное переполнение стека из-за рекурсии и позволяет выделить специальные регистры специально для использования в прерываниях с малой задержкой без необходимости их предварительного сохранения, а также гарантирует, что обработчик является атомарным, среди других причин .

Однако иногда полезно явно использовать повторяющиеся прерывания, особенно на ATmega, в которой отсутствуют уровни приоритета прерываний. Для этого просто добавьте инструкцию SEI, чтобы установить флаг разрешения прерывания.

Вы должны быть очень осторожны, чтобы избежать проблем, упомянутых выше, делая это. Как правило, это означает, что любые используемые регистры должны быть сохранены в стеке, и что само прерывание необходимо отключить до запуска реентерабельной части.

Что касается вашей проблемы с перекрытием адресов, я подозреваю, что проблема в том, что ваш ассемблер подсчитывает свои программные адреса в байтах, тогда как адреса векторов прерываний в таблице данных указываются в словах (например, прерывание сравнения таймера 2 вместо этого будет 0x24 0x12). Вам также необходимо позаботиться о том, чтобы вернуться к основному сегменту кода после завершения определения векторов, иначе любой последующий код просто перейдет к другим векторам.

...