Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к цифрам.doc
Скачиваний:
24
Добавлен:
06.05.2019
Размер:
2.08 Mб
Скачать

1.1. Регистр приоритетов прерываний

В микроконтроллере имеется специальный регистр приоритетов прерываний IP, доступ к которому осуществляется программно.

Таблица 10.2

IP.7

IP.6

IP.5

IP.4

IP.3

IP.2

IP.1

IP.0

X

X

X

PSP

PTI

PXI

PT0

PX0

Здесь:

PX0 – приоритет прерывания от внешнего входа INT0;

PT0 - приоритет прерывания от таймера Т0;

PXI - приоритет прерывания от внешнего входа INT1;

PTI - приоритет прерывания от таймера Т1;

PSP - приоритет прерывания от последовательного порта;

X – не используется;

Наличие «1» в сотов. бите обеспечивает высокий приоритет соответствующего события (первоочередность обслуживания), а наличие «0» - низкий.

В случае одинакового приоритета, при появлении соответствующих флагов, прерывания обслуживаются в следующей последовательности:

IE0 -> TF0 -> IE1 -> TF1 -> (TI+RI).

Установка флагов производится в конце машинного цикла, а их опрос – в начале следующего.

1.2. Регистр разрешения прерываний

В микроконтроллере имеется также регистр разрешения прерываний IE.

Таблица 10.3

IE.7

IE.6

IE.5

IE.4

IE.3

IE.2

IE.1

IE.0

EA

X

X

ES

ET1

EX1

ET0

EX0

ЕА – глобальное разрешение / запрещение прерываний;

ES – управление прерыванием от последовательного порта;

ET1 – управление прерыванием от таймера Т1;

EX1 – управление прерыванием от входа INT1;

ET0 – управление прерыванием от таймера Т0;

EX0 – управление прерыванием от входа INT0;

Установка в «1» сотов. бита разрешает прерывание, а в «0» - запрещает.

В о внутренней программной памяти микроконтроллера для реализации процедур прерывания выделено специальное адресное пространство, как это показано на рис. 10.1.

Рис. 10.1. Структура памяти программ микроконтроллеров MCS-51

1.3. Начальные адреса прерываний

Если возникает событие, соответствующее прерыванию, как было описано ранее, при наличии соответствующего разрешения в регистре IE, в не зависимости от выполняемых действий, с окончанием очередного машинного цикла микроконтроллер записывает в программный счетчик начальный адрес программной памяти, называемый вектором прерывания, соответствующей тому или иному прерыванию в соответствии с табл. 10.4:

Таблица 10.4

Источник прерывания

Адрес (вектор)

Вн. прерывание INT0

0003h

Переполнение Т0

000Bh

Вн. прерывание INT1

0013h

Переполнение Т1

001Bh

Вн. прерывание INT0

0023h

При программировании области прерываний необходимо проявлять особую внимательность, т. к. указанные области адресов доступны и для основной программы, поэтому при неправильном формировании инструкций для ассемблера, осуществляющего преобразование исходного текста программы в машинные коды возможно наложение адресных пространств и, соответственно неправильная работа микроконтроллера. Следует отметить, что специальные области векторов прерываний имеют небольшой объем – всего лишь 16 байт, поэтому при написании достаточно сложных подпрограмм обработки прерываний внутри специальных областей обычно используют команду абсолютного перехода ljmp , позволяющую разместить основную часть программы обработки прерывания в основной области памяти.

При переходе к подпрограмме обработки прерываний содержимое основных регистров необходимо сохранять в стеке командой push с последующим восстановлением командой pор. Возврат из подпрограммы обработки прерываний осуществляется командой reti.

Листинг программы, написанной на Ассемблере, позволяющей производить счет нажатий кнопки SW15 стенда и отображение числа на двух правых знакоместах динамического индикатора HL2 приведен ниже.

В этой программе программирование прерываний от кнопки осуществляется путем использования инструкции для Ассемблера .ORG 0003h с помощью которой указывается начальный адрес вектора прерывания. Для осуществления перекодировки двоичного кода числа нажатий в семи сегментный подпрограмма формирует специальный массив данных – таблицу перекодировки, суть которой должна быть понятна из листинга. При этом используется инструкция .db. Собственно перекодировка осуществляется путем использования режима косвенной адресации.

Динамическая индикация осуществляется циклически путем одновременной подачи семисегментного кода на параллельно соединенные сегменты индикаторов и напряжения лог. «0» на катоды сотов. разрядов, выдержки этого состояния в течении 20 мс затем выполнения этой процедуры для следующего разряда.

Для исключения срабатывания прерывания несколько раз во время одного нажатия, введена временная задержка на 200 мс во время прерывания.

;*******ЛАБОРАТОРНАЯ РАБОТА 10*************

;*****Программа изучения прерываний*********

; Производится динамическая индикация числа

; хранящегося в регистре R1 в двух правых разрядах

; индикатора стенда HL2

; при нажатии кнопки значение регистра R1 увеличивается на 1

; составил А. Н. Алаев

; ********************************************************

.ORG 0 ; установка указателя сч команд для ассемблера на 0

ljmp ind ; безусловный переход на ПП индикации ind

.ORG 0003h ; установка указателя сч. для ассемблера на вектор прерывания

; от кнопки SW15 стенда

ljmp schet ; безусловный перход на ПП обработки прерывания

ind: ; основная подпрограмма динамической индикации

setb IE.0 ; разрешение прерываний от кнопки

ind1: clr IE.7 ; глобальный запрет прерываний

mov A,R1 ; пересылка в акк. индицируемого числа

anl A,#00001111b ;обнуление старшей тетрады (поготовка инд. младшей)

call decod ; вызов подпрограммы преобразования в семисегм код

; мл тетрады

mov R2,A ; запоминание преобразованного результата в R2

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

mov A,#00h ; обнуление акк.

movx @DPTR,A ; гашение всех сегментов

mov DPTR,#8002h ; устанавливаем в DPTR адреса регистра анодов дин. индикатора

mov A,#00000011b ; запись кода дешифр. включения крайнего правого разр. инд.

movx @DPTR,A ; включение крайнего правого разряда инд.

mov A,R2 ; пересылка семисегм. кода правой цифры

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

movx @DPTR,A ; высвечивание левой цифры

call delay ; вызов подпрограммы задержки на 50 мс

mov A,R1 ; пересылка в акк. индицируемого числа

anl A,#11110000b ;обнуление младшей тетрады (поготовка инд. старшей)

swap A

call decod ; вызов подпрограммы преобразования в семисегм код

; ст тетрады

mov R2,A ; запоминание преобразованного результата в R2

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

mov A,#00h ; обнуление акк.

movx @DPTR,A ; гашение всех сегментов

mov DPTR,#8002h ; устанавливаем в DPTR адреса регистра анодов дин. индикатора

mov A,#00000010b ; запись кода дешифр. включения вторго справа разр. инд.

movx @DPTR,A ; включение крайнего второго справа разряда инд.

mov A,R2 ; пересылка семисегм. кода левой цифры

mov DPTR,#8001h ; устанавливаем в DPTR адрес регистра сегм дин. индикатора

movx @DPTR,A ; высвечивание левой цифры

setb IE.0 ; разрешили прерывание от кнопки после вывода на инд.

call delay ; вызов ПП задержки на 20 мс

sjmp ind1 ; абсолютный переход на начало программы

;*************************************************************************

;ПОДПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧИСЛА В СЕМИСЕГМЕНТНЫЙ КОД

;*************************************************************************

decod: ; ПП преобразования числа в семисегмемтный код

mov DPTR,#tablecod ; занесение в DPTR начального адреса массива таблицы ниже

movc A,@A+DPTR ; пересылка в акк. преобр. в семисегм. код числа

; ранее хранившегося в акк.

ret

;*****************************************************************

tablecod: ; формирование массива для преобразования двоичного кода

; в семисегментный

; PGFEDCBA -сегм.

.db 00111111b ; 0h числа

.db 00000110b ; 1h

.db 01011011b ; 2h

.db 01001111b ; 3h

.db 01100110b ; 4h

.db 01101101b ; 5h

.db 01111101b ; 6h

.db 00000111b ; 7h

.db 01111111b ; 8h

.db 01101111b ; 9h

.db 01110111b ; Ah

.db 01111100b ; Bh

.db 00111001b ; Ch

.db 01011110b ; Dh

.db 01111001b ; Eh

.db 01110001b ; Fh

;****************************************************************

;**************************************************************

;ПОДПРОГРАММА ЗАДЕРЖКИ НА 10 мс

;****************************************************************

delay:

clr IE.7 ; запрет прерываний

clr tcon.4 ; остановка таймера Т0

mov TL0,#<(.not.(10000)) ;запись в мл. регистр Т0 начального условия

;мл. байт дополняющего кода числа 10000

mov TH0,#>(.not.(10000)) ;запись в ст. регистр Т0 начального условия

;ст. байт дополняющего кода числа 10000

mov TMOD,#00000001b ;запретить упр. Т0 от вн. вывода, уст. Т0 в 16-ти разр режим

setb tcon.4 ; запуск счета таймера

jnb TF0,$ ; ожидание переполнения счетчиков таймера Т0 через 50 мс по флагу

clr TF0 ; сброс флага

clr tcon.4 ; останов таймера

setb IE.7 ; разрешили прерывание от кнопки после вывода на инд.

Ret

;********************************************************************

;****************************************************************

; ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ

;******************************************************************

schet:

clr IE.7 ; глобальный запрет прерываний

push DPTR ; сохранение в стеке DPTR

push PSW ; сохранение в стеке PSW

push ACC ; сохранение в стеке аккумулятора

inc R1 ; прибавление '1'к содерж. рабоч. рег.

; т. к. кнопка была нажата

mov r7,#50 ; * формирование задержки

d1: call delay ; * на

djnz r7,d1 ; * 500 мс

pop ACC ; пересылка из стека в аккумулятор

pop PSW ; пересылка из стека PSW

pop DPTR ; DPTR

setb IE.7 ;глобальное разрешение прерываний

reti

;*********************************************************************