Таблица 3.1. Выбор способа активизации прерывания по входу INT0
Разряд ISC01 | Разряд 1SC00 | Описание |
0 | 0 | Прерывание вызывается по уровню лог. 0 на входе INT0 |
1 | 0 | Прерывание вызывается по ниспадающему фронту сигнала INT0 |
1 | 1 | Прерывание вызывается по нарастающему фронту сигнала INT0 |
Таблица 3.2. Выбор способа активизации прерывания по входу INT1
Разряд ISC11 | Разряд ISC10 | Описание |
0 | 0 | Прерывание вызывается по уровню лог. 0 на входе INT1 |
1 | 0 | Прерывание вызывается по нарастающему фронту сигнала INT1 |
1 | 1 | Прерывание вызывается по ниспадающему фронту сигнала INT1 |
В ряде микроконтроллеров PIC выбор фронта для активизации прерывания по входу INT определяется состоянием разряда 6 регистра OPTION: лог. 1 в этом разряде соответствует прерывание по нарастающему, а лог. 0 – по ниспадающему фронту сигнала. Для установки этого разряда в языке С обычно используют специальные функции.
В микроконтроллерах 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 | Прерывание от аналогового компаратора |
В микроконтроллерах PIC источники прерывания, кроме RESET, не рассматриваются в отдельности, им обычно соответствует один вектор, а в некоторых моделях – два вектора для прерываний с различной приоритетностью. Определять, какое именно прерывание требует обслуживания, – задача программиста, и многие компиляторы с языка С предоставляют для этой цели готовые функции, освобождающие от необходимости самому "вычислять" источник прерывания.
В момент возникновения прерывания в стек помещается адрес возврата – адрес команды, которая должна быть выполнена первой после выхода из подпрограммы обработки прерывания. В результате выполнения последней ассемблерной команды подпрограммы обработки прерывания (для микроконтроллеров AVR – это команда reti, а для микроконтроллеров PIC – retfie) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается.
В микроконтроллерах AVR за управление прерываниями отвечают, главным образом, четыре регистра:
-GIMSK (General Interrupt Mask Register) – разрешает или запрещает внешние прерывания по входу INT0/INT1;
-GIFR (General Interrupt Flag Register) – регистрфлаговвнешнихпрерываний;
-TIMSK (Timer/Counter Interrupt Mask Register) – регистр маскирования прерываний от таймера/счетчика Т/С0 и Т/С1;
-TIFR (Timer/Counter Interrupt Flag Register) – регистр флагов прерываний от таймеров/счетчиков.
О состоянии прерывания сигнализирует соответствующий флаг, который устанавливается или сбрасывается в регистре флагов. Даже если в регистре маски прерываний установлен соответствующий отдельный разряд разрешения прерывания, то прерывания могут активизироваться только тогда, когда в регистре состояния SREG установлен разряд общего разрешения прерываний I (разряд 7). Если это имеет место, и наступает прерывание, то выполнение программы ответвляется по соответствующему адресу (см. табл. 1.4) и разряд общего разрешения прерываний I в регистре SREG сбрасывается в состояние лог. 0, блокируя тем самым последующие прерывания. Если требуется прервать подпрограмму другим прерыванием, то после входа в подпрограмму обработки прерывания программа пользователя должна установить флаг I в лог. 1.
Вместе с входом в подпрограмму обработки прерывания аппаратно сбрасывается также и соответствующий флаг, вызвавший прерывание. Некоторые флаги прерываний могут быть сброшены самим пользователем посредством установки соответствующего флага в лог. 1.
Регистр GIMSK
Регистр GIMSK (рис. 3.1), расположенный в области ввода/вывода по адресу 0x003В (адрес в SRAM – 0x005В), используется для разрешения внешних прерываний.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INT1 | INT0 | – | – | – | – | – | – |
Рис. 3.1. Структура регистра GIMSK микроконтроллеров AVR
Если разряд INT1/INT0 установлен в лог. 1, то внешнее прерывание по входу INT1/INT0 будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG.
Регистр GIFR
Состояние внешнего прерывания определяется по регистру GIFR (рис. 3.2), который расположен в области ввода/вывода по адресу 0х003А (адрес SRAM – 0х005А).+
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INTF1 | INTF0 | – | – | – | – | – | – |
Рис. 3.2. Структура регистра GIFR микроконтроллеров AVR
Флаг INTF1/INTF0 устанавливается в лог. 1, если возникает внешнее прерывание по сигналу на выводе INT1/INT0. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0.
Регистры TIMSK и TIFR
Регистр TIMSK (рис. 3.3), расположенный в области ввода/вывода по адресу 0x0039 (адрес в SRAM – 0x0059), используется для разрешения прерываний от таймеров/счетчиков.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOIE1 | OCIE1A | OCIE1B | – | TICIE1 | – | TOIE0 | – |
Рис. 3.3. Структура регистра TIMSK микроконтроллеров AVR
Состояние прерываний, имеющих отношение к таймерам/счетчикам микроконтроллеров AVR, определяется по регистру TIFR (рис. 3.4), который расположен в области ввода/вывода по адресу 0x0038 (адрес SRAM – 0x0058).
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
TOV1 | OCF1A | OCF1B | – | ICF1 | – | TOV0 | – |
Рис. 3.4. Структура регистра TIFR микроконтроллеров AVR
Когда разряд TOIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при переполнении Т/С1. В случае переполнения в регистре TIFR устанавливается флаг TOV1.
Если разряд OCIE1A и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра сравнения А с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1 А.
Если разряд OCIE1B и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при совпадении содержимого регистра сравнения В с текущим состоянием Т/С1. В случае совпадения, в регистре TIFR устанавливается флаг OCF1B.
Если разряд TICIE1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при выполнении условия захвата. Когда возникает срабатывание по захвату, в регистре TIFR устанавливается флаг ICF1.
Если разряд TOIE0 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при переполнении таймера/счетчика Т/СО. В таком случае, в регистре TIFR устанавливается флаг TOV0.
Установка в лог. 1 одного из флагов в регистре TIFR приводит к переходу по соответствующему вектору прерывания. При входе в подпрограмму обработки прерывания, флаг в регистре TIFR аппаратно сбрасывается в лог. 0.
В микроконтроллерах PIC управление прерываниями реализовано с помощью регистров специальных функций, и отличается от устройства к устройству. К примеру, в микроконтроллерах PIC12C6x, PIC14000, Р1С16х для этой цели используются регистры INTCON (рис. 3.5), PIE и PIR, а программы обработки прерываний всегда начинают исполняться с адреса 0x004.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
GIE | PEIE | TOIE | INTE | RBIE | TOIF | INTF | RBIF |
Рис. 3.5. Регистр INTCON микроконтроллеров PtC12C6x, PIC14000, Р1С16х
Разряд GIE – это флаг общего разрешения прерываний. Если он установлен в лог. 1, то все немаскированные прерывания разрешены, если же он сброшен в лог. 0, то все прерывания запрещены.
Разряд PEIE регистра INTCON может использоваться в качестве флага разрешения всех прерываний от периферии, определяемых с помощью регистров PIE и PIR.
Флаг TOIE разрешает (лог. 1) или запрещает (лог. 0) прерывания при переполнении таймера TMR0), а флаг TOIF определяет запрос на соответствующее прерывание.
Разряд INTE – флаг разрешения внешнего прерывания по входу INT, а разряд INTF – флаг запроса на прерывания по этому входу. Аналогичное значение, но для порта В имеют разряды RBIE и RBIF.
Регистр PIE содержит флаги разрешения прерываний от периферийных устройств, а регистр PIR – соответствующие флаги запросов на прерывание. Позиции разрядов в этих регистрах для различных микроконтроллеров отличаются.