В номенклатуру задач вывода информации входят как задачи вывода управляющей информации, поступающей в виде различных сигналов (амплитудных, частотных и других), на объекты управления, так и организация вывода информации на пульт оператора.
Рассмотрим программу, выполнение которой приводит к зажиганию светодиода, подключенного к одному из выводов порта ввода–вывода PTD.
Ниже представлен текст программы формирования управляющего сигнала на выводе PTD5 порта вывода PTD.
ramstart | equ | $0040 | ;команды присвоения переменным символьных |
romstart | equ | $8000 | ;имен |
vectorstart | equ | $FFDC | |
PTD | equ | $0003 | |
DDRD | equ | $0007 | |
| org | romstart | ;директива установки записи команд в блок Flash-памяти |
| mov | $20, DDRD | ;конфигурировать вывод PTD5 порта D на вывод ;информации |
loop: | mov | $00,PTD | ;установить низкий потенциал на выводе для ;зажигания светодиода |
| bra | loop | ;организация цикла для постоянного горения светодиода |
| end | | |
Начало данной программы аналогично программе реализации контроля переключения ключа, подключенного к выводу порта ввода-вывода РТD. Благодаря команде EQU присваиваются переменным символьные имена. Команда ORG задает начальный адрес программы в памяти МК.
Команда mov $20, DDRD необходима для конфигурации вывода PTD5 порта D на вывод информации. В регистр направления и передачи данных DDRD загружается код $20 (%100000).
| | | | | | | | |
| DDRD7 | DDRD6 | DDRD5 | DDRD4 | DDRD3 | DDRD2 | DDRD1 | DDRD0 |
Состояние до записи | | | | | | | | |
после записи | | | | | | | | |
Таким образом, запрограммировали PTD5 на вывод информации.
После этого на биты данных порта D подается код $00 при помощи команды mov, устанавливается низкий уровень на PTD5 для зажигания светодиода. Далее организуется цикл для постоянного горения светодиода при помощи команды bra loop, которая обеспечивает безусловный переход на метку loop, таким образом, на PTD5 будет всегда низкий уровень.
На рис. 3.13 представлены схемы подключения светодиодов к МК.
а) б)
Рис. 3.13 Подключение светодиода к МК:
а) включение логической «1»; б) включение логическим «0»
Рассмотрим особенности подключения светодиодных индикаторов к микроконтроллеру. На рис. 3.14 и рис. 3.15 представлены схемы подключения светодиодного индикатора с общим катодом и общим анодом к МК.
Рис. 3.14. Подключение светодиодного индикатора с общим катодом к МК
Рис. 3.15. Подключение светодиодного индикатора с общим анодом к МК
Рассмотрим пример вывода информации на 2-разрядный 7-сегментный индикатор с использованием динамической индикации, которая заключается в следующем. Информация (числа), которые необходимо высветить через выводы порта РТС РТС0 – РТС3 подаются на дешифратор. Дешифратор необходим для преобразования двоичного кода в код семисегментного индикатора. Через PТС4 осуществляется управление десятичной точкой индикатора. А через выводы PТС5, PТС6 подаются управляющие импульсы, которые определяют тот разряд, который будет активным.
Очевидно, что необходимо синхронизировать информационные сигналы с управляющими. На рис. 3.16 приведена блок-схема программы вывода информации на 2-разрядный 7-сегментный индикатор.
Текст программы вывода информации на 2-х разрядный семисегментный индикатор представлен ниже.
romstart: | equ | $8000 | |
ramstart: | equ | $0038 | |
vectorstart: | equ | $FFDC | |
vectorTIM1 | equ | $FFF2 | |
T1SC: | equ | $0020 | |
T1MODh: | equ | $0023 | |
T1MODl: | equ | $0024 | |
PTDPUE: | equ | $000A | |
DDRC: | equ | $0006 | |
PTC: | equ | $0002 | |
count | equ | $0039 | ;счетчик |
rezultat | equ | $0053 | ;результат, который надо вывести |
syncro | equ | $0055 | ;ячейка, которая используется для ;синхронизация разрядов при выводе ;информации на 7-сегментный индикатор |
syncro+1: | equ | $0056 | |
reserve: | equ | $0057 | ;ячейка для временного хранения результатов ;промежуточных операций |
odin | equ | $0058 | ;ячейка, которая используется для определения ;номера работающего разряда при выводе ;информации на 7-сегментный индикатор |
| org | romstart | |
main1: | clra | | ;очистить используемые регистры и ячейки ;памяти |
| clrx | | |
| clr | count | |
| clr | rezultat | |
| clr | syncro | |
| clr | syncro+1 | |
| clr | reserve | |
| clr | odin | |
| mov | #%0100000,syncro | ;1-й разряд |
| mov | #%1000000,syncro+1 | ;2-й разряд |
| mov | #$1,odin | |
| mov | #%1111111,DDRC | ;установить все биты PTC на вывод |
| mov | #$00,PTC | ;обнулить порт С |
obnulenie: | mov | #$0,count | ;обнулить счетчик |
flag: | bsr | display | |
| inc | count | ;увеличить содержимое счетчика на 1 |
| lda | count | |
| cmp | odin | ;сравнить содержимое А с odin |
| bhi | obnulenie | ;если больше 1, обнулить count |
| jmp | flag | |
display: | lda | #rezultat | |
| add | count | ;сложить содержимое А с содержимым ;count |
| tax | | ;переслать содержимое А в Х |
| lda | ,x | ;установить в А содержимое ячейки адрес ;которой указан в Х |
| sta | reserve | ;установить содержимое А в reserve |
| lda | #syncro | ;установит в А адрес syncro |
| add | count | ;сложить содержимое А с содержимым count |
| tax | | |
| lda | ,x | |
| add | reserve | ;сложить содержимое А с содержимым reserve |
| mov | #1250,$59 | |
| sta | PTC | ;установить в PTC |
izo: | mov | #%0100110,T1SC | ;запустить т/с |
| mov | #$FF,T1MODH | |
| mov | #$FF,T1MODL | |
| jmp | * | |
prer2: | dec | $59 | ;уменьшить содержимое ячейки $59 на 1 |
| bne | izo | |
| mov | T1SC,$50 | ;выключить т/с |
| bclr | 7,T1SC | |
| mov | #0,PTC | ;выключить индикатор |
| rts | | |
| rti | | |
| end | | |
Для того чтобы программа могла начать работу, должны быть определены через команды присвоения EQU все спецификации аппаратных средств, такие как имена регистров и области памяти. С помощью объявлений определяются все переменные. Команда ORG сообщает ассемблеру адрес начала оперативной памяти. Программа MAIN – начало главной программы, которая вызывается после аппаратного сброса МК или команды RESET отладчика (команды Power-on для некоторых отладчиков).
Основная программа начинается с очистки необходимых при работе регистров и ячеек памяти. Заметим, что эта процедура является важной и необходимой для обеспечения нормальной работы программы. После данной процедуры в ячейки syncro, syncro+1, odin загружаются значения, которые понадобятся при работе. Далее происходит инициализация порта РТС. В регистр DDRC порта записывается следующее число: %1111111, таким образом, все выводы порта программируются на вывод информации. После этого начинается выбор того разряда 7-сегментного индикатора, на который будет подаваться информация.
Здесь реализована динамическая индикация. Работа индикатора осуществляется следующим образом: разряды индикатора работают поочередно, т.е. в один момент времени может работать только один разряд. Время переключения между разрядами настолько малое, что человеческому глазу оно практически не заметно. Поэтому оператор будет наблюдать постоянно высвеченное значение. По этой причине необходимо синхронизировать управляющие 7-сегментным индикатором сигналы с информационными сигналами.
Происходит очистка счетчика (count). Далее происходит безусловный переход к подпрограмме DISPLAY, в которой происходит синхронизация управляющих 7-сегментным индикатором сигналов с информационными. После выполнения данной подпрограммы процессор возвращается к команде, следующей за командой bsr DISPLAY, происходит увеличение содержимого счетчика на единицу, загрузка содержимого счетчика в аккумулятор А, сравнение содержимого аккумулятора с содержимым ячейки odin, т.е. с единицей. Если содержимое счетчика больше единицы, то обнуляем счетчик, в противном случае начинает выполняться подпрограмма DISPLAY.
Рассмотрим подробнее выполнение подпрограммы DISPLAY. В начале в аккумулятор загружается адрес ячейки rezultat. Затем содержимое аккумулятора А складывается с содержимом счетчика count, после чего результат арифметической операции посылается в индексный регистр H:X. В аккумулятор загружается число, адрес которого указан в ячейке Н:Х, это число из аккумулятора пересылается в ячейку reserve. Далее в аккумулятор загружается адрес ячейки syncro, происходит сложение содержимого аккумулятора с содержимым счетчика count. Результат этой операции посылается в индексный регистр Н:Х. В аккумулятор после этого записывается число, адрес которого указан в регистре Н:Х. В результате происходит сложение содержимого аккумулятора с содержимым ячейки reserve. Таким образом, в аккумуляторе содержится синхронизированный сигнал, который уже можно посылать на вывод.
Сигнал на индикатор поступает с частотой 100 Гц. Эта частота реализуется при помощи модуля TIM08 следующим образом. В биты PS2 PS1 PS0 регистра T1SC записывается код 1 1 0, соответственно. Это необходимо для задания коэффициента деления. Частота тактирования = fbus/64. fbus для МС68HC908GP32 = 8 МГц. Подставляя в формулу, указанную выше, находим, что частота тактирования = 125000 Гц. В самой подпрограмме прерывания необходимо организовать цикл, в котором таймер-счетчик прокручивается 1250 раз. После 2-го раза таймер-счетчик необходимо остановить. Таким образом, частота сигнала, поступающего на индикатор, = 125000/1250 = 100 Гц.