Прерывания Прерыванием называется переход на подпрограмму обслуживания внешнего (периферийного) устройство по сигналу (запросу) от этого устройства. 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 . . 34 0010(Н) . . 0044(Н) INT7 . . SMP READY Внешнее прерывание 7 Готовность записи в память программ 1.2. Управляющие регистры Регистр EIMSK – разрешения/запрещения внешних прерываний. Формат: 7 6 5 4 3 2 1 $39($59) INT7 INT6 INT5 INT4 INT3 INT2 INT1 0 INT0 EIMSK Если n-ый разряд регистра установлен в 1 и флаг I регистра SREG также установлен в 1, то прерывание по входу INTn разрешено. Регистры EICRA и EICRB – задания уровня и фронта сигнала прерывания. Формат: 7 $6А ISC31 7 $3A($5A) ISC71 ISC30 6 ISC70 ISC21 5 ISC61 ISC20 ISC11 ISC10 ISC01 0 ISC00 EICRA 4 ISC60 3 ISC51 2 ISC50 1 ISC41 0 ISC40 EICRB Условия генерации запроса на прерывание: ISCn1 ISCn0 Описание 0 0 Низкий уровень на INTn 1 1 По переднему фронту на INTn 1 0 По заднему фронту на INTn где n – номер внешнего прерывания. Регистр EIFR – индикация возникновения внешних прерываний. Формат: $38($58) 7 INTF7 INTF6 INTF5 INTF4 INTF3 INTF2 INTF1 0 INTF0 При возникновении запроса на входе INTn соответствующий флаг INTFn устанавливается в 1. Флаг сбрасывается аппаратно, при запуске подпрограммы обработки прерывания. Пример программы с подпрограммой обработки прерывания: Адрес 0000 0002 0004 RESET: JMP RESET JMP E_INT0 ; Инициализация стека 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).