double arrow

Примечание к выполнению задания.


Цель работы.

Исследовать методы программирования операций ввода-вывода микропроцессора К1816ВЕ48, изучить особенности работы портов P1 и P2, исследовать команды, позволяющие осуществлять одновременный ввод и вывод сигналов через порты, изучить способы подключения 7-сегментных индикаторов к микропроцессору.

Введение.

Специальная схемотехника портов Р1 и Р2, которая получила название квазидвунаправленной, позволяет выполнять ввод, вывод или ввод-вывод. Каждая линия портов Р1 и Р2 может быть программным путем настроена на ввод, вывод или на работу с двунаправленной линией передачи. Для того чтобы настроить некоторую линию на режим ввода в микропроцессор, необходимо перед этим в буферный триггер этой линии записать логическую «1». Сигнал RESET автоматически записывает во все линии портов Р1 и Р2 сигнал «1». Квазидвунаправленная структура портов Р1 и Р2 для программиста К1816ВЕ48 специфична тем, что в процессе ввода информации выполняется операция логического «И» над вводимыми данными и текущими (последними) выведенными данными. Квазидвунаправленные схемы портов Р1 и Р2 и команды логических операций ANL и ORL предоставляют разработчику эффективное средство маскирования для обработки однобитных входных и выходных переменных.




В системе команд микропроцессора К1816ВЕ48 есть команды, которые позволяют выполнять запись нулей и единиц в любой разряд или группу разрядов порта, но так как в этих командах маска задается непосредственным операндом, то необходимо знать распределение сбрасываемых и устанавливаемых линий на этапе разработки прикладной программы. В том случае, если маска вычисляется программой и заранее не известна, в ОЗУ необходимо иметь копию состояния порта вывода. Эта копия по командам логических операций объединяется с вычисляемой маской в аккумуляторе и затем загружается в порт. Необходимость этой процедуры вызвана тем, что в микропроцессоре отсутствует возможность выполнить операцию чтения значений портов Р1 и Р2 для определения прежнего состояния порта вывода. Порт Р2 отличается от порта Р1 тем, что его младшие четыре бита могут быть использованы для расширения микропроцессорных систем по вводу/выводу. Через младшую тетраду порта Р2 по специальным командам обращения возможен доступ к четырем внешним четырехбитным портам ввода/вывода Р4 – Р7. Работа этих внешних портов синхронизируется сигналом PROG.

Многие микропроцессорные устройства требуют наличия только простейшей индикации типа «ДА/НЕТ», «ВКЛ/ВЫКЛ». Такая индикация реализуется на основе отдельных светодиодов. Для отображения цифровой и буквенной информации широко используются 7-сегментные индикаторы. Семь отображающих элементов позволяют высвечивать десятичные и шестнадцатеричные цифры, некоторые буквы русского и латинского алфавитов, а также некоторые специальные знаки. Скажем, нам нужно организовать вывод какого-то числа на 7-сегментные индикаторы. Ну, например, мы делаем часы, или термометр, или еще чего-нибудь. Давайте посчитаем, сколько понадобится проводов, чтобы подключить индикаторы. Кстати, индикаторы выглядят примерно вот так:



Рисунок 1 – 7-сегментный индикатор

Уделим пару слов увиденному. Перед нами – самый обычный светодиодный 7-сегментный индикатор. Вопрос: почему 7-сегментный, когда сегментов на самом деле – восемь? Ответ: потому что 8-й сегмент – это точка, которая не входит в изображение цифры и вообще, является необязательной. Бывают индикаторы и без точек. Для нумерации сегментов используются латинские буквы от A до H. У всех всех-всех 7-сегментных индикаторов в нашем бренном мире, сегменты нумеруются в том порядке, как это показано на рисунке, и никак иначе.

Теперь смотрим на схемы. Во-первых, почему их две? Да потому что индикаторы бывают разные. Бывают – с общим катодом (ОК), бывают – с общим анодом (ОА). Среди забугорных более распространены, как ни странно, индикаторы с ОА. Но встречаются и с ОК. Так что – нужно быть осторожным, чтоб не спутать. Хотя, нам-то все равно. Нашими индикаторами будет управлять микропроцессор. А его можно запрограммировать как на работу с ОК, так и с ОА. Тут сложностей нет.



У каждого индикатора – 9 ножек. С 1 по 8 – выводы сегментов, 9-я – общий. Допустим, мы хотим отображать 4-разрядное число. Надо 4 индикатора. Арифметика маленького Пети: 8·4 = 32. То есть, нам потребуется 32 провода (не считая общие). Неслабо? Ничуть. Тем более, учитывая, что у большинства однокристальных микропроцессоров количество каналов ввода/вывода как раз равно 32 (а в К1816ВЕ48 и вообще всего 24). Как-то меня не очень греет перспектива угрохать все выводы микропроцессора на индикацию. А вас? Ведь надо ж еще куда-то подключить кнопочки, ручечки, датчички и пр. пр. пр., а мало ли чего ещё?

Существует еще одна проблема. Микроконтроллер передает данные внешнему устройству, 7-сегментному индикатору. Подключая к микроконтроллеру внешние микросхемы, всегда нужно проверять, согласуются ли уровни ее входных напряжений с выходными напряжениями микроконтроллера. Для этого находим описание микроконтроллера, желательно оригинальное, в описании с трудом находим раздел электрических характеристик, а там приведены значения выходных напряжений логического нуля Vol (output low voltage) и единицы Voh (output high voltage). Весьма забавно, что данные приведены для определенного напряжения питания и токов, даны минимальные и максимальные значения. Например, в таком виде:

Таблица 1 – D.C. and operating characteristics

Symbol

Parameter

Limits

Unit

Test Conditions

Min. Typ. Max.
VOL Output Low Voltage (BUS, RD, WR, PSEN, ALE)     0.45 V IOL= 1.6 mA
VOL1 Output Low Voltage (P1.0-P1.7, P2.0-P2.7)     0.45 V IOL= 1.2 mA
VOL2 Output Low Voltage (All Other Outputs)     0.45 V IOL= 0.8 mA
VOH Output High Voltage (BUS) 2.4     V IOH= - 0.28 mA
VOH1 Output High Voltage (RD, WR, ALE, PSEN) 2.4     V IOH= - 0.08 mA
VOH2 Output High Voltage (All Other Outputs) 2.4     V IOH= - 0.03 mA

Уровни напряжений для других условий можно оценить по графикам «I/O Pin Current vs Output Voltage».

Рисунок 2 – Зависимость выходного напряжения от втекающего тока.

Микроконтроллер может быть или источником, или потребителем тока (то есть ток или вытекает из него, или втекает). Это зависит от того, какой логический уровень установлен на выводе – ноль или единица. Если на выводе логический ноль, то любое положительное напряжение, приложенное к выводу, вызовет втекающий ток. Если на выводе логическая единица, то любое внешнее напряжение, меньше напряжения питания микроконтроллера, вызовет вытекающий ток. Протекание тока сопровождается падением напряжения на внутренних цепях вывода микроконтроллера. Величину падения можно оценить по тем же графикам.

Мы видим, что графики приведены для диапазона токов от 0 до 50 мА, но это вовсе не означает, что через каждый из выводов микроконтроллера может протекать такой ток. Absolute Maximum Ratings в разделе электрических характеристик говорит нам, что максимальный ток через один вывод микроконтроллера не должен превышать 40 мА, а ток по цепи питания не должен превышать 200 мА. Это позволяет оценить, какую нагрузку микроконтроллер способен запитать своими силами. Например, мы можем подключить 8 ярких светодиодов при токе 20 мА, и микроконтроллер не сгорит. При этом для расчета ограничительных резисторов нужно будет учитывать падение напряжения (~ 0,6 В) на выходе микроконтроллера.

8 · 20 мА = 160 мА

Добавим 10 мА собственного потребления, итого: 170 мА < 200 мА.

R = (5 – 0,6 – Vd) / 20 мА,

где Vd – прямое падение напряжения на светодиоде.

Подключим 7-сегментный индикатор непосредственно к микропроцессору. Это стандартная схема с раздельным включением/выключением сегментов. При логической «1» на выходе микропроцессора соответствующий сегмент светится, при логическом «0» – погашен. Сопротивление резисторов R1 ... R8 выбирается так, чтобы суммарный ток через все линии при логической «1» не превышал допустимое по значение 200 мА. Для индикатора с общим катодом схема представлена на рис. 3.

Рисунок 3 – Подключение индикатора с общим катодом к микропроцессору

Для индикатора с общим анодом решение будет аналогичным (см. рисунок 4).

Рисунок 4 – Подключение индикатора с общим анодом к микропроцессору

Можно слегка сэкономить на резисторах. Поставим вместо восьми резисторов, как на рис. 4. только один, но с меньшим сопротивлением. Однако, как следствие, цифры с большим и малым числом сегментов будут иметь разную яркость, например, «1» и «8». Чтобы выровнять яркости, применяют циклы импульсов с одинаковой длительностью, но с разной частотой. Например, для высвечивания цифры «4» выдаётся «бегущая единица» по сегментам «b», «с», «f», «g» со средней частотой. Для цифры «8» частота будет максимальная, а для цифры «1» — минимальная, но выше 25 Гц, чтобы глаз не замечал мерцание. Реализация такого решения представлена на рисунке 5.

Рисунок 5 – Подключение индикатора с общим анодом к микропроцессору

Но можно ли назвать приведенные решения хорошими? Для засветки одного сегмента большинства типов 7-сегментных индикаторов необходимо обеспечить протекание через сегмент тока 10 – 15 мА при напряжении 2,0 – 2,5 В. Низкая нагрузочная способность микропроцессора ограничивает возможность прямого подсоединения с 7-сегментным индикатором. Второй индикатор уже проблематично подключить из-за ограничений по току. Значит, надо использовать промежуточные усилители. В качестве промежуточных усилителей тока могут использоваться логические элементы серии К155. Или для подключение яркого индикатора к источнику повышенного напряжения +9 ... +12В можно использовать БИС К1109КТ63. Способ такого подключения показан на рисунке 6.

Рисунок 6 – Подключение индикатора с помощью БИС К1109КТ63

Если сегменты индикатора потребляют большой ток, например, 50 мА, то следует уменьшить сопротивление резисторов R1... R8 и увеличить их мощность. Сборка транзисторных ключей DA1 может быть заменена аналогичной зарубежной ULN2003. Или можно заменить это отдельными транзисторами КТ817 с резисторами 1 ... 10 кОм между базой и соответствующей линией.

Но на этом проблемы не кончаются. Нам необходимо осуществить преобразование двоичных кодов в коды для 7-сегментного индикатора. Его можно осуществить либо при помощи программы, либо с использованием преобразователей К514ИД1, К514ИД2, 133ПП4, 564ИД5. Кстати, интегральные схемы преобразователей кодов также позволяют повысить нагрузочную способность портов ввода-вывода микропроцессора. Подключение одного 7-сегментного индикатора к микропроцессору с помощью дешифратора КР514ИД2 показано на рисунке 7.

Рисунок 7 – Подключение индикатора с помощью дешифратора КР514ИД2

Кроме преобразования кодов мы получим сокращение числа выходных линий микропроцессора за счёт специализированного дешифратора DD1, имеющего выходы с открытым коллектором.

Но что делать, если надо вывести число из нескольких цифр? Для отображения такой информации используются линейные (однострочные) дисплеи. Такие дисплеи представляют собой «линейку», смонтированную из отдельных 7-сегментных индикаторов. Число знакомест дисплея определяется в соответствии с требованиями к микропроцессорной системе. А хватит ли нам выходов микропроцессора? Каким же методом можно добиться уменьшение числа выходов микропроцессора, задействованных для индикации?

Существует два способа организации интерфейса микропроцессора с линейным дисплеем: статический и динамический. Первый (статический) требует наличия на входах каждого индикатора специальных буферных регистров для хранения кодов выводимых символов. Естественно, что с увеличением разрядности дисплея возрастает число дополнительных микросхем, следовательно, и стоимость микропроцессорной системы. Но с другой стороны, использование буферных регистров разгружает процессор и существенно упрощает программу. Для любителей пользоваться паяльником такая схема подключения для двух индикаторов приводится ниже.

Рисунок 8 – Статическая индикация на регистрах КР1533ИР37

Регистры хранения DD1 и DD2 увеличивают допустимый ток через сегменты на индикаторах HG. Логика работы тут такая: выставляем на восьми линиях порта Р1 код символа для индикатора HG1. На вход С индикатора подаем импульс длительностью 6...30 мс. Данные с порта Р1 запоминаются в регистре, а после окончания импульса регистр становится недоступен для записи, но продолжает выдавать записанные данные на индикатор. Повторить процедуру заново, но уже для индикатора HG2. Резистор R9 важен в момент рестарта микропроцессора. Он принудительно переводит все входы регистров в Z-состояние, предотвращая случайные показания на индикаторах. Про вывод информации на индикаторы можно забыть до следующей процедуры вывода.

Сокращение числа задействованных линий микропроцессора можно реализовать с помощью сдвигового регистра 74HD4094 (или CD4094BE, или КР1561ПР1). На верхних выходах микропроцессора формируется «бегущая единица», но с микросекундными паузами в несколько микросекунд, чтобы успевал смениться код очередной цифры/символа на нижних линиях микропроцессора. Информация в сдвиговый регистр DD1 вводится по линии «D» последовательно во времени за 8 тактов, сообразуясь с сигналами на линиях «S» (строб), «С» (синхро). Например, можно использовать схему П. Гуссенса (см. рис. 9). Сдвиговые регистры DDl ... DDn соединяются последовательно через выходы переноса «Р» и входы «D». Информация во все индикаторы HG1 ... HGn заносится последовательно во времени общим блоком «единиц/нулей». Преимущество этой схемы – статическая индикация, не создающая динамических импульсных помех. Регистры DD1 ... DDn при желании можно заменить дешифраторами 74НС595.

Рисунок 9 – Статическая индикация на сдвиговом регистре 74HD4094

Второй способ (динамический) основан на том, что любой световой индикатор является инерционным прибором, а человеческому глазу отображаемая на дисплее информация, если ее обновлять с частотой хотя бы 24 раз в секунду, представляется неизменяемой. Делаем очень просто: подключаем все индикаторы параллельно. Точнее, сажаем выводы сегментов на общую шину. А общие аноды подключаем раздельно к порту Р1 (рис. 10).

Рисунок 10 –Динамическая индикация

Что происходит? Мы последовательно подаем напряжение на адресные входы индикаторов, и одновременно выдаем в шину 7-сегментный код, соответствующий индикатору, активному в данный момент. Кроме этого, для повышения тока, индикаторы HG1 и HG2 управляются эмиттерными повторителями на транзисторах VT1 и VT2. Динамический способ вывода информации требует значительно меньших аппаратных затрат, но более сложного программного обеспечения. Необходимо, например, использовать подпрограмму задержки времени. И не только… Но именно этот способ организации вывода информации получил преимущественное распространение в микропроцессорных системах. Все. Прекращаю кормить Вас баснями. Сейчас вы пишете программу.

Задание.

В системе управления имеются дискретных четыре датчика, подключенных к младшей тетраде порта P1, датчики могут находиться во включенном состоянии (выдавать сигнал логической «1») и в выключенном состоянии (выдавать сигнал логического «0»). К порту P2 подключены четыре 7-сегментных индикатора, управление которыми осуществляется по линиям P1.4 – P1.7. Разработать электрическую структурную схему. Составить программу, определяющую состояние датчиков, и отображающую порядковый номер датчика на соответствующем индикаторе, если датчик включен, или 0, если датчик выключен.

Примечание к выполнению задания.

Если последняя цифра в номере зачетной книжки четная – индикация статическая, если нечетная – динамическая. Если предпоследняя цифра в номере зачетной книжки четная – использовать двоично-семисегментные дешифраторы, если нечетная – выполнить программное преобразование кодов. Если третья цифра в номере зачетной книжки четная – использовать индикаторы с общим катодом, если нечетная – с общим анодом.

Содержание отчета.

1. Задание.

2. Схема электрическая структурная.

3. Графический алгоритм программы.

4. Текст программы на языке Ассемблер.

5. Выводы по работе.

Контрольные вопросы.

1. Чем отличается порт BUS от портов P1 и P2?

2. Какие команды ввода-вывода существуют для портов P1 и P2?

3. Как в программе определить состояние дискретного датчика?

4. Объясните суть статического способа индикации.

5. Объясните суть динамического способа индикации.

6. Почему 7-сегментные индикаторы нежелательно подключать напрямую к портам микропроцессора?

 







Сейчас читают про: