Разработка программ с использованием прерываний
В общем случае запрос на прерывание во время работы МК приводит к временной остановке выполнения основной программы и передаче управления специальной подпрограмме обслуживания прерывания (ПОП), в которой реализуется реакция на событие, вызвавшее запрос прерывания. По окончании работы ПОП выполнение основной программы должно возобновляться с того момента, в который она была прервана по запросу прерывания.
В системе прерываний МК Atmega128A имеется 34 источника прерываний, восемь из которых являются внешними по входам INT0…INT7. Рассмотрим работу системы прерываний от внешних источников.
Любой запрос на прерывание вызывает установку флага прерывания, соответствующего источнику прерывания, вызвавшего запрос. Для внешних прерываний МК Atmega128A данные флаги расположены в регистре ввода-вывода EIFR, структура которого показана на рис. 3.21.
| ||||||||||||||||||||||||||||||||||||
Рис. 3.21. Регистр флагов внешних прерываний EIFR |
Как правило, из всех потенциально возможных источников прерывания используются только те, которые необходимы для реализации алгоритма решения прикладной задачи. Поэтому в МК Atmega128A имеется возможность программного запрета (маскирования) прерываний от конкретного источника прерывания в том случае, когда их обработка по каким либо причинам не требуется. Прерывания от каждого из указанных выше источников могут быть независимо разрешены или запрещены с использованием специального регистра EIMSK, структура которого приведена на рис. 3.22.
| ||||||||||||||||||||||||||||||||||||
Рис. 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.
| ||||||||||||||||||||||||||||||||||||
Рис. 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.
| ||||||||||||||||||||||||||||||||||||
Рис. 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.