Управление системой прерываний
Тема 23. Система прерываний.
Назначение системы прерываний
Важным элементом микроконтроллера является система прерываний. Система прерываний присутствует в любом современном микроконтроллере. Она также есть во всех микроконтроллерах AVR. Как уже говорилось, система прерываний микроконтроллера обслуживает несколько источников прерываний. Количество источников прерываний для разных микроконтроллеров различно.
Самое минимальное количество источников прерывания имеет микроконтроллер ATtiny11. Два внутренних источника прерываний (от таймера/счетчика и от встроенного компаратора), одно внешнее прерывание по сигналу на входе INT0 и одно прерывание по изменению сигналов на любом из входов, которое тоже считается внутренним.
К источникам прерываний фирма Atmel относит также начальный сброс микроконтроллера. Вектор начального сброса обычно также включают в таблицу векторов прерываний. Так что получается, что у микроконтроллера ATtiny 11 имеется четыре внутренних источника прерываний и один внешний. Другие микросхемы серии AVR имеют более сложные системы прерываний.
Самая развитая на сегодняшний день система прерываний — у микроконтроллера ATmegal281. Этот микроконтроллер способен в общей сложности обслуживать 48 внутренних и 17 внешних источников прерываний. Вообще, источниками прерываний служат все встроенные таймеры, компараторы, АЦП, любой последовательный канал, система управления EEPROM. Конкретное количество прерываний можно узнать из табл. 3.1 (графа «Кол-во прерываний Внут / Внешн»).
Управление системой прерываний
Управление системой прерываний осуществляется при помощи специальных регистров ввода-вывода. Определяющим регистром здесь является регистр SREG (регистр состояния системы). Этот регистр предназначен для хранения флагов состояния. Каждый бит регистра — это один из флагов. Седьмой бит регистра состояния называется «флаг I». Это флаг глобального разрешения прерываний. Когда значение этого флага равно нулю, все прерывания в микроконтроллере запрещены.
Для разрешения прерываний нужно установить этот флаг в единицу. Однако чаще всего нам не нужны все виды прерываний одновременно. Для того, чтобы запретить одни прерывания и разрешить другие, применяются так называемые маскирующие регистры (регистры маски).
Это полезно запомнить. Регистр маски — это обычный регистр ввода-вывода, служащий для управления отдельными источниками прерываний. Каждому биту в регистре маски соответствует один источник. Если бит сброшен в ноль, прерывание этого вида запрещено. Если бит установлен в единичное состояние, прерывание разрешено.
В микроконтроллерах AVR применяются два регистра маски. Регистр GIMSK управляет всеми видами прерываний, кроме прерываний от таймеров. В некоторых микроконтроллерах семейства «Mega» этот регистр называется GICR. Для управления прерываниями от таймеров имеется специальный регистр TIMSK.
Кроме регистров маски для управления процессом выполнения прерываний существуют еще два регистра. Это регистры флагов прерываний. Каждый бит такого регистра — это флаг одного из видов прерываний. При поступлении запроса на прерывание флаг устанавливается в единицу. По состоянию флага программа может судить о наличии запроса.
В определенных режимах после установки флага процедура обработки прерывания вызывается автоматически. Сразу после вызова процедуры соответствующий флаг сбрасывается. Микроконтроллеры AVR имеют два регистра флагов: регистр GIFR (обслуживает те же прерывания, что и регистр GIMSK) и регистр TIFR (флаги прерываний от таймеров).
Алгоритм работы системы прерываний.
Общий алгоритм работы системы прерываний следующий. После сброса микроконтроллера все прерывания запрещены (флаги разрешения сброшены). Если программист планирует использовать один из видов прерываний, он должен предусмотреть в своей программе включение этого прерывания.
Для включения прерывания программа должна установить флаг I регистра SREG в единицу и записать в регистры маски такой код, который разрешит лишь нужные в данный момент прерывания. Разрешив, таким образом, прерывания, программа приступает к выполнению своей главной задачи.
При поступлении запроса на прерывание устанавливается флаг соответствующего прерывания. Флаг устанавливается даже в том случае, если прерывание запрещено. Если прерывание разрешено, то микроконтроллер приступает к его выполнению. Текущая программа временно приостанавливается, и управление передается на адрес соответствующего вектора прерывания.
В тот же момент флаг I автоматически сбрасывается, запрещая обработку других прерываний. Флаг, соответствующий вызванному прерыванию, также сбрасывается, сигнализируя о том, что микроконтроллер уже приступил к его обработке. Подпрограммы обработки прерывания обязательно должны оканчиваться командой возврата из прерывания (RETI). По этой команде управление передается в ту точку основной программы, в которой прервалась ее работа. Флаг I при этом автоматически устанавливается в единицу, разрешая новые прерывания.
Следует заметить, что без принятия специальных мер невозможны вложенные прерывания. Пока обрабатывается одно прерывание, все остальные прерывания запрещены. Однако ни одно прерывание не остается без обработки. При получении запроса на прерывание соответствующий флаг обязательно будет установлен. В этом состоянии он будет находиться до тех пор, пока данное прерывание не будет обработано.
После окончания обработки очередного прерывания происходит проверка остальных флагов, и если имеется хоть одно необработанное прерывание, микроконтроллер переходит к его обработке. Если необработанных прерываний окажется несколько, то применяется закон приоритетов. Из всех прерываний выбирается то прерывание, приоритет которого выше. Чем меньше адрес вектора прерывания, тем выше его приоритет.
И в заключении, в качестве примера, приведу таблицу векторов прерываний для микроконтроллеров семейства «Ttiny» (см. табл. 3.3).
Адреса векторов прерываний микроконтроллеров семейства «Tiny» Таблица 3.3
Источник | Описание | Tiny11x | Tiny12x | Tiny15x | Tiny28x |
INT0 | Внешнее прерывание 0 | $001 | $001 | $001 | $001 |
INT1 | Внешнее прерывание 1 | - | - | - | $002 |
PIN_CANGE | По изменению сигнала на любом из выводов | $002 | $002 | $002 | - |
LOW_LEVEL | По низкому уровню на входе порта В | - | - | - | $003 |
TIMER1 COMPA | По совпадению показаний таймера/счетчика Т1 с содержимым контрольного регистра | - | - | $003 | - |
TIMER1 OVF | Переполнение таймера/счетчика Т1 | - | - | $004 | - |
TIMER0 OVF | Переполнение таймера/счетчика Т0 | $003 | $003 | $005 | $004 |
EE_RDY | По готовности EEPROM | - | $004 | $006 | - |
ANA_COMP | По сигналу от аналогового компаратора | $004 | $005 | $007 | $005 |
ADC | По завершению преобразования вАЦП | - | - | $008 | - |