Разработка программ с использованием прерываний

В общем случае запрос на прерывание во время работы МК приводит к временной остановке выполнения основной программы и передаче управления специальной подпрограмме обслуживания прерывания (ПОП), в которой реализуется реакция на событие, вызвавшее запрос прерывания. По окончании работы ПОП выполнение основной программы должно возобновляться с того момента, в который она была прервана по запросу прерывания.

В системе прерываний МК Atmega128A имеется 34 источника прерываний, восемь из которых являются внешними по входам INT0…INT7. Рассмотрим работу системы прерываний от внешних источников.

Любой запрос на прерывание вызывает установку флага прерывания, соответствующего источнику прерывания, вызвавшего запрос. Для внешних прерываний МК Atmega128A данные флаги расположены в регистре ввода-вывода EIFR, структура которого показана на рис. 3.21.

 
EIFR INTF7 INTF6 INTF5 INTF4 INTF3 INTF2 INTF1 INTF0
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение
Рис. 3.21. Регистр флагов внешних прерываний EIFR

Как правило, из всех потенциально возможных источников прерывания используются только те, которые необходимы для реализации алгоритма решения прикладной задачи. Поэтому в МК Atmega128A имеется возможность программного запрета (маскирования) прерываний от конкретного источника прерывания в том случае, когда их обработка по каким либо причинам не требуется. Прерывания от каждого из указанных выше источников могут быть независимо разрешены или запрещены с использованием специального регистра EIMSK, структура которого приведена на рис. 3.22.

 
EIMSK INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение
Рис. 3.22. Регистр разрешения внешних прерываний EIMSK

Если в разряд INT0…INT7 регистра EIMSK записать логическую единицу, то работа прерываний по данному источнику разрешена, в противном случае − запрещена. Однако данное условие является необходимым, но недостаточным, поскольку прерывания должны быть разрешены и глобально. Делается это установкой в 1 бита I регистра ввода-вывода SREG. Для этого выделена специальная машинная команда – sei. Для сброса этого бита также введена отдельная команда – cli.

Если сигнал на INT0…INT7 вызывает прерывание, то соответствующий флаг INTF0…INTF7 принимает состояние логической единицы. Флаг сбрасывается аппаратно после выполнения процедуры обработки прерывания. Если прерывания INT0…INT7 настроены на генерацию прерывания по уровню, то флаги постоянно находятся в сброшенном состоянии.

Запрос на внешние прерывания возникает при подаче внешних сигналов на выводы INT0…INT7 МК. Эти запросы могут генерироваться по срезу сигнала (1-в-0), фронту сигнала (0-в-1), по низкому логическому уровню, а также по любому изменению уровня на входе (последнее только для INT4-7). Эти установки задаются в специальных регистрах управления внешними прерываниями EICRA (биты INT3…INT0) и EICRB (биты INT7…INT4). Если внешнее прерывание разрешено и настроено на срабатывание при низком уровне сигнала, то прерывание будет инициализироваться постоянно, пока на выводе будет оставаться низкий логический уровень.

На рис. 3.23 приведена структура первого из регистров управления внешними прерываниями – регистра EICRA.

 
EICRA ISC31 ISC30 ISC21 ISC20 ISC11 ISC10 ISC01 ISC00
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение
Рис. 3.23. Регистр управления внешними прерываниями EICRA

Пары разрядов ISC0n, ISC1n, ISC2n и ISC3n данного регистра являются условиями генерации четырех первых внешних прерываний INT0…INT3. В табл. 3.10 приведено соответствие задания уровня или фронта для активации прерывания в зависимости от значения битов регистра EICRA.

Таблица 3.10

ISCn1 ISCn0 Описание
Низкий уровень на INTn генерирует запрос на прерывание
Зарезервировано
Падающий срез на INTn генерирует запрос на прерывание
Нарастающий фронт на INTn генерирует запрос на прерывание

Если выбрано прерывание по низкому логическому уровню, то для генерации прерывания необходимо, чтобы этот уровень оставался неизменным до окончания выполнения текущей инструкции. После разрешения прерывания по уровню, оно будет генерироваться непрерывно до тех пор, пока на входе присутствует низкий уровень. Изменять биты рекомендуется при отключенных прерываниях, путем выставления бита разрешения прерывания в нуль в регистре EIMSK. После изменения битов ISCnm, бит разрешения прерываний можно выставить в единицу. Перед возобновлением работы прерываний необходимо сбросить флаг прерывания путем записи логической единицы во флаг прерывания (INTFn) в регистре EIFR.

На рис. 3.24 приведено представление регистра управления следующими четырьмя внешними прерываниями – EICRB.

 
EICRB ISC71 ISC70 ISC61 ISC60 ISC51 ISC50 ISC41 ISC40
Чтение/запись R/W R/W R/W R/W R/W R/W R/W R/W
Исх. значение
Рис. 3.24. Регистр управления внешними прерываниями EICRB

Пары разрядов ISC4n, ISC5n, ISC6n и ISC7n данного регистра, являются условиями генерации внешних прерываний INT4…INT7. В табл. 3.11 приведено соответствие задания уровня или фронта для активации прерывания в зависимости от значения битов регистра EICRB.

Таблица 3.11

ISCn1 ISCn0 Описание
Низкий уровень на INTn генерирует запрос на прерывание
Любое изменение логического состояния на INTn генерирует запрос на прерывание
Падающий фронт, выявленный по двум выборкам на INTn, генерирует запрос на прерывание.
Нарастающий фронт, выявленный по двум выборкам на INTn, генерирует запрос на прерывание.

Для определения фронтов на выводах INT7…INT4 осуществляется выборка их состояний. Если выбрано прерывание по фронту или изменению уровня, то прерывание будет сгенерировано, если на входе появляется импульс, длительность которого больше одного периода синхронизации. Сделано это для исключения возможности ложного прерывания.

Лабораторная работа № 7

Цель работы. Программирование процедур обработки прерываний от внешнего источника.

Перед выполнением работы установите тумблеры конфигурации стенда в состояние, показанное на рис. 3.25.

Наши рекомендации