Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать

5.4 Ожидание внешних событий

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

Ожидание нулевого уровня на входе PINA,7 микроконтроллера производится процедурой:

WAIT_0: SBIC PINA,7 ;если разряд порта установлен в 1, то

RJMP WAIT_0 ; переход на следующую пробу состояния

; PINA,7

По команде SBIC PINA,7 пропускается следующая команда, если значение бита PINA,7 равно нулю. Если значение бита равно единице, то выполняется следующая команда. Итак, если в разряде PINA,7 единица, то выполняется команда перехода к следующей пробе RJMP WAIT_0 и т.д., т.е. выполняется непрерывное сканирование входа. Когда на контакте порта установится уровень нуля, пропускается команда RJMP WAIT_0, т.е. произодится выполнение последующих команд.

Ожидание единичного уровня на входе микроконтроллера производится процедурой:

WAIT_1: SBIS PINA,7 ;если разряд порта сброшен, то

RJMP WAIT_1 ;переход на следующую пробу

По команде SBIS PINA,7 пропускается следующая команда, если значение бита PINA,7 равно единице. Если значение бита равно нулю, то выполняется следующая команда. Итак, если в разряде PINA,7 нуль, то выполняется команда перехода к следующей пробе RJMP WAIT_1 и т.д., т.е. выполняется непрерывное сканирование входа. Когда на контакте порта установится уровень единицы, пропускается команда RJMP WAIT_1, т.е. производится выполнение последующих команд.

Очевидно, что для ожидания отрицательного импульса необходимо использовать обе процедуры: сначала ожидать уровень нуля, а затем ожидать уровень единицы. Для ожидания положительного импульса процедуры необходимо поменять местами.

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

5.5 Обработка динамического дисплея

Для вывода цифровой и символьной информации в встроенных системах используются семисегментные и матричные индикаторы. Семисегментные индикаторы бывают жидкокристаллического и светодиодного типов.

С ветодиодный семисегментный индикатор представляет собой восемь светодиодов с соединенными анодами. Сегменты обозначаются буквами A,B,C,D,E,F,G,H на рис. 1.

Error: Reference source not found

Рисунок 59

Свечение сегмента возникает при подаче на общий вывод положительного напряжения, а на катод сегмента - нулевого.

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

При динамическом способе индикации требуется количество разрядов равное сумме количества сегментов и количества разрядов.

Динамический способ является импульсным и основан на том, что если «мерцание» производится с частотой 50Гц и более, то свечение представляется человеку постоянным. Этот способ требует минимальных аппаратных затрат, обработка динамического дисплея, в том числе и преобразование кодов производится программно.

В динамическом дисплее одноименные сегменты всех индикаторов включены параллельно, образуя сегментную шину, а общие аноды индикаторов образуют шину выбора индикаторов. Таким образом, требуется значительно меньшее количество линий, чем при статическом методе. Обработка дисплея заключается в поочерёдной выдаче на шину сегментов позиционных семисегментных кодов символов и синхронным включением (выбором ) индикаторов. Схема четырехразрядного динамического индикатора представлена на рис.60. Сегментная шина подключена к порту С микроконтроллера, а четыре младших разряда порта D являются разрядами выбора разрядов индикатора. Очевидно, что индикатор должен обрабатываться программой. Исходное состояние разрядов выбора микроконтроллера PD.0-PD.3 единичное. Этими уровнями все четыре транзистора закрыты, аноды разрядов индикатора отключены от источника питания и индикаторы не светятся. Программа выдает в порт С семисегментный код символа для правого (младшего) разряда индикатор, а разряд РD.0 устанавливает в нулевое состояние. Происходит включение младшего разряда индикатора (нулевой уровень открывает транзистор VT4). Свечение производится в течение

Рисунок 60

некоторого времени. Затем программой разряд PD.0 устанавливается в состояние логической единицы, т.е. производится выключение младшего разряда индикатора. Далее выдается в порт С семисегментный код для следующего разряда индикатора, и обнуляется разряд PD.1 микроконтроллера. Открывается транзистор VT3 и происходит включение следующего разряда индикатора. Это состояние удерживается в течение некоторого временного интервала. Далее гасится разряд индикатора и т.д.

Таким образом, сигнал на одной линии выбора представляет собой импульсную последовательность со скважностью равной числу индикаторов.

При частоте «мерцания» 50Гц период импульсов равен 20мс.

На рис.61 представлены временные диаграммы сигналов выбора разрядов для четырехразрядного дисплея. Время свечения одного индикатора

5мс. Характер свечения разрядов индикатора импульсный (мерцание). Если частота мерцания выше 25 Гц, то глаз человека не замечает мерцания.

Так как глаз человека «усредняет» силу света импульсного характера, то для получения нормальной яркости амплитуда тока протекающего через сегменты, должна быть большей, чем при статической индикации. Характеристика зависимости силы света от величины тока является нелинейной.

Рисунок 61

Амплитуда импульса тока в цепи выбора индикатора должна быть в 8 раз (по числу сегментов) больше амплитуды тока в сегменте.

Функция программы – обработчика дисплея: вывод в режиме динамической индикации данных из четырех ячеек ОЗУ, преобразованных табличным способом из двоичного кода в семисегментный, в порт микроконтроллера, к которому подключен четырехразрядный индикатор. Ниже приведен текст программы обработчика дисплея.

.include "m16def.inc"

;***********Definition********************************

.def count = r20

.org 0 ldi r16,low(RAMEND) ;Установка указателя стека на

out SPL,r16 ;максимальный адрес SRAM ATmega16

ldi r16,high(RAMEND)

out SPH,r16

ldi r16,0xff

out portd,r16 ;Погасить все разряды дисплея

out ddrc,r16 ;настройка портов на вывод

out ddrd,r16

Cikl: ldi count,4 ; счетчик числа разрядов индикатора

ldi XH,$00 ;адрес первой ячейки области ОЗУ, в которой

;хранятся данные (ячейки $60-$63)

ldi XL,$60

ldi r20,0xfe ;байт выборки младшего разряда индикатора

Nxt_razr: Ldi r31,High(Tab_code*2);загрузка старшей и младшей

ldi r30,Low(Tab_code*2) ;половин адреса начала таблицы

;кодов символов

ld r1,x+ ;загрузить в R1 первый байт данных из ячейки

;памяти, адрес которой находится в Х и

;подготовить адрес след. ячейки ОЗУ

add r30,r1 ;сложить содержимое регистров R30 и R1 для

;получения адреса ячейки таблицы

;перекодировки, в которой находится

;семисегментный код символа соответствующий

;содержимому отображаемой в данный момент

;ячейки дисплея

ldi r16,0

adc r31,r16;если адрес таблицы больше чем 255, то учтем

;перенос в регистр R31

lpm ;загрузить в R0 семисегментный код из таблицы ;перекодировки (преобр. двоичн. кода в семисегментный)

ldi r16,0xff;погасить разряд индикатора перед загрузкой в порт

out portd,r16;семисегментного кода

out portc,r0 ;выдача семисегм. кода в порт

out portd,r20 ;включить разряд индикатора

rol r20 ;байт выборки следующего разряда индикатора

rcall Time_light ;Задержка свечения разряда индикатора

dec count ;Переход на следующее знач. счетчика

;циклов дисплея

brne Nxt_razr ;След разряд индикатора

rjmp Cikl

Time_light: ;*** Задержка 3,75 мс

ldi r16,2

m3: ldi r17,100

m2: ldi r18,100

m1: dec r18

brne m1

dec r17

brne m2

dec r16

brne m3

ret

Tab_code:

.Db 3,$9f,$25,$d,$99,$49,$41,$1f,1,9,$11,$c1,$63,$85,$61,$71

Таблица 13

Байт данных

A

B

C

D

E

F

G

H

НЕХ -код символа

0

0

0

0

0

0

0

1

1

3

1

1

0

0

1

1

1

1

1

$9F

2

0

0

1

0

0

1

0

1

$25

3

0

0

0

0

1

1

0

1

$D

4

1

0

0

1

1

0

0

1

$99

5

0

1

0

0

1

0

0

1

$49

6

0

1

0

0

0

0

0

1

$41

7

0

0

0

1

1

1

1

1

$1F

8

0

0

0

0

0

0

0

1

1

9

0

0

0

0

1

0

0

1

9

Преобразование двоичного кода данных в семисегментный код производится табличным способом. В программной памяти микроконтроллера директивой .DB размещается таблица семисегментных кодов, соответствующих числовым значениям 0,1,2,… . Значения семисегментных кодов в таблице соответсвуют пространственному размещению сегментов в индикаторе и схеме подключения сегментов к порту С. Например, для того чтобы на индикаторе было изображение символа 0 (включены сегменты ABCDEF), необходимо в порт С поместить значение 00000011 или 3. (Напомним, что сегмент будет включен, если на катод подан уровень логического нуля).

Могут быть составлены семисегментные коды для других значений.