Прерывания
Прерыванием называется переход на подпрограмму обслуживания внешнего (периферийного) устройство по сигналу (запросу) от этого устройства.
1. Основные элементы системы прерываний
1.1. Таблица векторов прерываний
Область флэш-памяти программы в диапазоне 0000(Н) .. 0045(Н) отведена под таблицу векторов прерываний. Она состоит из 34 элементов по две шестнадцатиразрядные ячейки каждый. Элемент может хранить команду безусловного абсолютного перехода на подпрограмму обработки прерывания. Номер элемента в таблице или вектор жестко закреплен за определенным периферийным устройством, а точнее за запросом от этого устройства.
Фрагмент таблицы векторов:
Вектор | Адрес | Источник | Условие возникновения прерывания |
1 | 0000(Н) | Reset | Внешний сброс |
2 | 0002(Н) | INT0 | Внешнее прерывание 0 |
3 | 0004(Н) | INT1 | Внешнее прерывание 1 |
. . | . . | . . | |
6 | 000A(Н) | INT4 | Внешнее прерывание 4 |
7 | 000C(Н) | INT5 | Внешнее прерывание 5 |
9 | 0010(Н) | INT7 | Внешнее прерывание 7 |
. . | . . | . . | |
34 | 0044(Н) | SMP READY | Готовность записи в память программ |
1.2. Управляющие регистры
Регистр EIMSK – разрешения/запрещения внешних прерываний.
Формат:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
$39($59) | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 | EIMSK |
Если n-ый разряд регистра установлен в 1 и флаг I регистра SREG также установлен в 1, то прерывание по входу INTn разрешено.
Регистры EICRA и EICRB – задания уровня и фронта сигнала прерывания.
Формат:
7 | 0 | ||||||||
$6А | ISC31 | ISC30 | ISC21 | ISC20 | ISC11 | ISC10 | ISC01 | ISC00 | EICRA |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
$3A($5A) | ISC71 | ISC70 | ISC61 | ISC60 | ISC51 | ISC50 | ISC41 | ISC40 | EICRB |
Условия генерации запроса на прерывание:
ISCn1 | ISCn0 | Описание |
0 | 0 | Низкий уровень на INTn |
1 | 1 | По переднему фронту на INTn |
1 | 0 | По заднему фронту на INTn |
где n – номер внешнего прерывания.
Регистр EIFR – индикация возникновения внешних прерываний.
Формат:
7 | 0 | |||||||
$38($58) | INTF7 | INTF6 | INTF5 | INTF4 | INTF3 | INTF2 | INTF1 | INTF0 |
При возникновении запроса на входе INTn соответствующий флаг INTFn устанавливается в 1. Флаг сбрасывается аппаратно, при запуске подпрограммы обработки прерывания.
Пример программы с подпрограммой обработки прерывания:
Адрес | ||
0000 | JMP RESET | |
0002 | JMP E_INT0 | |
0004 | RESET: | ; Инициализация стека LDI R16, high (RAMEND) OUT SPH, R16 LDI R16, low (RAMEND) OUT SPL, R16 |
; Инициализация регистров EICRA и EICRB . . | ||
; Инициализация регистра EIMSK . . | ||
; Инициализация бита I регистра SREG SEI | ||
. . | ||
Основная программа | ||
. . | ||
E_INT0: | ; n/n обработки прерывания INT0 PUSH SREG ; БлокPUSH RUSH R0 . . PUSH R31 . . тело подпрограммы . . POP R31 POP SREG SEI RETI |
Порядок обработки прерывания
При поступлении запроса на прерывание, процессор завершает очередную команду и сохраняет в стек адрес следующей команды основной программы (адрес возврата). Управление передается на вектор соответствующий запросу прерывания. Выполняется команда JMP, хранящаяся в элементе таблицы векторов и осуществляется переход на подпрограмму обработки прерывания. Бит разрешения прерываний I регистра SREG сбрасывается, запрещая обработку последующих прерываний.
Подпрограмма начинается блоком команд PUSH сохраняющим в стек содержимое регистров процессора используемых в подпрограмме. В том числе, и регистра флагов SREG. Перед окончанием подпрограммы прерывания, необходимо восстановить содержимое этих регистров из стека (блок РОР) в порядке обратном их записи. Далее необходимо разрешить прерывания (команда SEI) и записать из стека в счетчик команд адрес возврата (команда RETI).


