Прерывания

Прерыванием называется переход на подпрограмму обслуживания внешнего (периферийного) устройство по сигналу (запросу) от этого устройства.

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).