Листинг программ.
1 часть. Code.asm
$mod52
ORG 0
JMP main
ORG 0BH
JMP INTERRUPT
INTERRUPT:
CLR TR0
MOV TH0, #0FFh
MOV TL0, #000H
MOV A, 31h
RR A
MOV 31h, A
MOV P1, A
CLR A
SETB TR0
RETI
MAIN:
MOV P1, #0F0h
MOV 31h, #0F0h
MOV TL0, #0h
MOV TH0, #0FFh
MOV IE, #10000010b
MOV TMOD, #9h
MOV TCON, #13h
LOOP:
JMP LOOP
END
2 часть. Code.asm
$MOD52
ORG 0h
MAIN:
MOV A, #0h
MOV TMOD, #06h
MOV TCON, #10h
MOV TH0, #0F0h
MOV TL0, #0F0h
LOOP:
MOV A, TL0
MOV P1, A
SJMP LOOP
END
Результат работы.
Рисунок 6. Результат выполнения 1 (Часть 1)
Рисунок 7. Результат выполнения 2 (Часть 1)
Рисунок 8. Результат выполнения 3 (Часть 1)
Рисунок 9. Результат выполнения 4 (Часть 1)
Режим работы Т/С0 – режим 2
Рисунок 10. Результат выполнения 1 (Часть 2)
Рисунок 11. Результат выполнения 2 (Часть 2)
Рисунок 12. Результат выполнения 3 (Часть 2)
ИЗУЧЕНИЕ СИСТЕМЫ ПРИОРИТЕТНЫХ ПРЕРЫВАНИЙ В МИКРОКОНТРОЛЛЕРЕ MCS-51
Цель работы.
1. Ознакомление с организацией системы прерываний в микроконтроллере.
2. Изучение приемов программирования и принципов построения программ обработки прерываний.
Задание на лабораторную работу
1. Построить программу реализации «бегущего огня» согласно лабораторной работе 3 на основе программно-аппаратной задержки. При программировании регистров управления прерыванием обеспечить разрешение прерывания от T/C0 и INT0/. При этом реализовать следующее:
– внешний сигнал прерывания INT0 вызывает программу вывода в порт Р1 «решетки», например, кода 55H.
– изучить отличия формирования сигнала прерывания INT0 по фронту и уровню. Замаскировать прерывание INT0, а затем и прерывание от TF0; объяснить поведение программы (отсутствие индикации).
Изучить режимы обработки запросов прерываний с различными приоритетами. Назначить сигналу INT0 высший приоритет, а сигналу прерывания TF0 от T/C0 – низший. Для наблюдаемости результата в программе обработке прерывания от TF0 вывести некоторый код в порт Р1 и, не выходя из обработки прерывания, выполнять бесконечный цикл этот цикл должен быть прерван по сигналу INT0 с выводом в порт Р1 «решетки» 55H. Убедиться, что программа, запускаемая от таймера/счетчика 0, не прерывается, если назначить сигналу INT0 приоритет, равный или меньше приоритета сигнала прерывания TF0 от T/C0.
Ход работы
В микроконтроллере MCS-51 реализована приоритетная система прерываний, структура которой показана на рис. 13. Обслуживаются запросы на прерывание, поступающие от следующих источников прерывания:
1. Два внешних источника прерывания (запросы должны поступать от внешних устройств на входы INT0, INT1 микроконтроллера).
2. Таймеры/счетчики 0, 1 (при переполнении) и 2 (при переполнении или автозахвате/автозагрузке).
3. Порт последовательной передачи данных (при передаче или приеме очередного байта информации).
Рисунок 13. Схема системы прерываний
Прерывания могут быть запрещены или вызваны пользователем, так как все указанные флаги программно доступны и могут быть установлены/сброшены.
В микроконтроллере имеются два регистра, управляющие разрешением прерываний (IE) и уровнем приоритетов (IP). Форматы этих регистров представлены на рис. 14, 15, а их описание – в табл. 4.1, 4.2. Чтобы прерывание от данного источника произошло, необходимо, во-первых, установить в 1 соответствующий бит разрешения прерывания в регистре IE и, во-вторых, установить в 1 бит общего разрешения прерываний EA. Система прерываний является двухуровневой, т. е. программа обработки прерывания низшего приоритета (0 в соответствующем бите регистра IP) может быть прервана программой обработки прерывания высшего приоритета (1 в соответствующем бите регистра IP).
Рисунок 14. Структура регистра разрешения прерываний IE
Рисунок 15. Структура регистра приоритетов прерываний IP
Таблица 4.1
Бит |
Позиция |
Название и назначение |
EA |
|
Общее разрешение пpеpываний. Сбpасывается пpогpаммно для запpета всех пpеpываний независимо от состояний остальных битов pегистpа IE |
|
IE.6 |
Не используются |
ET2 |
IE.5 |
Разpешение пpеpывания от таймеpа/счетчика 2 от флага TF2 или EXF2 |
ES |
IE.4 |
Разpешение пpеpывания от последовательного порта от флага TI или RI |
ET1 |
IE.3 |
Разpешение пpеpывания от таймеpа/счетчика 1 от флага TF1 |
EX1 |
IE.2 |
Разpешение внешнего пpеpывания от входа INT1 |
ET0 |
IE.1 |
Разpешение пpеpывания от таймеpа/счетчика 0 от флага TF0 |
EX0 |
IE.0 |
Разpешение внешнего пpеpывания от входа INT0 |
Если установленный в регистре IP приоритет разных источников прерываний одинаков, то при одновременном возникновении запросов управление получает программа обработки прерывания с меньшим номером соответствующего разряда в регистре IE.
Таблица 4.2
Бит |
Позиция |
Название и назначение |
|
IP.7, IP.6 |
Не используются |
ET2 |
IP.5 |
Приоритет пpеpывания от таймеpа/счетчика 2 от флага TF2 или EXF2 |
ES |
IP.4 |
Приоритет пpеpывания от последовательного порта от флага TI или RI |
ET1 |
IP.3 |
Приоритет пpеpывания от таймеpа/счетчика 1 от флага TF1 |
EX1 |
IP.2 |
Приоритет внешнего пpеpывания от входа INT1 |
ET0 |
IP.1 |
Приоритет пpеpывания от таймеpа/счетчика 0 от флага TF0 |
EX0 |
IP.0 |
Приоритет внешнего пpеpывания от входа INT0 |
Идентификатор в первой колонке табл. 4.1 и 4.2 является 8-разрядным адресом бита, непосредственно управляемым по командам булевого процессора.
Система прерываний микроконтроллера аппаратно формирует вызов (LCALL) соответствующей подпрограммы обслуживания, если она не заблокирована одним из следующих условий:
– в данный момент обслуживается запрос прерывания равного или более высокого уровня приоритета;
– текущий машинный цикл не является последним в цикле выполняемой команды;
– выполняется команда RETI или любая команда, связанная с обращением к регистрам IE или IP.
По аппаратно сформированному коду LCALL система прерывания загружает в стек только содержимое счетчика команд PC, а в счетчик команд затем загружается адрес вектора соответствующей подпрограммы обработки прерывания (см. рис. 4.1): 0003H для внешнего прерывания INT0 и 000BH – для прерывания от таймера TF0.
Подпрограммы обслуживания прерываний должны сохранить в стеке все регистры, которые использованы данной программой, командой PUSH. Необходимо, однако, отметить, что при использовании общих регистров R0–R7 для их сохранения достаточно переключить номер банка регистров в регистре PSW. После обработки прерывания сохраненные в стеке регистры должны быть восстановлены командой POP в обратном порядке. В конце программы обработки прерывания требуется использование команды RETI, обеспечивающей правильный возврат из прерывания.
Алгоритм программы:
Установка флагов разрешения прерывания;
Установка режима таймера (режим 1);
Запуск таймера в бесконечном режиме;
Проверка значения счетчика вызовов процедуры обработки прерывания от T/C0;
Сдвиг инициализированный формой «бегущего огня» аккумулятор (падает значение аккумулятора на порт P1, и сбрасывает R0);
За разрешение прерываний отвечает строка mov IE, #10000011b - Разpешает пpеpывания от таймеpа/счетчика 0 от флага TF0 и внешнего пpеpывания от входа INT0 а также общее разрешение пpеpываний. Внешний же сигнал прерывания INT0 вызывает программу вывода в порт Р1 "решетки" – код 55h, в то время как прерывание от T/C0 просто вызывает процедуру обработки прерывания занимающуюся инкрементированием регистра R0.
Отличия формирования сигнала прерывания INT0 по фронту и уровню заключаются в значении бит управления в регистре TCON. От внешних прерываний устанавливаются флаги IE0, IE1 в регистре TCON, которые инициируют вызов соответствующей подпрограммы обработки запроса прерывания. Сброс этих флагов осуществляется аппаратно только в том случае, если прерывание было вызвано по срезу сигнала. Если прерывание вызвано уровнем сигнала прерывания, то сбросом флага IE управляет соответствующая подпрограмма обслуживания прерывания путём воздействия на источник прерывания для снятия запроса.