Идентификация источника прерывания в системе может выполняться как программными, так и аппаратными средствами.
В первом случае, источник прерывания фиксируется установкой флажка в каком либо регистре. Поиск этого флажка осуществляет прерывающая программа, путем проверки всех возможных источников прерывания.
Во втором случае каждому источнику прерываний ставится в соответствие определенный адрес программы (вектор прерывания) и по этому адресу программист размещает команду перехода к соответствующей этому источнику подпрограмме обработки прерывания.
Например, контроллер АТ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 становится активным.