Вектора прерываний

 

Идентификация источника прерывания в системе может выполняться как программными, так и аппаратными средствами.

В первом случае, источник прерывания фиксируется установкой флажка в каком либо регистре. Поиск этого флажка осуществляет прерывающая программа, путем проверки всех возможных источников прерывания.

Во втором случае каждому источнику прерываний ставится в соответствие определенный адрес программы (вектор прерывания) и по этому адресу программист размещает команду перехода к соответствующей этому источнику подпрограмме обработки прерывания.

Например, контроллер АТmega163 имеет 17 различных источников прерывания: два внешних и 15 внутренних. Практически каждый функциональный узел микроконтроллера является источником прерываний. В процессе работы он имеет возможность прервать выполняемую процессорным ядром программу. Каждое прерывание имеет фиксированный приоритет и отдельный вектор прерывания.

Вектора прерываний занимают в пространстве памяти программы адреса с $0 до $22. Самый младший вектор прерываний (с адресом $0) определен как сигнал сброса. Адрес каждого последующего вектора больше предыдущего на 2. Адреса $2 и $4 присвоены внешним входам запросов на прерывания (Таблица 7.1).

 

Таблица 7.1. Вектора внешних прерываний контроллера ATmega 163

 

Вектор Адрес Обозначение источника Описание источника
$000 RESET Сброс (External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset)
$002 INT0 Внешнее прерывание 0 (External Interrupt 0)
$004 INT1 Внешнее прерывание 1 (External Interrupt 1)

 

Полный список векторов приведен в приложении 2. Приоритет прерываний уменьшается с возрастанием адресов их векторов. Сигнал сброса (Reset) имеет самый высокий приоритет. Далее следуют прерывания от внешних источников, поступающие на контакты INT 0 и INT1 микроконтроллера.

Любое прерывание может быть запрещено (замаскировано) специальными битами в регистрах ввода/вывода микроконтроллера.

Типовая программа обработки векторов внешних прерываний выглядит следующим образом:

.org$0

jmp RESET ; Переход к подпрограмме сброса

jmp EXT_INT0 ; Переход к подпрограмме обработки IRQ0

jmp EXTJNT1 ; Переход к подпрограмме обработки IRQ1

.org $24

main: ; Начало программы пользователя

Для выхода из любой подпрограммы обработки прерывания в системе команд микроконтроллера АТтеда163 предусмотрена специальная команда reti (Interrupt Return), восстанавливающая содержимое программного счетчика из стека. Для правильного функционирования системы прерывания в начале пользовательской программы обязательно должен быть загружен указатель стека.

Внешние прерывания вызываются с контактов INT1 и INT0. Для их обработки и программирования в контроллере задействованы отдельные биты трех регистров:

0 регистра статуса SREG (Status Register),

0 регистра управления процессорным ядром MCUCR (MCU Control Register) и

0 регистра маски прерываний GIMSK (General Interrupt Mask register) (рис. 7.1).

 

 

Биты

SREG $3F($5F)

MCUCR $35 ($55)

GIMSK $3B($5B)

 

Рис. 7.1. Регистры, задействованные в системе прерываний микроконтроллера

ATmega163

 

Прерывания разрешаются только при единичном значении бита глобального разрешения прерываний I (Interrupt) в регистре статуса SREG. Сброс бита I в регистре SREG запрещает все прерывания. Если прерывания разрешены, то при появлении любого запроса бит I в регистре статуса SREG сбрасывается, а все дальнейшие прерывания запрещаются. Программа пользователя может вновь установить этот бит, разрешив вложенные прерывания. Инструкция возвращения из подпрограммы обслуживания прерывания reti также устанавливает бит I в регистре статуса SREG, разрешая дальнейшие прерывания.

Биты ISCxx в регистре MCUCR описывают уровни и фронты прерывающих сигналов на контактах INT0 и INT1.

0 Биты 3, 2 - ISC11, ISC10 (Interrupt Sense Control 1 bit 1 and bit 0): биты активизации входа INT1. Уровень и фронты на ножке INT1, которые инициируют прерывание, определены в таблице 5.6. Импульсы короче одного такта не гарантируют генерирование прерывания.

 

Таблица 7.2. Активизация параметров входа INT1 (INT0)

 

ISC11 (ISC01) ISC10 (ISC00) Описание
Низкий уровень сигнала INT1 (INT0) генерирует запрос на прерывание.
Любое логическое изменение на INT1 (INT0) генерирует запрос на прерывание.
Задний фронт импульса на INT1 (INT0) генерирует запрос на прерывание.
Передний фронт сигнала на INT1 (INT0) генерирует запрос на прерывание.

0 Биты 1,0- ISC01, ISC00 (Interrupt Sense Control 1 bit 1 and bit 0): биты активизации входа INT0. Работают аналогично битам ISC11, ISC10. В регистре маскирования прерываний GIMSK содержатся флаги внешних прерываний. Когда счетчик команд микроконтроллера устанавливается на конкретный вектор прерывания, соответствующий флаг в регистре GIMSK аппаратно сбрасывается. Флаги прерываний можно очистить, записав в соответствующий бит регистра логическую единицу.

0 Бит 7 - INT1: внешнее прерывание INT1 разрешено. Если бит INT1 установлен и бит I в регистре статуса SREG также равен 1, то внешний вход запроса на прерывание INT1 становится активным.

0 Бит 6 - INT0: внешнее прерывание INT0 разрешено. Если бит INT0 установлен и бит I в регистре статуса SREG также равен 1, то внешний вход запроса на прерывание INT0 становится активным.