Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Краткие теоретические сведения | Примечание. INT0 соответствует альтернативная функция вывода Р3.2, | Режим 1 | Перевести таймер T0 в шестнадцатиразрядный режим работы ; | Режим 2 | Режим 3 | Использование таймера в качестве частотомера. | Перевести таймер T0 в шестнадцатиразрядный режим ; | Пример выполнения работы | Краткие теоретические сведения |


Читайте также:
  1. IP адреса
  2. VIII.ЮРИДИЧЕСКИЕ АДРЕСА И БАНКОВСКИЕ РЕКВИЗИТЫ СТОРОН
  3. Адреса векторов прерывания
  4. Адреса закладу, що заповнив протокол ___________________________________________________
  5. Адреса и реквизиты сторон
  6. Адреса и телефоны аварийно-спасательных формирований.
  7. Адреса магазинов в СПб

Если возникает событие, соответствующее прерыванию, как было описано ранее, при наличии соответствующего разрешения в регистре 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

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


Дата добавления: 2015-07-20; просмотров: 42 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Регистр приоритетов прерываний| Краткие теоретические сведения

mybiblioteka.su - 2015-2024 год. (0.012 сек.)