Прерывания микроконтроллера ATmega16
Прерывание прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая обеспечит возврат в основную программу и восстановление предварительно сохраненного счетчика команд.
Микроконтроллеры AVR имеют многоуровневую систему приоритетных прерываний. Младшие адреса памяти программ отведены под таблицу векторов прерывания. Каждому прерыванию соответствует адрес в этой таблице. Положение вектора в таблице также определяет и приоритет соответствующего прерывания: чем меньше адрес, тем выше приоритет прерывания.
В микроконтроллерах семейства Mega положение таблицы векторов прерывания может быть изменено. Таблица может располагаться не только в начале памяти программ, а также в начале области загрузчика.
Распределение адресов таблицы векторов прерываний для микроконтроллера ATmega16 приведено в табл. 28.1.
Таблица 28.1
Таблица векторов прерываний модели ATmega16
№
|
Адрес
|
Источник
|
Описание
|
1
|
$0002
|
INT0
|
Внешнее прерывание 0
|
2
|
$0004
|
INT1
|
Внешнее прерывание 1
|
3
|
$0006
|
TIMER2 COMP
|
Совпадение таймера/счетчика Т2
|
4
|
$0008
|
TIMER2 OVF
|
Переполнение таймера/счетчика Т2
|
5
|
$000A
|
TIMER1 CAPT
|
Захват таймера/счетчика Т1
|
6
|
$000C
|
TIMER1 COMPA
|
Совпадение «А» таймера/счетчика Т1
|
7
|
$000E
|
TIMER1 COMPB
|
Совпадение «В» таймера/счетчика Т1
|
8
|
$0010
|
TIMER1OVF
|
Переполнение таймера/счетчика Т1
|
9
|
$0012
|
TIMER0OVF
|
Переполнение таймера/счетчика Т0
|
10
|
$0014
|
SPI, STC
|
Передача по SPI завершена
|
11
|
$0016
|
USART,RXC
|
USART, прием завершен
|
12
|
$0018
|
USART,UDRE
|
Регистр данных USART пуст
|
13
|
$001A
|
USART,TXC
|
USART, передача завершена
|
14
|
$001C
|
ADC
|
Преобразование АЦП завершено
|
15
|
$001E
|
EE_RDY
|
EEPROM, готово
|
16
|
$0020
|
ANA_COMP
|
Аналоговый компаратор
|
17
|
$0022
|
TWI
|
Прерывание от модуля TWI
|
18
|
$0024
|
INT2
|
Внешнее прерывание 2
|
19
|
$0026
|
TIMER0 COMP
|
Совпадение таймера/счетчика Т0
|
20
|
$0028
|
SPM_RDY
|
Готовность SPM
|
Если прерывания в работе микроконтроллера не предусматриваются, то на месте таблицы векторов прерываний может быть размещена часть основной программы.
Для глобального разрешения/запрещения прерываний предназначен флаг I регистра SREG. Для разрешения прерываний он должен быть установлен в «1», а для запрещения сброшен в «0». Индивидуальное маскирование прерываний производится установкой/сбросом соответствующих разрядов регистров масок прерываний.
При возникновении прерывания флаг I регистра SREG аппаратно сбрасывается, запрещая тем самым обработку следующих прерываний. Однако в подпрограмме обработки прерывания этот флаг можно снова установить в «1» для разрешения вложенных прерываний. При возврате из подпрограммы обработки прерываний (команда RETI) флаг I устанавливается аппаратно.
Все имеющиеся прерывания можно разделить на два типа. Прерывания первого типа генерируются при наступлении некоторого события, в результате которого устанавливается флаг прерывания. Затем, если прерывание разрешено, в счетчик команд загружается адрес вектора соответствующего прерывания. При этом флаг прерывания аппаратно (или программно) сбрасывается.
Прерывания второго типа не имеют флагов прерываний и генерируются в течение всего времени, пока присутствуют условия, необходимые для этого. Соответственно, если условия, вызывающие прерывание, исчезнут до разрешения прерывания, генерации прерывания не произойдет.
Микроконтроллеры семейства Mega поддерживают очередь прерываний, которая работает следующим образом: если условия генерации одного или более прерываний возникают в то время, когда флаг общего разрешения прерываний сброшен, соответствующие флаги устанавливаются в «1» и остаются в этом состоянии до установки флага общего разрешения прерываний. После разрешения прерываний, выполняется их обработка в порядке приоритета.
Наименьшее время отклика для любого прерывания составляет 4 машинных цикла, в течение которых происходит сохранение счетчика команд в стеке. В течение последующих двух или трех циклов выполняется команда перехода к подпрограмме обработки прерывания. Если прерывание произойдет во время выполнения команды, длящейся несколько циклов, то генерация прерывания произойдет только после выполнения этой команды. Если же прерывание произойдет во время нахождения микроконтроллера в «спящем» режиме, время отклика увеличивается еще на 4 машинных цикла.
Возврат в основную подпрограмму занимает 4 машинных цикла, в течение которых происходит восстановление счетчика команд из стека. После выхода из прерывания процессор всегда выполняет одну команду основной программы, прежде чем обслужить любое отложенное прерывание.
|