
- •;Инициализация таймеров
- •; Подпрограмма формирования временной задержки
- •Порядок выполнения работы
- •Бродин в.Г., Шагурин м.И. Микроконтроллеры: архитектура, программирование, интерфейс. Справочник. – м.: эком, 1999, с. 179-182.
- •Бродин в.Б., Калинин а.В. Системы на микроконтроллерах и бис программируемой логики. – м.: эком, 2002, с. 82-87.
- •Подготовка к работе
- •;Подпрограмма кодирования символа клавиши
- •;Подпрограмма временной задержки
- •Порядок выполнения работы
- •Цель работы
- •Аппаратные и программные средства
- •Векторы системы прерываний
- •Подготовка к работе
- •Порядок выполнения работы
- •Краткое описание лабораторной установки
- •Одноплатный контроллер
- •Плата супервизора
- •Интерфейсная плата
Векторы системы прерываний
Источник прерывания |
Вектор прерывания |
Внешнее прерывание INT0 |
0003Н |
Таймер/счётчик Т/С0 |
000ВН |
Внешнее прерывание INT1 |
0013Н |
Таймер/счётчик Т/С1 |
001ВН |
Последовательный порт |
0023Н |
Из таблицы видно, что интервал между адресами составляет всего 8 ячеек памяти программ, поэтому по первым четырем адресам может располагаться либо очень короткая подпрограмма, либо команда перехода на область памяти, где находится более длинная подпрограмма обслуживания. По адресу последовательного порта места больше. Если по адресам векторов прерываний находятся команды передачи управления, то имеет место так называемая таблица переходов системы прерываний.
Когда запрос прерывания принят на обслуживание, выполняется следующая последовательность действий. Текущая команда выполняется до конца. Затем внутренне формируемая команда LCALL сохраняет текущее значение счетчика команд (адрес следующей команды) в стеке: в ячейку стека с младшим адресом загружаются 8 младших разрядов счетчика команд, а в следующую ячейку стека – 8 старших разрядов счетчика команд.
Это позволяет после завершения подпрограммы обслуживания прерывания вернуться в прерванную программу. Далее эта команда загружает в счётчик команд соответствующий вектор. Сохранение в стеке содержимого других регистров микроконтроллера осуществляется программистом командами PUSH в начале подпрограммы обслуживания. В конце подпрограммы должны стоять соответствующие команды выгрузки РОР. Этот процесс отдан на усмотрение разработчика, поскольку от объема сохраняемой информации зависит время реакции на прерывание. Подпрограмма обслуживания прерывания завершается командой RETI.
Команда RETI восстанавливает состояние логики прерывания и загружает в счетчик команд два байта адреса возврата из двух верхних ячеек стека. Восстановление состояния логики прерывания заключается в следующем: при переходе по вектору на подпрограмму обработки прерывания запрещаются все прерывания с уровнем приоритета, равным уровню приоритета обслуживаемого прерывания, независимо от состояния разрядов регистра IE, т. е. вложенные прерывания с равными уровнями приоритета невозможны. Команда RETI снимает этот запрет.
Примечание. При использовании команды RET восстанавливается только состояние счетчика команд, т.е. происходит возврат в прерванную программу. Состояние логики прерывания команда RET не меняет, т. е. логика управления обслуживанием прерываний по-прежнему считает, что продолжает обслуживаться прерывание, подпрограмма обработки которого была закончена командой RET.
Каждый из источников прерываний может быть разрешен или запрещен с использованием соответствующего разряда регистра IE:
Разряды |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Обозначения |
EA |
x |
x |
ES |
ET |
EX1 |
ET0 |
EX0 |
EA – управление всеми источниками прерываний одновременно. Если EA=0, то любые прерывания запрещены. Если EA=1, то прерывания могут быть разрешены индивидуальными разрешениями EX0, ET0, EX1, ET1, ES.
x – резервный разряд.
ES - управление прерыванием от последовательного порта: ES=1- разрешение; ES=0 - запрещение.
ЕХ1 - управление прерыванием от внешнего источника INT1#: ЕХ1=1 - разрешение; ЕХ1=0 - запрещение.
ЕТ0 - управление прерыванием от Т/С0: ЕТ0=1- разрешение; ЕТ0=0 - запрещение.
ЕХ0 - управление прерыванием от внешнего источника INT0#: ЕХ0=1 - разрешение; ЕХ0=0 - запрещение.
При появлении запросов от нескольких источников очередность их обслуживания определяется с помощью механизма приоритетов прерываний. В архитектуре MCS-51 имеет место двухступенчатый механизм определения приоритетов. В исходной системе прерываний приоритеты на первой ступени имеют два уровня: "высокий" и "низкий", и определяются значениями разрядов регистра IP:
Разряды |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Обозначение |
x |
x |
x |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
Назначение разрядов регистра IP следующее:
РХ0 - установка уровня приоритета прерывания от внешнего источника INT0#.
РТ0 - установка уровня приоритета прерывания от Т/С0.
РХ1 - установка уровня приоритета прерывания от внешнего источника INT1#.
РТ1 - установка уровня приоритета прерывания от Т/С1.
PS - установка уровня приоритета прерывания от последовательного порта.
x - резервный разряд.
Действие механизма приоритетов прерываний заключается в выборе для обслуживания одного из источников при одновременном приходе нескольких запросов, а также в принятии решения о прерывании текущей подпрограммы обслуживания вновь поступившим запросом. Все источники прерываний проверяются на наличие запроса во время S5P2 каждого машинного цикла. В течение следующего машинного цикла анализируются разряды приоритетов регистра IP и выполняется внутренняя подпрограмма последовательного опроса.
При "1" в определенном разряде регистра IP приоритет соответствующего источника прерывания высокий, а при "0" - низкий. При одновременном появлении нескольких запросов одного уровня очередность обслуживания определяется с помощью внутренней подпрограммы последовательного опроса, который производится в порядке фиксированного старшинства источников внутри одного уровня приоритета. Этот порядок следующий:
Источник |
Приоритет внутри уровня |
IE0 |
(высший) |
TF0 |
|
IE1 |
|
TF1 |
|
RI+TI |
(низший) |
На основе двухступенчатого анализа выбирается запрос с наиболее высоким приоритетом. Если какое либо прерывание уже обслуживается, то его подпрограмму может прервать только прерывание с более высоким приоритетом. Механизм приоритетов прерываний использует два внутренних программно недоступных флага текущего уровня обслуживания (первой ступени). Прием на обслуживание прерывания устанавливает флаг того уровня приоритета, к которому относится запрос. Этот флаг определяет порог чувствительности системы прерываний. Команда RETI в конце подпрограммы обслуживания очищает флаг своего уровня и, таким образом, ликвидирует порог чувствительности.
Между запросом и началом подпрограммы обслуживания проходит не менее трех машинных циклов.
Запрос прерывания не принимается на обслуживание и откладывается на более позднее время при следующих обстоятельствах:
выполняется подпрограмма обслуживания прерывания с более высоким приоритетом;
текущий машинный цикл не является последним в цикле команды;
выполняется команда RETI, команды обращения к регистрам IE, IP или следующая за ними.
Флаг прерывания, установленный во время действия блокировки прерывания по одному из трех указанных выше условий и сброшенный до их снятия, не вызовет обслуживания соответствующего запроса прерывания.
Алгоритм обработки прерывания при обнаружении запроса прерывания представлен на рис. 1.
Все разряды, которые вызывают прерывания (IE0, IE1, TF0, TF1, RI, TI), могут быть программно установлены или сброшены с тем же результатом, что и в случае их аппаратной установки или сброса. Иными словами, прерывания могут программно вызываться или ожидающие обслуживания прерывания могут программно ликвидироваться. Кроме того, прерывания по INT0#, INT1# могут вызываться программной установкой Р3.2=0 и Р3.3=0.
Если запрос прерывания с более высоким уровнем приоритета зафиксируется во время аппаратного вызова подпрограммы обслуживания, а именно в фазе S5P2 1-го цикла аппаратной команды LCALL, то по окончании процедуры текущего вызова сразу же начнет выполняться процедура аппаратного вызова по поступившему запросу.
В подпрограммы обслуживания любого источника прерывания рекомендуется включить команду сброса флага данного источника.
Особенности запросов внешних прерываний. По входам INT0#, INTl# могут восприниматься сигналы запросов, активными значениями которых является либо низкий уровень входного сигнала, либо перепад "1"-"0". Тип активного значения определяется разрядами IT0, IT1 регистра TCON. При ITx=0 запрос фиксируется по низкому уровню сигнала на соответствующем входе INTx#, а при ITx=1 по перепаду (здесь и далее x=0, 1).
Если запрос прерывания формируется перепадом сигнала на входе INTx#, высокий и низкий уровни сигнала должны удерживаться не менее одного машинного цикла каждый.
При запросе в виде низкого уровня сигнала активное значение должно удерживаться на входе до начала обработки данного запроса. Далее сигнал должен стать пассивным до завершения подпрограммы обслуживания.
Организация системы прерываний на программном уровне заключается в формировании таблицы переходов, создании подпрограмм обслуживания, определении приоритетов источников и начального адреса указателя стека SP.