Дмитриев Универсалный лабораторный стенд. Аппаратные средства проектирования встраиваемых систем 2009
.pdfMKRD составляет 5 тактов. Поэтому использовать этот строб для непосредственного формирования сигнала RE недопустимо. Для выполнения чтения необходимо в стробе MKRD «вырезать» только один период сигнала синхронизации. Эту функцию как раз и выполняет схема на счетчике. Во-вторых, необходимо учитывать особенности формирования состояния выходной шины FIFO. Для уяснения принципа работы выходной шины FIFO рассмотрим временную диаграмму, изображенную на рис. 3.11.
Рис. 3.11. Временная диаграмма работы FIFO при чтении данных
Из диаграммы видно, что при записи очередных данных, они появляются на выходной шине FIFO (RG.D7) через один такт. Также и при чтении – через один такт на выходной шине выставляются данные, которые будут считаны при следующем обращении. Напомним, что длительность строба чтения MKRD составляет 5 тактов, а результат чтения данных в МК фиксируется по изменению 0/1 этого строба. Ясно, что возможна ситуация, когда в момент изменения 0/1 MKRD на выходе FIFO будут уже следующие данные. Чтобы избежать такой ситуации, в схему введен буферный регистр, в котором фиксируются данные, читаемые из FIFO в момент действия сигнала RE. На диаграмме воспроизведена ситуация, когда в FIFO записаны два значения 34h и 29h. Из диаграммы видно, что после первой записи флаг EMPTY сбрасывается в «0», а после последнего чтения устанавливается в «1».
На рис. 3.12 приведена временная диаграмма, на которой показано формирование флага FULL при заполнении буфера. Из диаграммы видно, что после сброса буфера в исходное состояние осуществляется последовательная запись 16-значений (16 тактовых
71
сигналов при установленном сигнале WE). В момент записи последнего значения устанавливается флаг FULL, что свидетельствует о заполненности буфера.
Отметим, что FIFO можно использовать и для организации обмена по прерываниям, когда источником прерывания от внешнего устройства является флаг FULL. Это эффективный механизм обмена, если требуется передача блока данных, длина которого равна емкости FIFO.
Рис. 3.12. Формирование флага FULL буфера FIFO
3.5. ПРОГРАММНОЕ УПРАВЛЕНИЕ РАБОТОЙ АЦП
Рассмотрим тексты программ, иллюстрирующие возможности программного управления работой АЦП в циклическом режиме. В этих программах код адреса канала измерения в регистре ADCON установлен по умолчанию (000), что соответствует линии Р5.0 порта Р5. В качестве результата преобразования берутся только 8 старших разрядов преобразования из регистра ADCH.
Пример программы циклического запуска АЦП с использованием прерывания:
|
ORG |
8000h |
P4 |
EQU |
0C0h |
IEN0 |
EQU |
0A8h |
ADCON |
EQU |
0C5h |
ADCH |
EQU |
0C6h |
|
MOV |
IEN0,#0C0h ;разрешение прерывания от АЦП |
M1: |
MOV |
A,ADCON |
|
|
72 |
|
ANLA,#18h |
;проверка флагов ADCI и ADCS |
||
|
JNZ |
M1 |
|
|
|
MOV |
R0,#01h |
;индикатор состояния АЦП |
|
|
MOV |
ADCON,#08h |
;запуск АЦП |
|
M5: |
CJNE |
R0,#02H,M5 |
;ожидание окончания АЦП |
|
; |
LJMP |
M1 |
|
|
ORG |
8053h |
;обработчик прерывания от АЦП |
||
|
||||
|
MOV |
A,ADCh |
;чтение результата преобразования |
|
|
SWAP A |
|
||
|
MOV |
P4,A |
;вывод на индикацию |
|
|
MOV |
ADCON,#00h |
;сброс флагов |
|
|
MOV |
R0,#02h |
; установка индикатора состояния АЦП |
|
|
RETI |
|
|
|
|
END |
|
|
Пример программы циклического запуска АЦП с опросом флага готовности:
|
ORG |
8000H |
|
P4 |
EQU |
0C0H |
|
ADCON |
EQU |
0C5H |
|
ADCH |
EQU |
0C6H |
|
M1: |
MOV |
A,ADCON |
|
|
ANL A,#18H |
;проверка флагов ADCI и ADCS |
|
|
JNZ |
M1 |
|
|
MOV |
ADCON,#08H |
;запуск АЦП |
MM5: |
MOV |
A,ADCON |
|
|
ANL |
A,#10H |
|
|
JZ |
MM5 |
;ожидание окончания АЦП |
|
MOV |
A,ADCH |
;чтение результата преобразования |
|
SWAP |
A |
|
|
MOV |
P4,A |
;вывод на индикацию |
|
MOV |
ADCON,#00H |
;сброс флагов |
|
LJMP |
M1 |
|
|
END |
|
|
3.6.ПРОГРАММИРОВАНИЕ КОНТРОЛЛЕРА КЛАВИАТУРЫ И ИНДИКАЦИИ
Использование клавиатуры и дисплея на семисегментных индикаторах при работе с УЛС обеспечивается путем программной настройки контроллера клавиатуры и индикации 82С79, которую не-
73
обходимо выполнять с учетом рекомендаций п. 1.10 настоящего пособия. Ниже приведен пример программирования контроллера 82С79 при вводе и отображении символьных данных:
|
ORG |
8000H |
|
IEN0 EQU |
0A8H |
|
|
|
MOV |
IEN0, #84Hh |
;разрешение прерывания INT1 |
|
MOV |
DPTR,#7FFFh |
|
|
MOV |
A,#01h |
|
|
MOVX |
@DPTR,A |
;ввод символа слева, |
|
LJMP M2 |
;декодированный режим |
|
|
|
||
|
ORG |
8013h |
;обработчик прерывания INT1 |
|
MOV |
DPTR,#7FFFh |
|
|
MOV |
A,#40h |
|
|
MOVX |
@DPTR,A |
;разрешение чтения FIFO |
|
MOV |
DPTR,#7FFEh |
;клавиатуры |
|
|
||
|
MOVX |
A,@DPTR |
;чтение скан-кода |
|
CJNE |
A, #11011001B, K1 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «0» |
|
|
||
|
MOV |
A,#11110011b |
|
|
MOVX |
@DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «0» |
|
|
||
K1: |
CJNE |
A, #11000000B, K2 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «1» |
|
|
||
|
MOV |
A,#01100000b |
|
|
MOVX |
@DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «1» |
|
|
||
K2: |
CJNE |
A, #11000001B, K3 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «2» |
|
|
||
|
MOV |
A,#10110101b |
|
|
MOVX |
@DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «2» |
|
|
||
K3: |
CJNE |
A, #11000010B, K4 |
;проверка скан-кода |
|
|
|
;клавиши «3» |
|
|
|
74 |
MOV |
DPTR,#7FFEh |
|
MOV |
A,#11110100b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «3» |
|
||
K4: CJNE |
A, #11001000B, K5 |
; проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «4» |
|
||
MOV |
A,#01100110b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «4» |
|
||
K5 CJNE |
A, #11001001B, K6 |
;проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «5» |
|
||
MOV |
A,#11010110b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «5» |
|
||
K6: CJNE |
A, #11001010B, K7 |
;проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «6» |
|
||
MOV |
A,#11010111b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «6» |
|
||
K7: CJNE |
A, #11010000B, K8 |
;проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «7» |
|
||
MOV |
A,#01110000b |
;вывод в видеопамять кода |
MOVX @DPTR,A |
||
LJMP |
EXIT |
;символа «7» |
|
||
K8: CJNE |
A, #11010001B, K9 |
;проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «8» |
|
||
MOV |
A,#11110111b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
LJMP |
EXIT |
;символа «8» |
|
||
K9: CJNE |
A, #11010010B, K10 |
;проверка скан-кода |
MOV |
DPTR,#7FFEh |
;клавиши «9» |
|
||
MOV |
A,#11110110b |
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
|
|
|
;символа «9» |
|
|
75 |
LJMP |
EXIT |
|
|
K10: СJNE |
A, #11000011B, K11 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «A» |
|
|
|||
MOV |
A,#01110111b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
LJMP |
EXIT |
;символа «A» |
|
|
|||
K11: CJNE |
A, #11001011B, K12 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «B» |
|
|
|||
MOV |
A,#11000111b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
LJMP |
EXIT |
;символа «B» |
|
|
|||
K12: CJNE |
A, #11010011B, K13 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «C» |
|
|
|||
MOV |
A,#10010011b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
LJMP |
EXIT |
;символа «C» |
|
|
|||
K13: CJNE |
A, #11011011B, K14 |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «D» |
|
|
|||
MOV |
A,#11100101b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
LJMP |
EXIT |
;символа «D» |
|
;проверка скан-кода |
|||
K14: CJNE |
A, #11011000B, K15 |
||
MOV |
DPTR,#7FFEh |
;клавиши «*» |
|
|
|||
MOV |
A,#10010111b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
LJMP |
EXIT |
;символа «E» |
|
|
|||
K15: CJNE |
A, #11011010B, EXIT |
;проверка скан-кода |
|
MOV |
DPTR,#7FFEh |
;клавиши «#» |
|
|
|||
MOV |
A,#00010111b |
|
|
MOVX @DPTR,A |
;вывод в видеопамять кода |
||
EXIT: |
|
;символа «F» |
|
|
|
||
RETI |
|
;выход из обработчика |
|
|
|
;прерывания INT1 |
|
|
|
76 |
M2:
MOV |
DPTR,#7FFFh |
|
MOV |
A,#90h |
|
МOVX @DPTR,A |
;разрешение записи в видеопамять |
|
LJMP |
$ |
;с автоинкрементированием адреса |
|
||
END |
|
|
Представленная программа по скан-коду нажатой клавиши определяет код соответствующего этой клавише шестнадцатеричного символа после чего загружает его в видеопамять дисплея.
3.7.ПРОГРАММИРОВАНИЕ ВЫВОДА СИМВОЛЬНОЙ ИНФОРМАЦИИ НА ЖКИ
Рассмотрим пример построения системы диагностики цифрового узла в составе ПЛИС с выводом его состояния на ЖКИ. В качестве узла выбран 4-разрядный двоичный счетчик. Логика работы схемы подключения счетчика к МК, представленной на рис. 3.13 состоит в следующем. Генератор ГОИ1 работает в непрерывном режиме и подключен к С входу вспомогательного счетчика, который при нажатии кнопки ГОИ2 формирует сигнал внешнего прерывания МК INT0. Этот сигнал является импульсным, длительность которого равна 16 периодам внешнего тактового генератора. Одновременно этот сигнал подается на С вход тестируемого счетчика для увеличения его состояния на 1. Задача системы состоит в том, чтобы по сигналу прерывания выводить в первое знакоместо первой строки текущее значение счетчика в шестнадцатеричном формате. Для формирования кода шестнадцатеричного символа в схему включен аппаратный знакогенератор, выполненный на ПЗУ. Файл прошивки этого ПЗУ представлен на рис. 3.14. Значение кода символа для кодирования текущего состояния счетчика считывается в МК по адресу 7FFB. Для контроля работы системы в схеме используются шкалы светодиодных индикаторов. На шкалу Е выводится состояние счетчика в двоичном коде. На шкалы А и В, а также С и D выводится принятый в МК код шестнадцатеричного символа. На первую пару шкал данные выводятся через порт Р4. На шкалы C и D данные выводятся из МК путем выполнения команды записи по адресу 7FFA.
77
Рис. 3.13. Схема тестового примера диагностирования цифрового узла с выводом его текущего состояния на ЖКИ
Рис. 3.14. Файл прошивки ПЗУ знакогенератора шестнадцатеричного кода
78
Ниже приводится текст программы выполняемой МК в данной системе.
ORG8000h
LJMPM1
;******************************************************************************************
ORG 8003h |
;обработчик прерывания INT0 |
MOV DPTR, #7FFAh |
;прием кода символа в аккумулятор |
MOVX A, @DPTR |
|
MOV R4,A |
;сохранение кода символа в R4 |
SWAP A |
|
MOV 0C0h, A |
;выдача кода символа в порт Р4 |
MOV DPTR, #7FFBh |
;передача кода для индикации на шкалах ;C и D |
MOVX @DPTR,A |
|
LCALL VIVOD |
;вызов подпрограммы вывода на ЖКИ |
|
;символа в первое знакоместо первой |
RETI |
;строки, код символа в R4 |
|
;******************************************************************************************
M1: MOV A,#01h |
;настройка прерываний |
;INT0 – по фронту |
|
MOV |
TCON,A |
MOV A,#81h |
;разрешение прерывания от INT0 |
MOV |
IE,A |
LJMP $ |
|
;****************************************************************************************** ;подпрограмма вывода на ЖКИ символа в первое знакоместо первой строки
;код символа в R4
VIVOD: |
|
MOV A,#38H |
;две строки размер символа 5*8 точек |
LCALL DINIT |
;вызов подпрограммы записи команды в |
|
;управляющий регистр дисплея |
MOV A,#0CH |
;включение дисплея |
LCALL DINIT |
|
MOV A,#06H |
;сдвиг курсора вправо после вывода |
LCALL DINIT |
;символа |
|
|
MOV A,#02H |
|
LCALL DINIT |
|
MOV A,#01H |
;очистка дисплея |
LCALL DINIT |
|
MOV A,R4 |
;код символа из R4 в аккумулятор |
LCALL DISP |
;вызов подпрограммы записи кода |
|
;символа в регистр данных дисплея |
|
79 |
RET ;**************************************************************************************** ;подпрограмма записи команды в управляющий регистр дисплея
DINIT:
MOV R0,A
MOV DPTR,#7FF6H ;ожидание установки флага завершения ;записи в память дисплея
BF:
MOVX A,@DPTR ANL A,#80H JNZ BF
MOV DPTR,#7FF4H ;запись кода команды в управляющий ;регистр дисплея
MOV A,R0 MOVX @DPTR,A RET
;***************************************************************************************** ;подпрограмма записи кода символа в регистр данных дисплея
DISP: MOV R0,A
MOV DPTR,#7FF6H ;ожидание установки флага завершения ;записи в память дисплея
BF1:
MOVX A,@DPTR ANL A,#80H JNZ BF1
MOV DPTR,#7FF5H ;запись значения кода символа в регистр ;данных дисплея
MOV A,R0 MOVX @DPTR,A RET
;****************************************************************************************
END
3.8. ИЗМЕРЕНИЕ ВРЕМЕННЫХ ИНТЕРВАЛОВ И ПОДСЧЕТ ВНЕШНИХ СОБЫТИЙ ПРИ ПОМОЩИ ТАЙМЕРОВ Т0 И Т1
В состав МК входят два таймера Т0 и Т1, которые могут работать в качестве таймера или счетчика внешних событий. При работе в качестве таймера состояние Т0 и Т1 инкрементируется 1 раз за машинный цикл, то есть за 12 периодов внешнего тактового гене-
80