Система прерываний
Исходная система прерываний в архитектуре MCS-51 включает пять источников - два внешних и три внутренних. Система развивается, с появлением микроконтроллеров типа 8052 число источников прерываний в архитектуре семейства постоянно увеличивается и достигло в микроконтроллерах типа 8XC51GP пятнадцати. Некоторые усовершенствования претерпел механизм приоритетов прерываний.
Из пяти источников прерываний внешними являются входы INT0# и INT1#, а внутренними - два счетчика/таймера и последовательный порт. Активные сигналы на входах INT0#, INT1# устанавливают флаги IE0, IE1 регистра TCON. Таймер 0 и Таймер 1 используют для выработки запросов прерываний флаги переполнения TF0, TF1 в регистре управления TCON, а последовательный порт использует для этого два флага - приемника RI и передатчика TI в регистре управления SCON. Каждый из флагов последовательного порта может вызвать прерывание, а конкретный источник определяет процедура обслуживания посредством опроса.
Реакция на любой запрос, разрешенный к обслуживанию, заключается в передаче управления от текущей программы специальной процедуре обслуживания прерывания данного типа. Осуществляется эта передача посредством команды LCALL, код которой не выбирается из памяти, а формируется внутри микроконтроллера. Адрес перехода в архитектуре MCS-51 соответствует вектору прерывания и фиксирован для каждого источника:
Векторы системы прерываний
Источник прерывания | Вектор прерывания |
Внешнее прерывание INT0 | 0003h |
Таймер/счетчик Т/С0 | 000Вh |
Внешнее прерывание INT1 | 0013h |
Таймер/счетчик Т/С1 | 001Вh |
Последовательный порт | 0023h |
Из таблицы видно, что интервал между адресами составляет всего 8 ячеек памяти программ, поэтому по первым четырем адресам может располагаться либо очень короткая процедура, либо команда JMP перехода на область памяти, где находится более длинная процедура обслуживания. По адресу последовательного порта места больше. Если по адресам векторов прерываний находятся команды JMP, то имеет место так называемая таблица переходов системы прерываний.
Когда запрос прерывания принят на обслуживание, выполняется следующая последовательность действий. Текущая команда выполняется до конца. Затем внутренне формируемая команда LCALL сохраняет текущее значение счетчика команд PC (адрес следующей команды) в стеке. Это позволяет после завершения процедуры обслуживания прерывания вернуться в прерванную программу. Далее эта команда загружает в PC адрес-вектор. Сохранение в стеке других регистров микроконтроллера, кроме PC, осуществляется программистом командами PUSH в начале процедуры обслуживания. В конце процедуры должны стоять соответствующие команды выгрузки POP. Этот процесс отдан на усмотрение разработчика, поскольку от объема сохраняемой информации сильно зависит время реакции на прерывание. Процедура обслуживания прерывания завершается командой RETI, которая выгружает из стека адрес возврата и помещает его в PC.
Каждый из источников прерываний может быть разрешен или запрещен с использованием соответствующего бита регистра IE. Кроме того, в этом регистре есть бит общего запрета всех прерываний.
EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
IE
Имя бита | Номер бита | Функция |
ЕА | IЕ.7 | Запрещение запросов от всех источников, имеет место при ЕА=0 |
- | IE.6 | Зарезервирован |
- | IE.5 | Зарезервирован |
ES | IE.4 | Запрещение запроса от последовательного порта, имеет место при ES=0 |
ЕТ1 | IE.3 | Запрещение запроса от Таймера 1, имеет место при ЕТ1=0 |
ЕХ1 | IE.2 | Запрещение запроса по входу INT1#, имеет место при ЕХ1=0 |
ЕТ0 | IE.1 | Запрещение запроса от Таймера 0, имеет место при ЕТ0=0 |
ЕХ0 | IE.0 | Запрещение запроса по входу INT0#, имеет место при ЕХ0=0 |
При появлении запросов от нескольких источников очередность их обслуживания определяется с помощью механизма приоритетов прерываний. В архитектуре MCS-51 имеет место двухступенчатый механизм определения приоритетов. В исходной системе прерываний микроконтроллеров 8051 АН приоритеты на первой ступени имеют два уровня: «высокий» и «низкий», и определяются значениями битов регистра IP.
- | - | - | PS | PT1 | PX1 | PT0 | PX0 |
IP
Имя бита | Номер бита | Функция |
- | IP.7 | Зарезервирован |
- | IP.6 | Зарезервирован |
- | IP.5 | Зарезервирован |
PS | IP.4 | Определяет приоритет последовательного порта |
РТ1 | IP.3 | Определяет приоритет Таймера 1 |
РХ1 | IP.2 | Определяет приоритет входа INT1# |
РТ0 | IP.1 | Определяет приоритет Таймера 0 |
РХ0 | IP.0 | Определяет приоритет входа INT0# |
При «1» в определенном разряде регистра IP приоритет соответствующего источника прерывания высокий, а при «0» - низкий. При одновременном появлении нескольких запросов одного уровня очередность обслуживания определяется с помощью внутренней процедуры поллинга (последовательного опроса), который производится в порядке фиксированного старшинства источников внутри одного уровня приоритета. Этот порядок следующий:
Приоритеты прерываний при поллинге
Источник | Приоритет внутри уровня |
Вход INT0# | Высший |
Таймер 0 | |
Вход INT1# | |
Таймер 1 | |
Последовательный порт | Низший |
Действие механизма приоритетов прерываний заключается в выборе для обслуживания одного из источников при одновременном приходе нескольких запросов, а также в принятии решения о прерывании текущей процедуры обслуживания вновь поступившим запросом. Все источники прерываний проверяются на наличие запроса во время S5P2 каждого машинного цикла (рис.3.9). В течение следующего машинного цикла анализируются биты приоритетов регистра IP и выполняется внутренняя процедура поллинга.
Рис.3.9 - Вызов процедуры обслуживания прерывания
На основе двухступенчатого анализа выбирается запрос с наиболее высоким приоритетом из поступивших. Если какое либо прерывание уже обслуживается, то его процедуру может прервать только прерывание с более высоким приоритетом. Механизм приоритетов прерываний использует два внутренних программно-недоступных флага текущего уровня обслуживания (первой ступени). Прием на обслуживание прерывания устанавливает флаг того уровня приоритета, к которому относится запрос. Этот флаг определяет порог чувствительности системы прерываний. Команда RETI в конце процедуры обслуживания очищает флаг своего уровня и, таким образом, ликвидирует порог чувствительности.
Из рис. 3.9 видно, что между запросом и началом процедуры обслуживания проходит не менее трех машинных циклов.
Запрос прерывания не принимается на обслуживание и откладывается на более позднее время при следующих обстоятельствах:
• выполняется процедура обслуживания прерывания с более высоким приоритетом;
• текущий машинный цикл не является последним в цикле команды;
• выполняется команда RETI, команды обращения к регистрам IE, IP или следующие за ними.
В текст процедуры обслуживания любого источника прерывания рекомендуется включить команду сброса флага данного источника.
Особенности запросов внешних прерываний. По входам INT0#, INT1# могут приниматься сигналы запросов, активными значениями которых является либо низкий уровень входного сигнала, либо перепад «1»-«0». Тип активного значения определяется битами IT0, IT1 регистра TCON. При IТх = 0 запрос фиксируется по низкому уровню сигнала на соответствующем входе INTx#, а при ITx - 1 по перепаду.
Если запрос прерывания формируется перепадом сигнала на входе INTx#, высокий и низкий уровни сигнала должны удерживаться не менее одного машинного цикла каждый.
При запросе в виде низкого уровня сигнала активное значение должно удерживаться на входе до начала обработки данного запроса. Далее сигнал должен стать пассивным до завершения процедуры обслуживания.