Разделы
Публикации
Популярные
Новые
Главная » Сопряжение цифровых, аналоговых сигналов

1 ... 17 18 19 20 21 22 23 ... 59

мент при напряжении не более +2В. Поскольку дисплей имеет падение напряжения в прямом направлении, равное 1,7 В при 20 мА, надо, чтобы позиционные усилители (сток) могли понижать напряжение на выбранной катодной линии не менее чем до 0,3 В при токе 140 мА (все

Шкна данных

Фиксирующая схема, Б-разрядно2 7-сегментноз 7-сегментный дешяф- 11,7 В/сегмент) устройства ратор, драйвер СИД индикации

л---.

9368

NA55ZO


Финсир\/И1-П

щая схема LSI74

Л

Драйверы 75494 г/и=о,г5 5

4 = 0.25 A

Значение разряда вывода Очистка разряда Выбор позиция *>1еод^ cpoкcтвa

разряда йывода

Рис, 11*9. 6-канальны& счетчик: схема управления дисплеем.

7 сегментов высвечены, 20 мА/сегмент). Это значит, что здесь нельзя использовать чип драйвера Дарлингтона (например, широко известную схему 75492), и мы вынуждены применить схему 75494, которая насыщается при напряжении не более 0,25 В при токе 0,25 А,

11.6. Программирование 6-канального счетчика событий

Всю задачу по программированию мы разобьем сверху вниз на отдельные частные задачи; это значит, что начнем мы с определения главных задач всей работы, порядка их выполнения и протокола обмена информацией между соответствующими главными программными модулями. Как часть такого подхода, мы составим блок-схему организации решения всей задачи. Затем мы напишем отдельные программные модули (которые часто будут соответствовать отдельным подпрограммам) и проверим работу каждого из них по отдельности. Наконец, мы соединим их в одну окончательную программу и проверим ее работу.



Глйт }}

Организация задачи. Наша программа должна выполнять следующие основные действия: (а) Периодически проверять состояние триггеров ввода и таким'образом узнавать, приходили ли на них с момента предыдущей проверки пересчитываемые импульсы; если да, то увеличивать результат счета в соответствующей ячейке памяти, (б) Периодически проверять состояние переключателя индикации каналов, (в) Обновлять данные на дасплее. На порядок выполнения этих действий, вообще говоря почти произвольный, существуют два ограничения. Во-первых, обновлять данные на дисплее надо с постоянной частотой, чтобы сохранять постоянной яркость его свечения; здесь следует учитывать, что на обновление данных в каждом из разрядов дисплея должно уходить одно и то же время. Во-вторых, наибольшая допустимая частота прихода входных импульсов {т. е. максимальная скорость счета) определяется наибольшей из задержек между проверками входных триггеров. Обычно в программировании ограничивающим фактором является объем памяти, но в данном примере все ограничения связаны исключительно с этими двумя условиями.

Ввести поло-хение переключателя наналов

Вывести иа дисплей разряд 5

Обновить данные во всех 6 с/етчинач


8ывест 4 на дисплей разряд 4

Вывести на

Вывести на

дисплей

дисплей

разряд 0

разряд!

8ЫЕ5СТИ на дисплей разряд 3


Вывести на дисплей разряд 2

Рис. 1!Л0- Последовательность выполнения программы для 6-канального счетчика.

Способ эффективного решения задачи, который мы здесь предлагаем, проиллюстрирован на рис. 11.10. Мы обновляем содержимое счетчиков с максимально возможной частотой, поэтому между двумя такими

(программа включения)

LOOP: CALL COUNT CALL DISPLA JMP LOOP

Программа 11.8

; проверить триггеры и увеличить содержимое памяти

t вывести на дисплей число или проверить переключатель



последовательными обновлениями производятся только самые короткие из возможных операций по обновлению показаний дисплея. Блок-схема на рис. 11.11 описывает всю процедуру в целом.

Наш подход сверху вниз позволяет сразу написать программу (программа 11.8). Максимальная скорость счета определяется наибольшим временем, которое может потребоваться на выполнение всех команд внутри цикла. Во время действия прибор не делает ничего, кроме счета и индикации. Очистка содержимого счетчиков происходит при включении программы.

Теперь мы готовы к тому, чтобы определить протоколы обмена данными между модулями, нужные для написания основной программы и подпрограмм. Прежде всего мы распределим объем памяти ЗУПВ. Нам надо разместить в ЗУПВ результаты счета для шести каналов счетчика, а также указатели выбранного для и дикации канала и позиции высвечиваемого разряда дисплея. Выбор такого распределения памяти показан на рис. 11.12. Мы выделяем по четыре байта (шесть разрядов плюс переполнение) в ЗУПВ на каждый из шести каналов счетчика. Указатель позиции разряда размещен в следующей ячейке памяти, а в двух следующих за ней ячейках - указатель кана- ла. Для удобства пользования ассемблером этим ячейкам присвоены символические имена CNTRB, POINTER и CHANNEL. Различные программы будут передавать друг другу данные

(включение)

ц Обновить счетчиков


7величить номер позиции и обновить разряд

Очистить разряд и првверить переипн1чатель

Рис. П.П. 6-канальный счетчик, общая блок-схема программы.

V \ i

41 АН

- Счетчик

казат^ль

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

а

О

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

а

г

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

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

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

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

VKaiaieflb канала

пель позиции разряда

-Счетчик 5

- Счетчик 4

- Счетчим 3

-Счетнин 2

- Счетчик

- Счетчик О

3vnBM00H

Рис. 11.12. 6-канальный счетчик: размещение данных в ЗУПВ,



Глаеа 11

через эти ячейки; это и есть протокол обмена информацией между Программными модулями.

Основная программа. Программа П.9-это основная программа. В ее первых четырех строчках символическим ячейкам присваиваются их истинные адреса в ЗУПВ. В следукицих пяти строках истинные адреса присваиваются символическим именам портов ввода/вывода. После того как эти присваивания написаны, мы свободны употреблять соответствующие символические обозначения в программе на языке ассемблера, что делает ее более понятной арн чтении.

КАМ = МееН CNTRe = RAM POINTER = CNTR0 + 4*6 CHANNEL = POINTER +1

NEXT = CHANNEL-i-2

SELECT = 0

DCLR = ee FLOPS = B!

DPOS-=02

DVALUE = 03

ORG = 0000

RESET: LXI SP,RAM+I28 LXI H, RAM MVI C, 80H XRA A

LOOPl: MOV M, A INX H

DCR С JNZ LOOPl

LOOP: CALL COUNT CALL DISPLA JMP LOOP

; программа для 6-канального счетчика событий

; с выводом на 7-сегментиый индикатор

; символические обозначения дли ЗУПВ: ; начальная ячейка ЗУПВ

; место для счетчиков

; указатель разряда дисплея (I байт)

; указатель адреса выводимого на дисплей

канала (2 байт) \ следующая свободная ячейка ЗУПВ

; символические обозначения портов вво-да/вывода

; порт ввода для считывания положения

переключателя каналов ; порт вывода для очистки драйвера дисплея

; порт ввода/вывода для считывания состояния триггеров и их очистки

; порт вывода для позиционного драйвера разряда

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

; ячейка, с которой начинается работа при

включении, начало ПЗУ ; установить указатель стека

5 первая очищаемая ячейка ЗУПВ

; количество очищаемых ячеек ЗУПВ (128)

очистить накопитель

; очистить одну ячейку ЗУПВ

; увеличить иа 1 содержимое указателя ; ячейки памяти

; уменьшить содержимое счегчЕка на 1

; продолжать очистку ЗУПВ, пока она не

будет выполнена ; обновить содержимое всех 6 счетчиков ; вывести на дисплей новое число ; повторять без конца



&ВОД состояния триггеров и сброс

Оператор ORG указывает ассемблеру начальный адрес этой программы. Мы используем в качестве начальной ячейку 0000, поскольку с нее начинается выполнение программы при включении процессора; это встроено в схему микропроцессора 8085 и не может быть изменено. Прежде всего программа загружает в указатель стека его начальное значение, затем очищает ЗУПВ (очищает счетчики) и, наконец, переходит к циклу счета и индикации. Просмотрите внимательно цикл, который очищает ЗУПВ,иубедитесь,чтопонимаете,как он действует.

В отличие от большинства программ для ЭВМ, наша программа не имеет выхода. Его отсутствие - характерная черта программ, предназначенных для управления приборами поскольку жизнь - это нескончаемая работа, работа, работа!

Упражнение Напишите цикл, очищающий 1000 ячеек ЗУПВ, начиная с

ячейкн 2000 Н. Будьте осторожны с двухрсгистровыми операциями, которые не устанавливают флажки.

Считающий модуль. На рис. 11.13 изображена блок-схема подпрограммы, которая проверяет состояние триггеров ввода и соответственно увеличивает содержимое ячеек ЗУПВ. Сначала из порта ввода 1считывается байт (байт FLOPS), каждый бит которого показывает наличие или отсутствие входного импульса в соответствующем канале счетчика. Затем программа очищает триггеры ввода, которые были установлены в 1. Очищать следует лишь те из них, которые с mon;eHTa предыдущей проверки получили входной импульс, поскольку нельзя быть уверенным, что триггеры, не получившие такого импульса в промежутке между проверками, не получат его во время самой очистки (предполагается, что частота прихода входных импульсов на каждый из каналов счетчика не превышает максимальной скорости счета, которую допускает программа). После того как байт FLOPS введен, программа прибавляет к результату счета в каждом из каналов соответствующий бит этого байта, т. е. О или 1. Такая процедура лучше, чем поиск единиц и приращение результатов счета только в каналах с единицами, потому что она обеспечивает независимость времени исполнения подпрограммы от числа принятых входных импульсов итем самым гарантирует постоянство времени свечения каждой цифры на дисплее.

Программа 11.10 представляет собой запись считающего модуля. Эта подпрограмма вызывается из цикла внутри главной программы.

Сдвиг накопителя МЗР-* разряд переноса

Т

Прибавить бит переноса к счетчику в 3vnB (десятичная коррекция)


Q Возврат J

Рис. 11.13. 6-канальный счетчик: блок-схема проверки входных триггеров и приращения счетчиков.



l00p2:

IN FLOPSr MOV B. A CMA

OUT FLOPS

XRA a CMA

OUT FLOPS MVI C, 6 LXI H, CNTR0 MOV A, В RRC

MOV B, A

MVI A, e<J

ADC M DAA

MOV M, A INX H MVI A, 00 ADC M DAA

MOV M, A INX H MVI A, co ADC M DAA

MOV M, A INX H MVI A, 00

RAL ORA M MOV M, A INX H DCR С JNZ L00P2 RET

; программа для вводе во всех 6 канала* ; и приращения содержимого счетчиков 5 ввести состояние входных триггеров

ь сох^едтть его

инвертировать его

1 сбросить триггеры, на которые пришли импульсы

5 накопитель содержит все единицы ; прекратить импульсы сброса ; счетчик: и 6 каналах обновить данные ; первый канал, первый бай* извлечь состояние входных триггеров * поместить бит из соответствующего входного триггера в разряд переноса ; сохранить состояние триггеров для следующего канала 5 очистить накопитель, сохранив бит переноса

I сложить разряды 0 и 1 с битом переноса S откорректировать для получения упако*

ванного двоично-десятичного сложения 5 поместить ответ обратно в память

; установить указатель в следующий байт 5 сложить разряды 2 и 3 с битом переноса ; поместить их обратно

; сложить разряды 4 и 5

J поместить их обратно

; установить указатель на переполнение

; очистить А, сохранить бит переноса переполнения ; А=1 в случае переполнения ; установить байт переполнения ; записать его

; первый разряд следующего канала 5 исполнить для всех 6 счетчиков

; закончено-возврат в основной цикл Программа 11.10

Она начинается вводом байта из порта FLOPS, затем посредством вывода (в порт FLOPS) обращения этого байта производится очистка установленных в 1 триггеров ввода. Заметим, что состояние сбрасывающих входов этих триггеров тем самым фиксируется. Поскольку нам нужен сбрасывающий импульс, а не сигнал постоянного уровня, ко-



торый можнб снять с фиксирующей схемы, для прекращения этого сигнала (и превращения его в импульс) пршшдится высылать байт, целиком состоящий из единиц. Такой прием можно было бы назвать программным импульсом . Так как операции ввода/вывода используют накенитель, байт FLOPS временно сохраняется в регистре В.

Далее программа засылает в регистр С длину цикла (6), а в пару HL - адрес первой ячейки памяти счетчика. Затем она входит в цикл, увеличивающий результаты счета в памяти. Каждое прохсш-дение области действия этого цикла обновляет содержимое всех ячеек памяти одного из каналов. Для обновления содержимого ячеек производится десятичное сложение с многократной точностью по 2 десятичных разряда в каждом из трех байтов (всего 6 разрядов на канал). Сам цикл состоит из трех повторений группы команд

MVI А,0& ADC М DAA

MOV М,А 1NX Н

Заметим, что перед началом выполнения каждой такой группы бит переноса оказывается установленным в 1 в случае переполнения во время предшествующих операций (первоначально его значение поступает из входного триггера). Эта группа команд прибавляет к биту переноса содержимое ячейки памяти, а затем производит десятачвую-коррекцию накопителя (DAA), чтобы перед засылкой суммы обратно в память восстановить ее формат (2 д^воично-десятичных разряда в байте). Последнее действие в группе служит для подготовки следующего ее повторения: это-приращение указателя (он теперь указывает следуюидий байт 3-байтового числа).

Модуль вывода на дисплей. На рис. П. 14 приведена блок-схема подпрограммы для Вьшода данных на дисплей и ввода состояния переключателя каналов. Она вызывается из цикла основной программы непосредственно после программы счета и должна обновить число в следующем разряде дисплея, если только к этому моменту не были обновлены данные во всех шести разрядах; в последнем случае подпрограмма вместо обновления данных на дисплее считывает состояние переключателя каналов. Сначала подпрограмма восстанавливает указатель последнего выведенного на дисплей разряда. Если это оказался шестой разряд, производится переход к программе ввода положения переключателя. В противном случае подпрограмма извлекает указатель CHANNEL, устанавливает, которую из половин байта следует вывести на дисплей, и выводит ее.

Программа 11.11 -это запись на языке ассемблера модуля вывода на дисплей. Здесь надо отметить несколько интересных тонкостей. Ячейка CHANNEL уже содержит двухбайтовый указатель первой ячейки ЗУПВ вмайкого канала. Как мы увидим, это является од.



OUT:

DB eemmelB

DB 00000010B DB 00000 lOOB DB 00001000B DB 00010000B

DB 00I00000B

LDA POINTER CP I 06

JNC SWITCH MOV B,A ANA A RAR

PUSH PSW LHLD CHANNEL MOV E.A

MOV D,0 DAD D

POP PSW

MOV A,M JNC WAIT

RAR RAR RAR RAR

MOV C,A XRA A OUT DCLR MOV A,C OUT DVALUE

MOV A,B LXI D,TABLE ADD E MOV E,A

LDAX D

OUT DPOS

5 вывод на дисплей новой цифры на каждом проходе

5 CHANNEL указывает, где в ЗУПВ хранится

1 выбранный канал, а POINTER указывает,

какой разряд надо вывести на ; дисплей

S таблица разрядов для быстрого преобразования

; к формату, нужному для схемы дисплея

; извлечь указатель разряда (0-5)

; перейти к SWITH на 7-м проходе

; сохранить указатель разряда

; очистить бит переноса

; А = указатель/2, бит переноса = указатель

нечетный S сохранить бит переноса в стеке i; начальный адрес выбранного канала 5 собираемся прибавить А к начальному

HL теперь указывает в CHANNEL+1/2 POINTER

извлечь обратно бит переноса (он показывает, какая половина байта нужна) извлечь байт из памяти данного канала правый разряд байта; подождать некото* рое время

5 переместить левый разряд в правую половину

5 сохранить цифру

временно выключить дисплей

извлечь цифру обратно

обновить данные в двоичио-десятичиом 7-сегментном драйвере

извлечь обратно указатель разряда

начальная ячейка разрядной таблицы

прибавить смещение (номер разряда)

указатель строки таблицы в двойном регистре DE

загрузить в А маску для включения соответствующего драйвера

обновить данные на драйвере положения разряда



MOV А. В INR А

STA POINTER RET

WAIT: NOP

JMP OUT

Программа 11.11

J увеличить указатель разряда для следующего прохода

} закончено-возврат в основной цикл

; истратить 4 машинных такта

; истратить еще 10, затем перейти обратно

НИМ из результатов работы программы ввода состояния переключателя каналов. В ячейке POINTER находится число от О до 5, задающее

DISPLAY *

Извлечь указатель разряда

Указатель =;:

,swncH

Нет


Сдвинуть вправо на 4 бит

вывести цифру

Увеличить \((азатель разряда

Погасить лей и,!

аыве-на дисп-ФPV

CbpowTb указатель разряда

Ввести положение переключателя

Остановит канала в 4хзначе ключа

в N/казатель CNTR + ние пбре-теля

Возврат

Возврат J

Рис. 11.14. б-канальный счетчик; Олок-схема вывода на дисплей и ввода положения переключателя.



504 Глаеа 11

позицию, начиная справа, того разряда дисплея, в котором надо обновить число. Обратите внимание на последовательность команд которая определяет нужный байт и нужную половину байта для выводимого на дисплей разряда (взгляните еще раз на рис. 11.12, чтобы напомнить себе расположение разрядов в памяти). Другая интересная деталь - это двухкомандная задерживающая программа с началом по адресу WAIT. Она приблизительно уравнивает время исполнения для случаев, когда разряд оказывается в младшей или в старшей половине байта (в первом случае не нущ1Ы четыре сдвига, и потому программа короче).

В этой программе неожиданно возникает интересная проблема. Дело в том, что позиция разряда записана в ячейке POINTER в виде числа от О до 5, в то время как схема ввода/вывода требует вывода в порт 2 (DPOS) байта с единственным установленным в I битом (см. рис. 11.9). Здесь можно было бы вернуться назад и добавить к схеме двоично-десятичный дешифратор 74LS42 вместе с еще одним шестна-дцатеричным инвертором, о иллюстрирует классическую ситуацию, когда обнаруженное в схеме несоответствие можно устранить либо при помощи дополнительных схем, либо изменяя программу. В данном случае мы предпочитаем программный способ, который позволяет сохранить два чипа (и избежать перечерчивания схемы!). Мы вводим в память, начиная с ячейки TABLE, таблицу с 6 входами, содержащую двоичные числа 00000001, 00000010, и т. д. Программа прибавляет позицию разряда ( смещение ) к начальному адресу таблицы и таким образом находит байт, который должен быть выслан в порт DPOS.

М^хЬуль ввода положения переключателя. На рис. 11.14 показана также блок-схема модуля ввода положения переключателя каналов, который вызывается из модуля вывода на дисплей, если шестой разряд уже был обновлен. Прежде всего модуль гасит находящееся на дисплее число. Это нужно для того, чтобы шестой разряд дисплея светился в течение такого же времени, что и другие разряды дисплея. Затем для подготовки следующего цикла программы DISPLAY устанавливается в О указатель разряда (POINTER). Далее из переключателя каналов вводится байт, который затем преобразуется в число от О до 5, указывающее, содержимое какого из счетчиков надо выводить на дисплей. Чтобы получить это число, программа проверяет по очереди все биты байта, каждый раз увеличивая на 1 содержимое регистра В (счетчик), пока не будет найден единственный единичный бит. Тогда в регистре В окажется номер выбранного канала. Программа заканчивается вычислением первого адреса результата счета этого канала в ЗУПВ, для чего адрес первого канала, CNTRO, складывается с умноженным на 4 номером канала.

Программа 11.12 представляет собой запись на ассемблере модуля ввода положения переключателя. Интересная деталь этой программы- предохранительный бит , который вставляется при помощи логического ИЛИ в байт, введенный из порта переключателя каналов.



1 ... 17 18 19 20 21 22 23 ... 59
© 2004-2025 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки.
Яндекс.Метрика