В устройствах и системах управления объектами события в объекте фиксируются с помощью датчиков цифрового и аналогового типов. Наибольшее распространение имеют двоичные датчики типа да/нет, которые подключаются к микроконтроллеру, как показано на рис.6.1.
Ожидание статического сигнала от датчика
Типовая процедура ожидания события состоит из следующих действий:
-ввода сигнала от датчика,
-анализа значения сигнала
-передачи управления в зависимости от состояния датчика.
На рис.6.1.б) показан алгоритм процедуры ожидания события, фиксируемого замыканием контакта датчика. Конкретная программная реализация процедуры зависит от того, каким образом датчик подключен к микроконтроллеру.
В зависимости от способа подключения датчика при его замыкании он может формировать на входе микроконтроллера сигнал высокого (рис.6.1.а) или низкого уровня (на схеме поменять местами S1 и R1).
+5В
WAIT
S1 ко входу МК
S1 замкнут?
нет
R1
U
выход
S1 замкнут
S1 разомкнут
t
а) б)
Рис.10.1Двоичный датчик
Программа реализации процедуры замыкания датчика рис. 6.1., подключенного к 1-му разряду PORTB:
WAIT
BTFSS PORTB,1 ; ЕСЛИ контакт датчика разомкнут
GOTO WAIT ; ТО повторить ввод
…….. ……. ; ИНАЧЕ выход из процедуры
Опрос группы двоичных датчиков
Микроконтроллеры чаще всего имеют дело с группой автономных (логически независимых) или взаимосвязанных (формирующих двоичный код) датчиков. При этом микроконтроллер может выполнять процедуры опроса датчиков и передачи управления отдельным фрагментам программы в зависимости от принятого кода.
При опросе датчиков передачу управления удобно осуществлять по таблице переходов (вычисляемый переход). Ниже приведен текст программы, осуществляющей передачу управления одной из трех программ, в зависимости от кодовой комбинации двух датчиков:
MOVFW PORTA ; ввод информацииотдатчика
ТАВ ADDWF PCL,f ; вычисляемый переход (PCL=PCL+W+1)
GOTO EXIT ; датчики не сработали
GOTO PROC1 ; передача управления
GOTO PROC2 ; процедурам
GOTO PROC3 ; 1, 2, 3
EXIT
…. …… ; выход
Адрес строки таблицы, в которой хранятся адреса переходов, находится как сумма текущего состояния программного счетчика PCL и W-регистра, содержащего номер сработавшего датчика. В результате будет выполнена команда GOTOPROC, отстоящая от ADDWF PCL,F на величину кода из W+1.
А дальше: сработал первый датчик - исполнился PROC1 (что-то запищало), сработал второй - исполнился PROC2 (что-то заморгало), сработали оба - исполнился PROC3 (что-то закрутилось) и т.д. Вариантов может быть великое множество.
Применение кнопок
Если планируется не более 6 кнопок, разумно использовать прямое соединение каждой кнопки с выводом микроконтроллера и общим проводом. Реализовать реакцию на нажатие, удерживание и отпускание кнопок в программе можно следующим образом:в цикле ведется постоянный опрос портов, к которым подключены кнопки. Прочитанная 1 говорит о том, что кнопка нажата (в отпущенном состоянии читается 0). Если прочитали 1, то запускается процедура обработки этой кнопки.
В простейшую обработку входит:
· Ожидание нажатия кнопки
· Проверка на дребезг
· Реакция на нажатие
· Ожидание освобождения кнопки
Проверка на дребезг кнопки состоит из задержки и повторной проверки нажатия. Задержка может быть до 50 мс (подбирается экспериментальным путем). Если нажатие подтверждено, тогда переходим к реакции на нажатие. Как реагировать, решаете вы. Возвращаться к опросу нельзя, пока не отпущена кнопка, поэтому в цикле ждем ее освобождения.
;======================================
; KEYBRD – Простейшая клавиатура
;======================================
; Кнопка подключена к РОRТВ<0>
; определение рабочих регистров-------------------------
; ожидание освобождения кнопки 1------------------------
OFF_1
BTFSC PORTB,1 ; ЕСЛИ кнопка 1 освобождена (=0),
GOTO OFF_1 ;
GOTO BEGIN ; ТО к опросу порта
; конец всем командам-----------------------------------------
END
Рис. 10.2. Программа реализации работы кнопки
Клавиатура
Многие МК системы работают по заранее заданной программе без вмешательства человека. Наряду с этим существуют интерактивные МК системы, включающие в контур управления оператора.
В качестве устройств ввода информации наиболее широкое применение получили простейшие, цифровые, алфавитно-цифровые и специальные клавиатуры:
1. -простейшие, состоящие из клавиш типа СБРОС, ПУСК, СТОП и т.п.
2. - цифровые, предназначенные для ввода данных и управления режимами и состоящие из шестнадцатеричной клавиатуры и управляющих клавиш: ЗАГРУЗКА, АДРЕС/ДАННЫЕ, ПОШАГОВЫЙ РЕЖИМ, ИНДИКАЦИЯ и т.п.
3. - алфавитно-цифровые
4. - специализированные клавиатуры, в которых каждая клавиша соответствует процессу управления: ПОВЫСИТЬ ДАВЛЕНИЕ В МАСЛЯННОЙ МАГИСТРАЛИ, ПОНИЗИТЬ ТЕМПЕРАТУРУ ОХЛАЖДАЮЩЕЙ ЖИДКОСТИ и т.п.
Цифровая клавиатура
Процедура опроса импульсных датчиков состоит из последовательности действий:
ожидание замыкания одного из контактов,
устранение дребезга,
ожидание отпускания замкнутого контакта.
Сдвиг PORT_B вправо
Сброс счетчика сдвигов
НАЧАЛО
нет
CС= СС +1
С = 1?
ВЫХОД
Рис. 10.3Алгоритм процедуры Преобразование кодов
Для группы двоичных датчиков, представляющих собой клавиатурный регистр, процедура работы KBRD приведенная на Рис.6.2.дополнена процедурой идентификации нажатой клавиши. Можно ее и дополнить защитой от одновременного нажатия двух и более клавиш CHEK.
Программная реализация процедуры для случая подключения импульсных датчиков KBRD приведена ниже. Преобразование десятичного кода нажатой клавиши в двоичный код выполняется программно методом сдвига исходного десятичного кода и подсчетом числа сдвигов в счетчике до появления первого переноса. Результат формируется в регистре CODE. Ввод десятичного кода и его сдвиг организован в буферном регистре PORT_B.
; Конец всем командам-----------------------------------
END ; выход из процедуры;
Рис.10.4.
Защиту от множественного нажатия клавиш можно организовать путем анализа содержимого PORT_B после появления переноса с загрузкой экстракода FF в регистр CODE:
CHEK
MOVFW PORT_B ; копировать в W
BTFSS STATUS,Z ; ЕСЛИ нет нажатых клавиш
GOTO $ ; ТО выход
MOVLW 0FFH ; ИНАЧЕ загрузить
MOVWF CODE ; экстракод
GOTO $ ; выход
Матричная клавиатура
Из-за большого объема неунифицированной аппаратуры и ростом ее стоимости, которая резко возрастает с увеличение числа знаков, в МК системах применяются дешевые матричные клавиатуры. Рассмотрим пример организации матричной клавиатуры, состоящей из 12 кнопок. В принципе, ничто не мешает нам использовать столько же линий ввода/вывода. Однако более эффективным решением будет организация этих кнопок в виде матрицы 4 х 3, как показано на рис.6.7.В этом случае количество выводов уменьшается до 7.В случае клавиатур большего размера эта экономия будет ещё, для клавиатуры на 64 кнопки (8 х 8) потребуется всего 16 линий ввода/вывода.
Хотя организация матриц может быть различной, нарис.6.7,а. представлена наиболее типичная. Сигналы с четырех строк считываются с выводов RB<7:5>.Сканирование каждого из столбцов, подключенных к выводам RB<2:0>, осуществляется подачей на соответствующий вывод ВЫСОКОГО уровня, как показано на рис.6.7,в. Кнопки имеют нормально-разомкнутые контакты, поэтому стоит замкнуть кнопку, подключенную к столбцу, на которую подан ВЫСОКИЙ уровень как на соответствующей линии строки тоже появится ВЫСОКИЙ уровень. Таким образом, нажатую кнопку можно определить по пересечению столбца и строки.
SET
MEM
а) клавиатура 3 х 4
1 кОм
RВ6
1 кОм
RВ5
1 кОм
RВ4
10 кОм
RB3
10 кОм
RB2
10 кОм
RB1
10 кОм
RB0
(0) (1) (0)
б) обнаружение кнопки «5»
1 0 0 0 1 0 0 0 1
? !?
? ? ?
? ? ?
? ? ?
в) сканирование матрицы кнопок
Рис.10.5. Подключение клавиатуры
Работа программы соответствует следующему алгоритму:
1. Для столбцов = 0 – 2 установить байт сканирования SCAN = 1
- выбрать столбец 0
2. Для строк 0 – 3
- проверить строку: ЕСЛИ 1
-, ТО перейти к шагу 4
- ИНАЧЕ инкрементировать SCANCODE и продолжить проверку строк
3. ЕСЛИ нажатых клавиш не обнаружено, установить SCAN = 1 в следующем столбце
и вернуться к шагу 2
4. Установить SCANCODE
4. Вернуться в начало
ПРОГРАММА: МАТРИЧНАЯ КЛАВИАТУРА
Отсчет начинается с кнопки №1, приэтом на 0-й столбец выставляется напряжение ВЫСОКОГО уровня. По мере проверки каждой строки на ноль содержимое регистра SCANCODE инкрементируется. При отсутствии замыкания (ВЫСОКОГО значения) осуществляется переход к следующему столбцу, для чего значение шаблона SCAN сдвигается на одну позицию влево.
Выход из цикла сканирования происходит в двух случаях:
· Если в процессе сканирования будет обнаружено ВЫСОКОЕ значение. В регистре SCANCODE будет при этом находиться номер нажатой клавиши, который в конце программы копируется в рабочий регистр W.
· Если в результате сдвига рабочий бит шаблона (1) окажется во 2-м разряде регистра PORTB.В этом случае в рабочий регистр W заносится число FF, означающее, что нажатых клавиш не обнаружено.
;**********************************************
;KPD_MATRIX - Матричная клавиатура
;**********************************************
;Сканирует клавиатуру 4х3 и возвращает № клавиши
;№клавишивW, [SET]=B,[0]=CMEM=D
;Возвращает 1 если не было нажатой клавиши
;***********************************************
SCANCODE EQU 0CH
SCAN EQU 10H
;инициализация----------------------------------
BSF STATUS,RP0
MOVLW B'11110000'
MOVWFTRISB
BCF STATUS,RP0
;формирование исходного значения скэн-кода-------
BEGIN
MOVLW B'00000001';начальное
MOVWF SCAN ;значение
MOVLW 1 ;первая
MOVWF SCANCODE;клавиша - "1"
START
MOVFW SCAN ;считываем шаблон из памяти
MOVWF PORTB ;выдаем на строку высокий уровень
;Теперь проверяем каждую строку----------------
BTFSC PORTB,4 ; ЕСЛИ единица
GOTO ON ; ТО клавиша обнаружена на 1ой строке
INCF SCANCODE,f ;ИНАЧЕ инкрементируем счетчик
BTFSC PORTB,5 ; ЕСЛИ единица
GOTO ON ; ТО клавиша обнаружена на 2ой строке
INCF SCANCODE,f ;ИНАЧЕ инкрементируем счетчик
BTFSC PORTB,6 ; ЕСЛИ единица
GOTO ON ; ТО клавиша обнаружена на 3ей строке
INCF SCANCODE,f ;ИНАЧЕ инкрементируем счетчик
BTFSC PORTB,7 ; ЕСЛИ единица
GOTO ON ; ТО клавиша обнаружена на 4ой строке
INCF SCANCODE,f;ИНАЧЕ инкрементируем счетчик
; ЕСЛИ нет нажатых клавиш------------------------------------
RLF SCAN,f ;сдвигаем шаблон
BTFSS PORTB,2 ;ЕСЛИ не появилась 1 в 3-ом бите
GOTO START ;ТО переходим к следующей строке
; ИНАЧЕ на клавиатуре нет нажатых клавиш-----------------------
MOVLW H’0FF’ ;код FF
MOVWF SCANCODE ;вSCANCODE
GOTO BEGIN;
ON
MOVFW SCANCODE ;копируемSCANCODEв W
GOTO START ;
Идентификация нажатой клавиши.Для сложных клавиатур SCANCODE не всегда удается совместить с истинным кодом клавиши. В этом случае необходима дополнительная перекодировка, которая выполняется табличным способом с использованием W в качестве указателя.
CALL TAB ; перекодировка
MOVWF SCAN ; возврат скэн кода
GOTO $ ; завeршить
TAB
ADDWF PCL,f ; вычисляемый переход
RETLW B’скэн код клавиши’
RETLW B’скэн код клавиши’
RETLW B’скэн код клавиши’
ВЫВОД И ОТОБРАЖЕНИЕ ИНФОРМАЦИИ
Многие МК устройства требуют наличия только простейшей индикации типа ДА/НЕТ, ВКЛ/ВЫКЛ. Такая индикация реализуется на основе простейших светодиодов. Имеется много разновидностей цифровых и буквенных индикаторов.
рис. 10.6.Семисегментный индикатор: а - внешний вид; 6 - схемы; в, г - способы подключения
Семисегментные индикаторы (ССИ) широко используются для отображения цифровой и буквенной информации. Семь отображающих элементов позволяют высвечивать десятичные и шестнадцатеричные цифры, некоторые буквы русского и латинского алфавитов, а также некоторые специальные знаки. Структура ССИ и способы его подключения к МК показаны на рис. 6.1. Для засветки одного сегмента большинства типов ССИ необходимо обеспечить протекание через сегмент тока 10-15 мА при напряжении 2,0—2,5 В.В качестве промежуточных усилителей тока могут использоваться логические элементы серии К155 или интегральные схемы преобразователей кодов для управления ССИ.
Преобразование двоичных кодов в коды для ССИ может осуществляться либо программно, либо аппаратурно с использованием преобразователей К514ИД1, К514ИД2, 133ПП4, 564ИД5рис.6.8.г.
Матричные светодиодные индикаторы (МСИ) используются для отображения алфавитно-цифровой информации. Каждый из таких МСИ, выполненный в виде интегральной микросхемы, представляет собой матрицу светодиодов размерностью т хп, где п — число колонок, т- число строк матрицы. Наибольшее распространение получили МСИ с размерностью матрицы 7х5 и 9х7 (рис. 7.5).
Матричные светодиодные индикаторы (МСИ) используются для отображения алфавитно-цифровой информации. Каждый из таких МСИ, выполненный в виде интегральной микросхемы, представляет собой матрицу светодиодов размерностью т хп, где п — число колонок, т- число строк матрицы. Наибольшее распространение получили МСИ с размерностью матрицы 7х5 и 9х7 (рис. 7.5).
Для отображения многосимвольной информации используются линейные (однострочные) дисплеи. Такие дисплеи представляют собой линейку, смонтированную из отдельных ССИ. Число знаков определяется в соответствии с требованиями к МК – системе.
Существует два способа организации интерфейса МК с линейным дисплеем: статический и динамический.
Вывод символа на ССИ
Статический способ требует наличия на входах каждого индикатора специальных буферных регистров для хранения кодов выводимых символов. Естественно, что с увеличением разрядности дисплея возрастает число дополнительных микросхем, а следовательно, и стоимость МК-системы.
При использовании внешних схем преобразователей кодов процедура индикации одного символа сводится к выдаче двоичного кода символа в соответствующий порт вывода МК.
При программной перекодировке МК должен поставить в соответствие двоичному коду индицируемого символа определенный байт индикации (БИ), который выдается в выходной порт. Перекодировку удобнее всего производить табличным способом. Для этого байты индикации должны располагаться в смежных ячейках памяти программ в порядке возрастания двоичных кодов символов.
DC7 ADDWF PCL,F ;вычисляемый переход, W содержит
------------------------------------------------- ;двоичный код символа
RETLW B'0111111' ; Цифра 0
RETLW B'0000110' ; Цифра 1
RETLW B'1011011' ; Цифра 2
RETLW B'1001111' ; Цифра 3
RETLW B'1100110' ; Цифра 4
RETLW B'1101101' ; Цифра 5
RETLW B'1111101' ; Цифра 6
RETLW B'0000111' Цифра 7
RETLW B'1111111' ; Цифра 8
RETLW B'1101111' ; Цифра 9
ПРОГРАММА: СУММИРУЮЩИЙ ДЕСЯТИЧНЫЙ СЧЕТЧИК
Программа считает число нажатий кнопки с отображением результата в регистре FIG1. При нажатии кнопки происходит сравнение FIG1 с константой 9.Если значение FIG1меньше 9, то FIG1 инкрементируется. Когда значение FIG1 достигает 9, регистр FIG1 обнуляется (CLRF FIG1).
Преобразование двоичного кода в код для семисегментного индикатора осуществляется программно с размещением в памяти микроконтроллера таблицы готовых результатов. Каждому двоичному коду соответствует определенный байт индикации, который и выдается в порт В.
После выполнения подпрограммы DC7 в регистре W будет находиться "семисегментный" код цифры, в котором светящимся элементам соответствуют лог.1.
Однако, прежде чем воспользоваться "ответом" из таблицы, необходимо перенести его в один из регистров памяти данных. У микроконтроллеров семейства PICmicro, это делает RETLW K(возврат из подпрограммы с копированием k в W-reg).
Таблицу оформляют в виде подпрограммы DC7. Перед ее вызовом значение кода, который необходимо преобразовать, следует поместить в регистр W:
MOVFW FIG1
CALL DC7
Выполняя первую команду подпрограммы DC7 (ADDWF PCL,F),микроконтроллер добавит к значению программного счетчика (PCL) число из регистра W+1. В результате будет выполнена команда RETLW K,отстоящая от ADDWF PCL,F на величину кода из регистра FIG1.
; цикл освобождения-------------------------------------------
OFF BTFSCPORTB,7 ; ЕСЛИ кнопка освобождена
GOTOOFF ; ИНАЧЕ ожидаем освобождения
GOTOBEGIN ; ТО к опросу порта
; Конец всем командам--------------------------------------
END
Вывод информации на линейный дисплей ССИ
Способ динамический основан на том, что любой световой индикатор является инерционным прибором, а человеческому глазу отображаемая на дисплее информация, если ее обновлять с частотой примерно 20 раз в секунду, представляется неизменяемой. Динамический способ вывода информации на дисплей требует значительно меньших аппаратурных затрат, но более сложного программного обеспечения. Именно этот способ организации вывода информации получил преимущественное распространение в МК-системах.
БАЙТ ИНДИКАЦИИ
старшее знакоместо младшее
P
O
МК R
T
B
Е Е Е
P 4
О 3
R 2
T 1 Е– СИГНАЛ РАЗРЕШЕНИЯ
A 0
Рис 10.7. Линейный дисплей на семисегментных индикаторах
Для вывода следующего символа копировать в W следующий код символа и следующий разряд знакоместа. Для получения яркой и ровной (немигающей) индикации необходимо:
· запретить выборку на время изменения байта индикации в порт В
· регенерировать изображение на каждом знакоместе с частотой 20 раз в секунду, т.е. обращаться к процедуре вывода информации через каждые 50/Nмс, где N – число знакомест на дисплее.
Для динамической индикации группы символов можно воспользоваться программой:
MOVFW CODE ; в W младший код символа
CALL DC7 ; перекодировка
MOVWFPORTB ; вывод байта индикации
PORTA,0 ; выбор младшего знакоместа
CALL DELAY ; длительность
BCF PORTA,0 ; гашение младшего знакоместа
При динамической индикации байт индикации поступает одновременно на входы всех ССИ, образующих линейный дисплей рис.6.13, а выбор знакоместа осуществляемого подачей сигнала разрешения. Для динамической индикации группы символов необходимо выполнять соответствие между разрядами символов и разрядами знакоместа. Максимальное число знакомест линейного дисплея ограничено разрядностью порта А.
ПРОГРАММА: ДВУХРАЗРЯДНЫЙ ДЕСЯТИЧНЫЙ СЧЕТЧИК
Программа выводит на индикаторы текущий счет встречи спортивной игры. Текущий счет встречи находится в регистрах FIG1—младший разряд (единицы) и FIG2 — старший разряд (десятки). Содержимое регистров изменяется при нажатии кнопки СЧЕТ. После перекодировки двоичного кода в семисегментный он выводится на линейный дисплей на ССИ. Схема подключения дисплея к МК показана на Рис.2.
По метке BEGIN программа циклически анализирует состояние кнопок СЧЕТ (RВ7), СБРОС (RА4), и осуществляет выводит состояние регистров-счетчиков (FIG2 и FIG1) на ССИ.
При нажатии кнопки СЧЕТ (RВ7) выполняется процедура устранения дребезга контактов (DRBZG), обработка нажатия (ON) и ожидание освобождения (OFF) кнопки СЧЕТ. Процедура обработки нажатия представлена подпрограммой суммирующего двух разрядного десятичного счетчика (ADD_1) и подпрограммой вывода на ССИ (DISPL).
Перед выводом на дисплей подпрограммой DC7 выполняется перекодировка двоичного кода двухразрядного счетчика в регистрах FIG1—младший разряд (единицы) и FIG2 — старший разряд (десятки) в семисегментный.
Подпрограмма DISPL последовательно подает семисегментный код единиц в виде байта индикации на все ССИ и дает разрешение на работу индикатору единиц (BSF PORTA,0). В течении 10мс индикатор единиц отображает содержимое FIG1, затем гаснет (BСF PORTA,0). Далее на все ССИ подается байт индикации, содержащий семисегментный код десятков и дается разрешение на работу индикатору десятков (BSF PORTA,1). В течении 10мс индикатор десятков отображает содержимое FIG2, затем гаснет (BСF PORTA,1).
После освобождения кнопки СЧЕТ процедура опроса кнопок продолжается и проверяется состояние кнопки СБРОС (RB4). При нажатии кнопки СБРОС состояние регистров-счетчиков (FIG2 и FIG1) обнуляется.