Лабораторная работа № 3
СТЕК. ОБРАЩЕНИЕ К ПОДПРОГРАММАМ.
СИСТЕМА ПРЕРЫВАНИЙ МК INTEL8051
Цель работы: изучение организации стековой памяти и системы прерываний микроконтроллера Intel8051, а также приобретение навыков программирования с использованием подпрограмм.
1. ОРГАHИЗАЦИЯ СТЕКОВОЙ АДРЕСАЦИИ
Стековая адресация в МК реализована с помощью автоинкрементной/ автодекрементной косвенной адресации через 8-разрядный регистр указатель стека SР (адрес 81Н в пространстве DSEG). Стек располагается в любом поле DSEG в диапазоне адресов 00h-7Fh. При выполнении операций загрузки в стек (типа PUSH, CALL) содержимое SP сначала инкрементируется, а затем по полученному адресу выполняется загрузка операнда.
В операциях чтения (выгрузки) из стека (типа POP, RET) сначала читается содержимое стека, а затем SP декрементируется.
Команды работы со стеком приведены в табл. 1.1.
Таблица 1.1. Команды работы со стеком
МНЕМОНИКА | КОП | Б | Ц | Операция |
PUSH ad | (SP):= (SP)+1; ((SP)):= (ad) | |||
POP ad | (ad):= ((SP)); (SP):=(SP)-1 | |||
LCALL ad16 | (PC):=(PC)+3, (SP):=(SP) + 1 ((SP)):=(PCL), (SP):=(SP)+1 ((SP)):=(PCH), (SP):=ad16 | |||
ACALL ad11 | aaa10001 | (PC):=(PC)+2, (SP):=(SP) + 1 ((SP)):=(PCL), (SP):=(SP)+1 ((SP)):=(PCH), (PC[0 -10]):=ad11 | ||
RET | (PCH):=((SP)), (SP):=(SP) - 1 (PCL):=((SP)), (SP):=(SP) - 1 | |||
RET I | (PCH):=((SP)), (SP):=(SP) - 1 (PCL):=((SP)), (SP):=(SP) - 1 |
При инициализации МК по сигналу RST “Cброс” в указатель стека автоматически загружается к од 07Н, т.е. первый элемент стека будет загружаться в ячейку 08Н (регистр R0 первого банка регистров). Пользователь имеет возможность переопределить содержимое SP, изменив необходимым образом расположение стека в DSEG. Переполнение стека аппаратно не фиксируется, что должно учитываться в программе пользователя.
|
При обращении к подпрограмме (и обработке прерываний) по командам типа CALL в стек загружается только адрес возврата. Информация о состоянии МК аппаратно не сохраняется. При необходимости это должна делать прикладная программа.
2. ОРГАНИЗАЦИЯ СИСТЕМЫПРЕРЫВАНИЙ
Микроконтроллер МК51 поддерживает двухуровневую приоритетную систему прерываний с пятью источниками запросов.
Имеется два внешних запроса на прерывания – линии ~INT0, ~INT1 (разряды 2-й и 3‑й третьего порта ввода/вывода: контакты P3.2 и Р3.3 соответственно).
Рисунок 2.1. Архитектура системы прерываний МК51
Источниками внутренних запросов могут служить;
- счетчик / таймер 0
- счетчик / таймер 1,
- порт последовательного ввода / вывода.
Архитектура системы прерывания МК приведена на рис. 2.1.
3. РЕГИСТРЫСИСТЕМЫПРЕРЫВАНИЙ
Блок регистров системы прерываний включает регистр управления TCON (адрес 88h в пространстве DSEG), формат которого приведен на рис. 3.1, и два регистра для управления режимом прерываний и уровнями приоритетов. Форматы этих регистров приведены на рис. 3.2 и рис. 3.3 соответственно.
Адрес бита в пространстве BSEG | 8F | 8E | 8D | 8C | 8B | 8A | ||
Назначение разрядов регистра | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
Рисунок 3.1. Формат регистра TCON
(регистра управления таймерами/счетчиками и системой прерываний)
На рис. 3.1:
TCON.0 IT0 – управление типом входа ~INT0:
IТ0 = 0 – по спадающему фронту;
IT0 = 1 – статический вход.
ТСON.1 IE0 – флаг запроса на прерывание ~INT01 при динамическом входе.
TCON.2 IT1 – управление типом входа ~ INT1:
|
IТ1 = 0 – по спадающему фронту;
IТ1 = 1 – статический вход.
TCON.3 IEI – флаг запроса на прерывание ~ INTI при динамическом входе.
TCON.4 TR0 – флаг программного управления СТ0.
TCON.5 TF0 – флаг запроса прерывания по переполнению СТ0.
TCON.6 TR1 – флаг программного управления СТ1.
TCON.7 TF1 – флаг запроса прерывания по переполнению СТ1.
Адрес бита в пространстве BSEG | AF | AE | AD | AC | AB | AA | A9 | A8 |
Назначение разрядов регистра | EA | — | — | ES | ET1 | EX1 | ET0 | EX0 |
Рисунок 3.2. Формат регистра IE (регистра разрешения прерываний)
На рис. 3.2:
IE.0 EX0 – маска IE0 или ~ INT0;
IE.1 EX0 – маска TF0;
IE.2 EX1 – маска IE1 или ~ INT1;
IE.3 ET1 – маска TF1;
IE.4 ES – маска ТI/RI;
IE.7 EA – общее разрешение прерываний.
Адрес бита в пространстве BSEG | BF | BE | BD | BC | BB | BA | B9 | B8 |
Назначение разрядов регистра | — | — | — | PS | PT1 | PX1 | PT0 | PX0 |
Рисунок 3.3. Формат регистра IP (регистра уровня приоритетов прерываний)
На рис. 3.3:
IP.0 PX0 – приоритет IE0 или ~ INT0;
IP.1 РТ0 – приоритет TF0;
IP.2 PX1 – приоритет IE1 или ~ INT1;
IP.3 PT1 – приоритет TF1;
IP.4 PS – приоритет ТI/RI.
4. ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЙ
Линии ~INT0 и ~ INT1 (внешние контакты МК Р3.2, Р3.3 соответственно) могут быть запрограммированы на срабатывание как по спадающему фронту сигнала, так и по низкому уровню сигнала. Управление типом вход выполняется флажками IT0 и IT1 соответственно. При IT0 = 1 устанавливается режим срабатывания по L уровню сигнала на входе ~INT0. Аналогично и для IT1. Запросы на прерывание от внешних источников устанавливают флажки IE0 и IE1. В случае работы по спадающему фронту эти флажки сбрасываются аппаратно, при приеме соответствующего запроса на обработку. При работе по уровню флажки IE0, IE1 отслеживают состояние сигнала на входе, их сброс необходимо предусмотреть в программе обработки соответствующим обращением к устройству, выставившему запрос.
|
Переполнение счетчика/таймера приводит к установке флага переполнения TF0 для счетчика/таймера 0 и TF1 для счетчика/таймера 1. При приеме запроса на обработку прерывания от счетчика/таймера соответствующий флажок аппаратно сбрасывается.
Запросы на прерывание могут поступать и от последовательного порта ввода/вывода. Порт может взвести флажок TI – запрос на прерывание от передатчика или флажок RI – запрос на прерывание от приемника. Оба запроса воспринимаются как запрос от одного источника. Флажки RI, TI при приеме запроса на прерывание от порта аппаратно не сбрасываются. Их обнуление должно быть предусмотрено в обработчике прерывания.
Все флажки, фиксирующие запросы на прерывания, могут устанавливаться и сбрасываться программно, с помощью соответствующих команд работы в пространстве BSEG. Т.е. существует возможность вызывать прерывания чисто программным путем.
С помощью регистра разрешения прерываний можно замаскировать любой из источников прерываний индивидуально или запретить/разрешить работу системы прерываний в целом.
Каждый источник прерываний может иметь два уровня приоритета, который задается установкой или сбросом соответствующего разряда в регистре уровня приоритета IР. Установка разряда в 1 соответствует высокому приоритету, а в 0 – низкому. При обслуживании низкоприоритетного прерывания запрос на высокоприоритетное прерывание может быть принят и обслужен. При обслуживании высокоприоритетного прерывания запрос на низкоприоритетное игнорируется.
При одновременном появлении нескольких запросов одного уровня используется арбитраж в соответствии со следующими приоритетами:
Приоритет Источник
0 (высший) IED
1 TF0
2 IEI
3 IF1
4 (низший) RI/TI
При приеме запроса аппаратно генерируется команда LCALL vect, которая обеспечивает переход к начальному адресу vect соответствующей процедуры обслуживания. Каждому источнику соответствует свой адрес:
Вектор прерываний
000ЗН EXT0 IE0 – внешний запрос 0
000BH TIMER0 TF0 – по таймеру /счетчику 0
001ЗН EXT1 IE1 – внешний запрос 1
001ВН TIMER1 TF1 – по таймеру/счетчику 1
002ЗН SINT RI/TI – от последовательного порта
Запрос на прерывание может быть принят в конце каждого цикла выполнения команды, кроме команды RETI и команд, работающих с регистрами IE и IP.
При переходе к процедуре обслуживания текущее состояние РC загружается в стек, обеспечивая возврат по команде RETI, которая должна завершать работу обработчика прерываний. Эта команда отличается от обычной команды RET тем, что сообщает системе прерываний о конце обслуживания прерывания данного уровня. Это позволяет перейти к обслуживанию прерывания низкого уровня, если на него поступил запрос во время обработки высокоуровневого. Общий алгоритм обработки прерываний микроконтроллера приведен на рис. 4.1.
Рисунок 4.1. Алгоритм обработки прерываний
5. ЗАДАНИЕ ПО ЛАБОРАТОРНОЙ РАБОТЕ
Написать систему программ, которая выполняет следующие функции:
1) Первая программа выполняет циклический вызов прерывания типа TYPE. Программа располагается в CSEG, начиная с адреса ADR0. Программа должна состоять из двух частей. Первая часть – инициализация системы, вторая – циклическое взведение соответствующего триггера запроса на прерывание.
2) Вторая программа – обработчик прерывания, должна располагаться в памяти CSEG, начиная с адреса ADRI. Обработчик должен при каждом обращении передавать в порт Р1 очередной код из массива кодов длиной N, расположенный в CSEG, начиная с адреса ADF2.
Вход в систему программ по команде LCALL ADR0, расположенной в CSEG по адресу 0000h.
Таблица 5.1. Варианты заданий.
Номер | ADR0 | TYPE | ADR1 | ADR2 | N |
1. | IE0 | E | |||
2. | 52F | TF0 | 62F | F | |
3. | 43E | IE1 | 53E | D | |
4. | 34A | TF1 | 44A | C | |
5. | RI | B | |||
6. | TI | A | |||
7. | IE0 | ||||
8. | 68A | TF0 | 78A | ||
9. | 79D | IE1 | 69D | F | |
10. | 3AF | TF1 | 5AF | E | |
11. | 5BA | RI | 4BA | ||
12. | 4C9 | TI | 3C9 | ||
13. | 1D8 | IE0 | 2D8 | 3A1 | |
14. | 2E4 | TF0 | 1E4 | 4B2 | |
15. | 3F5 | IE1 | 7F5 | 5C2 | |
16. | 5E6 | TF1 | 6E6 | 6D2 | |
17. | 6A1 | RI | 5A1 | 7E2 | F |
18. | 7D3 | TI | 4D3 | 1F2 | A |
19. | 4C8 | IE0 | 3C8 | 2E2 | B |
20. | 36F | TF0 | 26F | 3D2 | C |
21. | 2BE | IE1 | 4BE | D | |
22. | 1CA | TF1 | 3CA | E | |
23. | 4D3 | RI | 2D3 | 3A2 | F |
24. | 3E7 | TI | 1E7 | 4B2 | |
25. | 6F3 | IE0 | 7F3 | 5C2 | |
26. | 4E5 | TF0 | 6E5 | 6D2 | |
27. | 6AD | IE1 | 5AD | 7E4 | C |
6. СОДЕРЖАНИЕ ОТЧЕТА:
– краткое описание системы прерываний;
– задание по лабораторной работе;
– текст программы с пояснениями;
– черновик выполнения работы.
7. ФРАГМЕНТЫПРОГРАММ
Необходимо написать программную систему со следующими функциями.
Программа 1 инициализирует систему и циклически вызывает прерывание типа IE1 (программный аналог запроса на прерывание по входу ~INTI). Программа должна располагаться в CSEG по адресу 0100Н.
Программа 2 является обработчиком прерывания. При каждом вызове она должна пересылать очередной элемент массива в порт Р1. Массив однобайтных кодов длиной N располагается в CSEG, начиная с адреса ADRD.
Вектор прерываний
LJMP | |||
NOP | |||
NOP | |||
… | … | … | |
LJMP | |||
NOP |
Программа 1
MOV | DPTR, <ADRD> | ; загружаем DPTR | ||
D2AF | SETB | IE.7 | ; разрешаем прерывания | |
D2AA | SETB | IE.2 | ; разрешаем прерывание IE1 | |
NOP | ; пустая команда | |||
D28B | SETB | TCON.3 | ; программный запрос на прерывания | |
010A | 80FB | SJMP | ; в начало цикла |
Программа 2
D2D3 | SETB | PSW.3 | ; задаем 3 банк | |
D2D4 | SETB | PSW.4 | ; | |
B80602 | CJNE | R0, <N>, 0209 | ; проверяем счетчик | |
MOV | R0, #00 | ; обнуляем счетчик | ||
E8 | MOV | A, R0 | ||
020A | MOVC | A,@A+DPTR | ; чтение очередного кода | |
020B | F590 | MOV | R1, A | ; засылка кода в Р1 |
020D | INC | R0 | ; инкремент счетчика | |
020E | RET | I | ; возврат из обработчика |