Система обработки прерываний в МК MCS-51
PAGE 8
Дисциплина «Микроконтроллеры в системах управления», 3-й курс, семестр 6. Модуль 2 Тема 7
Модуль 2 Тема 7 Система обработки прерываний в МК MCS-51
7.1 Назначение и функционирование системы обработки прерываний
Обработка асинхронных событий, которые происходят в произвольные моменты времени, в МК MCS-51, как и в других МП, реализована на основе встроенного контроллера прерываний (последовательность обработки показана на рис. 7.1):
Рисунок 7.1 Общий принцип обработки прерываний
Источники запросов на прерывание для МК MCS-51:
- внешние устройства, которые могут подавать сигналы запроса на прерывание через входы INT0# и INT1# (бинарные датчики, датчики аварийных ситуаций, сигналы готовности данных);
- таймеры, которые при переполнении устанавливают флаги TF0 и TF1;
- последовательный порт UART, который при завершении передачи или приема битовой посылки формирует флаги TI и RI соответственно.
Использование контроллера прерываний позволяет организовать параллельную работу процессора и периферийных устройств (таймеров, UART, внешних схем) таким образом, что эти устройства, работая одновременно с процессором, информируют его об окончании очередного цикла своей работы с помощью сигналов запроса на прерывание.
Логика обработки прерываний в базовом МК MCS-51 показана на рис.7.2.
Обработка внешних сигналов запросов
1. Внешние запросы на прерывание поступают на входы INT0# и INT1#.
2. Фиксация запросов, т.е. установка флагов запроса IE0 и IE1 в регистре TCON происходит в зависимости от значения битов IT0 и IT1 этого же регистра:
- если были установлены IT0 = 0 или IT1 = 0, то постоянно, пока INTx = 0;
- если установлены IT0 = 1 или IT1 = 1, то в момент перепада 1 0 сигнала INT0# или INT1#.
3. Контроллер прерываний формирует аппаратную команду LCALL 0003h или LCALL 0013h соответственно по запросам INT0# или INT1#. Таким образом, происходит вызов процедуры обработки прерывания. По адресу 0003h или 0013h программист должен поместить подпрограмму обработки прерывания или команду JMP <адрес> переход на соответствующую процедуру.
Сброс флагов IE0 и IE1 выполняется аппаратно, если прерывание вызвано срезом сигнала (то есть при настройке IT0=1 и IT1=1). При другой настройке программа должна воздействовать на источник сигналов запроса, чтобы сигналы INT0# и INT1# стали неактивны (т.е. перешли в “1”).
Рисунок 7.2 Логика обработки прерываний в базовом МК MCS-51
Обработка сигналов прерываний от таймеров
1. Сигналы переполнения таймеров фиксируются в битах TF0 и TF1.
2. Контроллер прерываний формирует аппаратную команду LCALL 000Bh или LCALL 001Bh соответственно по запросам TF0 и TF1. Таким образом, происходит вызов процедуры обработки прерывания. По адресу 000Bh или 001Bh программист должен поместить подпрограмму обработки прерывания или команду
JMP <адрес> переход на соответствующую процедуру. Флаги TF0 и TF1 сбрасываются аппаратно при обработке прерывания.
При наличии в составе МК таймера Т2 появляются два дополнительных флага: TF2 флаг переполнения таймера Т2 и EXF2 флаг внешнего события для таймера Т2. При установке любого из флагов будет аппаратно сформирована команда перехода LCALL 002Bh. Эти флаги нужно сбрасывать программно в процедуре обработки прерывания.
Обработка сигналов прерываний от порта UART
1. Сигналы завершения приема и передачи от UART фиксируются в битах RI и TI.
2. Контроллер прерываний формирует аппаратную команду LCALL 0023h (независимо от бита). Таким образом, происходит вызов процедуры обработки прерывания. По адресу 0023h программист должен поместить подпрограмму обработки прерывания или команду JMP <адрес> переход на процедуру.
3. В процедуре обработки нужно программно определять, какой флаг RI или TI вызвал прерывание, и выполнять соответствующие действия.
Флаги TI и RI нужно сбрасывать программно в процедуре обработки.
Прерывания также можно вызвать или отменить программно, поскольку все перечисленные флаги фиксации запросов программно доступны и могут изменяться программой с тем же эффектом, что и аппаратными средствами. Это обычно используют при отладке программного обеспечения.
7.2 Разрешение обработки запросов прерываний
Часто в практических задачах необходимо запретить или разрешить прерывание от тех или иных источников во время выполнения всей программы или отдельных её фрагментов.
Для разрешения обслуживания запросов используют биты регистра разрешения прерываний IE (“Interrupt enable”):
Имя бита |
Назначение бита |
ЕА |
Разрешение / блокировка прерываний. При ЕА = 1 разрешение прерываний определяется битами IE.5 IE.0. При EA = 0 все прерывания запрещены независимо от состояния IE.5 IE.0 |
IE.6 |
Бит IE.6 не используется |
ET2 |
При ET2 = 1 разрешено прерывание от таймера Т2 по флагам TF2 и EXF2. |
ES |
При ES = 1 разрешено прерывание от UART по флагам ТI или RI |
ET1 |
При ET1 = 1 разрешено прерывание от таймера 1 по флагу TF1 |
ЕХ1 |
При EX1 = 1 разрешено внешнее прерывание 1 по входу INT1# (флаг IE1) |
ЕТ0 |
При ET0 = 1 разрешено прерывание от таймера 0 по флагу TF0 |
ЕХ0 |
При EX0 = 1 разрешено внешнее прерывание 0 по входу INT0# (флаг IE0) |
Например, для разрешения прерываний от UART и таймера Т0 нужно объявить двоичное число в соответствии со структурой регистра IE:
init_ie equ 10010010b
и записать это число в регистр IE:
MOV IE, #init_ie
Можно разрешать и запрещать обработку конкретных прерываний индивидуально, например:
SETB EX1 ; разрешить прерывание от сигнала на входе INT1#
CLR ET1 ; запретить обработку прерывания от таймера Т1
7.3 Управление приоритетами обработки прерываний
При работе МК возможная ситуация, когда одновременно поступают запросы на прерывание от разных источников. Во избежание конфликтов в МК реализована двухуровневая аппаратно-программная шкала приоритетов. В соответствии со шкалой контроллер прерываний выбирает источник запроса, который будет обслужен раньше. Выбор делается из разрешенных прерываний. В соответствии с аппаратной шкалой приоритетность обслуживания запросов следующая:
INT0 TF0 INT1 TF1 TI/RI TF2/EXF2.
Для любого из шести источников (TF1, TF0, INT1, INT0, TI или RI, TF2 или EXF2) может быть установлен один из двух уровней приоритета "высокий" или "низкий" программным путем. В случае совпадения приоритетов нескольких источников выбор проводится в соответствии с аппаратной (неизменной) шкалой.
Например, если высокий приоритет задан программистом для INT0 и TF1, то в случае одновременного запроса от этих источников сначала будет обслужен запрос INT0, а потом TF1, и только после этого остальные запросы в порядке TF0-INT1-(TI/RI)-(TF2/EXF2).
Уровень приоритета каждого источника устанавливают битами регистра приоритетов прерываний IP:
Имя бита |
Назначение |
IP.7 и IP.6 |
Биты IP.7 и IP.6 не используются |
PT2 |
При PT2 = 1 установлен высокий приоритет запроса от таймера 2 (флаг TF2-EXF2) |
PS |
При PS = 1 установлен высокий приоритет запроса от UART (флаги TI-RI) |
PT1 |
При PT1 = 1 установлен высокий приоритет запроса от таймера 1 (флаг TF1) |
PX1 |
При PX1 = 1 установлен высокий приоритет внешнего запроса INT1# |
PT0 |
При PT0 = 1 установлен высокий приоритет запроса от таймера 0 (флаг TF0) |
PX0 |
При PX0 = 1 установлен высокий приоритет внешнего запроса INT0# |
Для задания высокого приоритета запросов от таймеров нужно объявить двоичное число в соответствии со структурой регистра IP:
init_ip equ 00001010b
и записать это число в регистр IP:
MOV IP, #init_ip
Можно устанавливать приоритет конкретных прерываний индивидуально, например, для этой же задачи:
SETB PT1
SETB PT0
7.4 Работа системы обслуживания прерываний
Флаги прерываний опрашиваются в каждом машинном цикле. Далее проводится проверка разрешения прерываний и проверка приоритетности. Таким образом, выбирается прерывание, которое нужно обслужить т.е. вызвать нужную подпрограмму для обслуживания прерывания.
Контроллер прерываний аппаратно формирует команду вызова LCALL и загружает ее в регистр команд IR. Один из адресов векторов перехода на подпрограмму обслуживания прерывания используется как адрес вызова.
Вектора перехода образуют участки по восемь байт в памяти программ. На этих участках могут находиться:
- команда JMP для перехода на соответствующую подпрограмму обработки прерывания, или команды условных переходов к нескольким подпрограммам (например, для UART по TI или RI);
- короткая (до восьми байт) подпрограмма обработки прерывания.
Важно: связь конкретного запроса на прерывание с адресом в памяти программ (т.е. с так называемым вектором прерывания) определяется аппаратной структурой ядра контроллера. То есть по определенному запросу всегда делается переход на определенный адрес в памяти программ (см. рис. 7.2). Дальнейшее зависит от программы какие команды, и какие подпрограммы будут выполнены по данному запросу на прерывание.
Например: пусть зафиксирован запрос на прерывание от TF1. Логика перехода к подпрограмме обработки показана на рис. 7.3.
Рисунок 7.3 Пример обработки прерывания от таймера Т1 по флагу TF1
Подпрограмму обработки прерывания обычно начинают командами PUSH. Это нужно для сохранения в стеке содержимого тех регистров, которые используются в подпрограмме (например, PSW, ACC, DPRT и т.д.). Завершают подпрограмму командами POP, с помощью которых восстанавливают содержимое регистров из стека в обратном порядке.
Последней в подпрограмме должна быть команда RETI, по которой в (РС) пересылается адрес возврата в основную программу, сохраненный в стеке, и снимается блокировка обслуженного прерывания. Таким образом, внутри подпрограммы обработки прерывания не может обслуживаться прерывание, которое вызвало данную подпрограмму.
В случае, если необходимо обрабатывать сигналы внешних прерываний от нескольких источников (больше двух), можно воспользоваться простой схемой, показанной на рис. 7.4. В соответствии с ней, при возникновении запроса на прерывание от любого устройства (даже от нескольких одновременно!) будет сформирован единый запрос на входе #INT1. Процедура обработки этого общего запроса должна программным путем провести опрос всех входов Р1.0...Р1.3, определить устройство (или устройства), которое сделало вызов, выбрать источник с высоким приоритетом и провести соответствующую обработку события, которое вызвало прерывание основной программы.
Рисунок 7.4 Пример подключения четырех сигналов запросов
к одному входу сигнала прерывания
Таким образом, эта схема требует реализации протокола обработки прерывания с программным поиском источника. Студентам предлагается самостоятельно разработать программный фрагмент реализации такого протокола.
7.5 Заполнение начальной области памяти программ
Заполнение начальной области памяти программ (ячейки с адресами 0000h 00ххh) должно строго соответствовать принципам функционирования конкретного микропроцессора или микроконтроллера. При этом необходимо принимать во внимание:
- адрес памяти, с которого начинается выборка команд при включении питания или подаче сигнала Reset (в МК MCS-51 это будет адрес 0000h);
- принципы функционирования системы обработки прерываний, в частности, размещение и структуру таблицы векторов перехода на подпрограммы обслуживания прерываний.
Согласно указанным требованиям, заполнение начальной области памяти программ для МК MCS-51 следует выполнять в таком виде (рис. 7.5).
Рисунок 7.5 Принцип заполнения начальной области памяти программ МК
Команда стартового перехода это команда безусловного перехода на метку, которая отмечает первую команду основной программы. Команда стартового перехода размещается в ячейках ПП по адресу 0000h0002h и нужна для обхода таблицы векторов переходов при запуске системы.
Таблица векторов перехода состоит из шести блоков по 8 байт; в каждый блок необходимо записать команду безусловного или условного (например, для прерывания от UART) перехода на нужную подпрограмму. Если подпрограмма обработки прерывания имеет размер не больше, чем восемь байт, она может быть размещена непосредственно в соответствующем блоке в таблице векторов перехода. Таблица векторов перехода занимает область ячеек с адресами 0003H...002FH.
Практически начиная с адреса 0030H можно поместить команды основной программы или таблицы констант, которые используются в алгоритмах. В любом случае первая команда основной программы может быть отмечена меткой, ссылку на которую используют в команде стартового перехода.
Основная программа должна начинаться с таких программных блоков:
- инициализация стека;
- выбор текущего активного банка регистров;
- настройка линий портов на ввод или вывод;
- настройка системы прерываний (разрешение запросов и исходное задание приоритетов);
- настройка таймеров и UART.
Вариант программной реализации таблицы векторов перехода по всем прерываниям МК MCS-51 представлен ниже. Естественно, в конкретных задачах в таблице должны присутствовать только те вектора (команды перехода), для которых формируются запросы прерываний в процессе работы МК-системы.
Показанная структура характерна для событийно-ориентированных программ.
Декларативная и функциональная части программы зависят от условий использования контроллера и решаемых задач.
DSEG ; Начало сегмента данных в РПД МК
org 20h
var1: ds 2 ; Объявление переменной var1 2 байта
. . .
CSEG ; Начало сегмента исполнимого кода
org 0 ; Размещение вектора стартового перехода
jmp start ; Переход на начало основной программы
org 0003h ; Размещение вектора перехода по INT0
jmp proc_INT0 ; Переход на обработчик прерывания INT0
org 000Bh ; Размещение вектора перехода по TF0
jmp proc_T0 ; Переход на обработчик прерывания от таймера Т0
org 0013h ; Размещение вектора перехода по INT1
jmp proc_INT1 ; Переход на обработчик прерывания INT1
org 001Bh ; Размещение вектора перехода по TF1
jmp proc_T1 ; Переход на обработчик прерывания от таймера Т1
org 0023h ; Размещение вектора перехода по TI или RI (УАПП)
jb TI,proc_Trans ; Переход на обработчик прерывания от передатчика
jmp proc_Receive ; Переход на обработчик прерывания от приемника
org 002Bh ; Размещение вектора перехода по TF2/EXF2
jb TF2,proc_T2 ; Переход на обработчик прерывания от TF2
jmp proc_EXF2 ; Переход на обработчик прерывания от EXF2
org 0030h ; Размещение основной программы
start: ; Команды основной программы
mov TMOD, #init_tmod ; Настройка таймеров, УАПП
mov TCON, #init_tcon
mov SCON, #init_scon
mov TL0, #Low(St_T0) ; Стартовые числа для таймеров
mov TH0, #High(St_T0)
mov IE, #init_ie ; Настройка прерываний
setb TR1 ; Включение таймера Т1
...
m1: jmp m1 ; Цикл ожидания событий (прерываний)
Proc_INT0: ; Обработчик прерывания от сигнала INT0
...
Reti
Proc_T0: ; Обработчик прерывания от таймера T0
...
Reti
. . . ; Далее следуют остальные подпрограммы
При создании программ для обработки прерываний удобно вначале составить таблицу событий в МК-системе, содержащую такую информацию:
Описание события Сигнал о событии Действия по обработке события
На основании этой таблицы составляют набор подпрограмм, и затем их связывают с нужными прерываниями через таблицу векторов перехода.
Автор конспекта Джулгаков В.Г., доцент каф. 301, ХАИ
Система обработки прерываний в МК MCS-51