Прерывания

реклама
Прерывания
Прерыванием называется переход на подпрограмму обслуживания внешнего (периферийного) устройство по сигналу (запросу) от этого устройства.
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).
Скачать