Прерывания – это вызовы определенных функций, генерируемые, главным образом, аппаратной частью микроконтроллера. В результате прерывания выполнение программы останавливается, и происходит переход к соответствующей подпрограмме обработки прерывания.
Прерывания бывают внутренними и внешними. Источниками внутреннего прерывания являются встроенные модули микроконтроллера (например, таймер/счетчик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах INT. К примеру, в микроконтроллерах AVR за характер сигналов на выводах INT0/INT1, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR: ISC00 (разряд 0), ISC01 (разряд 1) – для входа INT0; ISC 10 (разряд 2), ISC11 (разряд 3) – для входа INT1 (табл. 3.1 и табл. 3.2).
Таблица 3.1. Выбор способа активизации прерывания по входу INT0
Разряд ISC01
Разряд 1SC00
Описание
Прерывание вызывается по уровню лог. 0 на входе INT0
Прерывание вызывается по ниспадающему фронту сигнала INT0
Прерывание вызывается по нарастающему фронту сигнала INT0
Таблица 3.2. Выбор способа активизации прерывания по входу INT1
Разряд ISC11
Разряд ISC10
Описание
Прерывание вызывается по уровню лог. 0 на входе INT1
Прерывание вызывается по нарастающему фронту сигнала INT1
Прерывание вызывается по ниспадающему фронту сигнала INT1
В микроконтроллерах AVR всем прерываниям, включая сброс, поставлен в соответствие собственный вектор прерывания – адрес в начальной области памяти программ, по которому компилятор размещает команду перехода к подпрограмме обработки прерывания. Перечень векторов прерывания в некоторых моделях микроконтроллеров AVR может выглядеть следующим образом (табл. 3.3). В микроконтроллерах AVR все прерывания имеют одинаковый приоритет, и в случае одновременного возникновения двух прерываний первым обрабатывается прерывание с меньшим номером вектора.
Таблица 3.3. Векторы прерываний
Адрес в
памяти
программ
Источник прерывания
Описание
0x0000
RESET
Сигнал сброса
0x0001
INT0
Внешний запрос на прерывание по входу INT0
0x0002
INT1
Внешний запрос на прерывание по входу INT1
0x0003
Т/С1
Захват по таймеру/счетчику Т/С1
0x0004
Т/С1
Совпадение с регистром сравнения А таймера Т/С1
0x0005
Т/С1
Совпадение с регистром сравнения В таймера Т/С1
0x0006
Т/С1
Переполнение таймера/счетчика Т/С1
0x0007
Т/С0
Переполнение таймера/счетчика Т/С0
0x0008
SPI
Завершение передачи данных по интерфейсу SPI
0x0009
UART
Прием байта приемопередатчиком UART завершен
0х000А
UART
Регистр данных приемопередатчика UART пуст
0x000В
UART
Передача данных приемопередатчиком UART завершена
0х000С
ANA_COMP
Прерывание от аналогового компаратора
В момент возникновения прерывания в стек помещается адрес возврата – адрес команды, которая должна быть выполнена первой после выхода из подпрограммы обработки прерывания. В результате выполнения последней ассемблерной команды подпрограммы обработки прерывания (для микроконтроллеров AVR – это команда reti, а для микроконтроллеров PIC – retfie) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается.