1. Предисловие
Система прерываний AVR - это пожалуй, шедевр в мире контроллеров. Во-первых, она
поддерживает вложенные прерывания. Во-вторых, система управления источниками прерываний
очень гибкая, что позволяет настроить контроллер на управления внешними событиями
так, как вам необходимо.
Если бы в AVR-контроллерах была бы возможность переопределять приоритеты и определять
таблицу векторов прерываний, то они были бы ещё больше похожи на "взрослые"
процессоры. Но даже отсутствие этого не уменьшает восхищения изяществом "решений
ATMEL" (не путать с "решениями Microsoft").
2. Источники прерываний.
В качестве вступления скажу, что все прерывания будут вызываться ТОЛЬКО при установленном флаге I в слове состояния.
2.1. Аппаратный сброс.
Аппаратный сброс контроллера происходит при включении питания, снижении напряжения питания ниже минимально допустимого, срабатывании сторожевого таймера или при подаче логического "0" на вывод #RESET. При сбросе ВСЕГДА вызывается обработчик, находящийся по адресу $0000 и программа "начинает всё сначала", так как при сбросе происходит полная переинициализация всех I/O-регистров. Содержимое регистрового файла и RAM не определено.
2.2. Внешние прерывания.
В AVR-контроллерах в зависимости от модели может быть от 1 до 8 входов внешних
прерываний.
Рассмотрим систему управления внешними прерываниями. Для этого предусмотрены следующие
комбинации I/O-регистров в зависимости от модели (см. соответствующий DataSheet):
- GIMSK, MCUCR, GIFR; - EIMSK, EICR, EIFR; - GIMSK, MCUCR.Первый в каждой из этих групп - это регистр масок прерываний. Контроллер вызывает соответствующий обработчик только если установлен соответствующий бит в регистре масок.
GIMSK, EIMSK, INT0, INT1 - маски соответствующих входов
INT1 | INT0 | - | - | - | - | - | - |
MCUCR, EICR
- | - | SE | SM | ISC11 | ISC10 | ISC01 | ISC00 |
ISCxx - биты управления реакцией на входной сигнал.
ISCx1 | ISCx0 | Вход |
0 | 0 | Уровень "0" |
0 | 1 | Зарезервировано |
1 | 0 | Обратный фронт |
1 | 1 | Прямой фронт |
GIFR, EIFR, INTF0, INTF1 - флаги соответствующих входов
INTF1 | INTF0 | - | - | - | - | - | - |
Пример - настройка прерывания 0 по обратному фронту:
ldi r16,$40 out gimsk,r16 ldi r16,2 out mcucr,r16
2.3. Таймеры-счетчики.
Таймеры-счетчики могут генерировать прерывания по трём видам событий:
- "захват" события;
- сравнение с заданной величиной;
- переполнение.
Маскирование прерываний от таймеров-счетчиков производится с помощью регистра
TIMSK, реализация которого зависит от модели контроллера (см. DataSheets).
Маскирование производится сбросом или установкой соответствующих битов в TIMSK.
Как и в системе внешних прерываний, предусмотрен регистр флагов TIFR.
Управление таймерами-счетчиками более подробно рассмотрено в главе "Таймеры и
ШИМ"
2.4. SPI.
Прерывание "SPI Serial Transfer Complete" ( окончание последовательной передачи по SPI ) разрешается установкой бита SPIE ( SP Interrupt Enable ) в регистре SPCR. При вызове прерывания аппаратно устанавливается флаг SPIF в регистре SPSR. Более подробно об SPI см. в главе "SPI".
2.5. Последовательный порт RS-232.
Прерываниями UART управляет регистр UCR ( UART Control Regiter ). Для этого предусмотрены
следующие биты:
- RXCIE - окончание приёма;
- TXCIE - окончание передачи;
- UDRIE - пустой регистр данных.
Текущее состояние UART при этом доступно из регистра USR ( UART Status Register ).
2.6. АЦП.
Прерывание "ADC Conversion Complete" вызывается по окончании преобразования АЦП, если установлен бит ADIE в регистре ADCSR.
2.7. Готовность EEPROM.
Прерывание "EEPROM Ready" вызывается по окончании записи в EEPROM, если установлен бит EERIE в регистре EECR.
2.8. Компаратор.
Прерывание от аналогового компаратора управляется регистром ACSR.
ACD | - | ACO | ACIF | ACIE | ACIC | ACIS1 | ACIS0 |
ACIS1 | ACIS0 | Событие |
0 | 0 | Изменение состояния выхода |
0 | 1 | Зарезервировано |
1 | 0 | Обратный фронт выхода |
1 | 1 | Прямой фронт выхода |
3. Таблица векторов.
Таблица прерываний расположена по адресу $0000 в памяти программ. По приоритету прерывания
располагаются следующим образом:
1. Аппаратный сброс: #RESET, сторожевой таймер. |
2. Внешние прерывания INTx. |
3. Таймеры-счётчики. |
4. SPI, окончание передачи. |
5. Последовательный порт RS-232. |
6. АЦП. |
7. Готовность EEPROM. |
8. Компаратор. |
4. Обработчики прерываний.
Обработчики прерываний располагаются в памяти программ начиная с адреса $0000. Собственно, это не сами обработчики, а переходы к обработчикам. Например, для ATMega(TM) переходы могут выглядеть так:
;здесь размещаются переходы к обработчикам .org $0000 jmp begin ;точка входа по аппаратному сбросу .org $000A jmp ext_int4 ;внешнее прерывание 4 ;и так далее ;*********************************************************** ;*********************************************************** ;здесь размещаются сами бработчики ext_int4: ;обработчик прерывания ....... reti ;и так далее ;*********************************************************** begin: ...... ;головной модуль
Обратите внимание, что обработчик завершается командой reti, в отличие
от просто процедуры. Для контроллеров, память программ которых меньше 2Кх16,
переход производится командой rjmp, для остальных это может быть jmp.
У каждого источника прерываний в регистре его статуса (или управления) находится флаг прерывания.
Он сбрасывается аппаратно при выходе из обработчика, но может быть сброшен
программно, если записать в него "1".
5. Краткое заключение.
Если вы, работая с контроллером, не можете заставить его вызывать прерывания, проверьте, пожалуйста, есть ли у вас в модуле инициализации такая строчка:
sei ;устанавливаем флаг разрешения прерываний в SREG...
© Берёзкин С.Е., 2001 г.