Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
8 Примеры программ обработки данных в МК51
8.1 Примеры использования команд передачи данных.
Пример 8.34. Передать содержимое буфера УАПП и РПД по косвенному адресу из R0:
MOV
@R0,SBUF
; Передача принятого по последовательному каналу
; байта в РПД
Пример 8.35. Загрузить в указатель данных начальный адрес 7F00Н массива данных, расположенного в ВПД:
MOV
DPTR,#7F00H
; Загрузка начального значения указателя данных
Пример 8.36. Загрузить управляющее слово в регистр управления таймером:
MOV
TCON,#00000101B
Пример 8.37. Сбросить все флаги пользователя (область РПД с адресами 20Н-2FН):
MOV
R0,#20H
; Задание начального адреса области флагов
MOV
R1,#0FH
; Счетчик (длина области флагов)
LOOP:
MOV
@R0,#0
; Сброс одного байта (8 флагов)
INC
R0
; Переход к следующему байту
DJNZ
R1,LOOP
; Цикл
Пример 8.38. Запомнить в ВПД содержимое регистров банка 0. Начальный адрес ВПД – 5000Н:
MOV
PSW,#01000B
; Выбор банка регистров 1
MOV
R0,#8
; Загрузка числа байтов (8) в счетчик
MOV
DPTR,#5000H
; Определение начального адреса ВПД
MOV
R1,#0
; Определение начального адреса РПД
LOOP:
MOV
A,@R1
; Пересылка содержимого ячейки РПД,
; указанной R1, в аккумулятор
MOVX
@DPTR,A
; Пересылка из аккумулятора в ячейку РПД,
; указанную DPTR
INC
R1
; Переход к следующему регистру
INC
DPTR
; Приращение указателя адреса ВПД
DJNZ
R0,LOOP
; R0=R0-1, если R0>0, то повторить
Пример 8.39. Обращение к памяти программ. Часто необходимо иметь в памяти программ таблицы готовых
решений. Для возможности работы с такими таблицами, хранящимися в РПП и ВПП, имеются специальные команды
обращения к памяти программ – MOVC. Поясним использование этих команд на следующем примере. Требуется со ставить подпрограмму вычисления синуса угла Х (Х меняется в пределах от 0 до 89 с дискретностью в 1). Наиболее
быстрое вычисление функции можно получить путем выборки готового значения синуса из таблицы. Такая таблица
для диапазона 0-89 займет 90 байтов при погрешности 0.4 %. Каждый байт таблицы будет содержать дробную часть
двоичного представления синуса. Исходным параметром для подпрограммы служит значение угла Х, находящееся в
аккумуляторе:
;ВЫЧИСЛЕНИЕ SIN(X) ПО ТАБЛИЦЕ ЗНАЧЕНИЙ
;ВХОД: (А) ← В ПРЕДЕЛАХ ОТ 0 ДО 89 ГРАДУСОВ
;ВЫХОД (А) ← ДРОБНАЯ ЧАСТЬ ЗНАЧЕНИЯ СИНУСА
SIN:
INC
MOVC
RET
A
A,@A+PC
; Инкремент аккумулятора
; Загрузка значения синуса из таблицы
; Возврат
;ТАБЛИЦА ЗНАЧЕНИЙ СИНУСА
SINUS:
DB
;SIN(0)=0
DB
00000100B ;SIN(1)=0.017
DB
00001001B ;SIN(2)=0.035
……
DB
11111111B ;SIN(89)=0.999
Примечательно, что данная программа обходится без использования указателя данных DPTR. Инкремент А
перед обращением к таблице необходим из-за наличия однобайтной команды возврата, расположенной между командой MOVC и началом таблицы значений синуса.
Пример 8.40. Операции со стеком. Механизм доступа к стеку МК51 аналогичен МК48: перед загрузкой в стек
содержимое регистра-указателя стека (SP) инкрементируется, а после извлечения из стека декрементируется.
По сигналу системного сброса в SP заносится начальное значение 07Н. Для переопределения SP можно
воспользоваться командой MOVSP, #1FН.
Таким образом, стек может располагаться в любом месте РПД. Стек используется для организации обращений
к подпрограммам и при обработке прерываний, может быть использован для передачи параметров подпрограмм и для
временного хранения содержимого регистров специальных функций.
Подпрограмма обработки прерывания должна сохранить в стеке содержимое тех регистров, которые она сама
будет использовать, а перед возвратом в прерванную программу должна восстановить их значения.
Подпрограмма обработки внешнего прерывания уровня 0 может, например, иметь следующую структуру:
ORG
3
; Задание адреса вектора прерывания
SJMP
SUBINO
; Переход на подпрограмму обработки
ORG
30H
SUBINO:
PUSH
PSW
; Сохранение в стек PSW
PUSH
ACC
; Сохранение аккумулятора
PUSH
B
; Сохранение В
PUSH
DPL
; Сохранение DPTR
PUSH
DPH
MOV
PSW,#1000B ; Выбор банка регистров 1
…….
; В теле подпрограммы количество записей в стек
…….
; должно быть равно количеству чтений из стека
POP
DPH
; Восстановление DPTR
POP
DPL
POP
B
; Восстановление В
POP
ACC
; Восстановление аккумулятора
POP
PSW
; Восстановление PSW (в том числе и регистрового банка)
RETI
; Возврат из подпрограммы обработки прерывания
Если предположить, что SP перед возникновением прерывания содержал значение 1FН, то размещение регистров в стеке после входа в подпрограмму обработки будет таким, как на рис.8.1.
Адрес РПД
7FH
P1.0-P1.3
26H
DPH
25H
DPL
24H
B
23H
A
22H
PSW
21H
PCH
20H
PCL
(SP)
1FH
00H
Рис.8.1 - Содержимое стека после
выполнения команды CALL и серии команд
PUSH
Данные
Строб Р 1.4
Ответ Р 1.5
Порт 1
7
6
5
4
3
2
1
Выводимое число
Ввод ответа
Вывод
строба
Ввод ответа
Рис.8.2 - Протокол передачи и распределения бит
порта 1
8.2 Примеры использования команд арифметических операций
Пример 8.41. Сложить два двоичных многобайтных числа. Оба слагаемых располагаются в РПД, начиная с
младшего байта. Начальные адреса слагаемых заданы в RO и R1. Формат слагаемых в байтах задан в R2:
CLR
C
; Сброс переноса
LOOP:
MOV
A,@R0
; Загрузка в аккумулятор текущего байта первого слагаемого
ADDC
A,@R1
; Сложение байтов с учетом переноса
MOV
@R0,A
; Размещение байта результате
INC
R0
; Продвижение указателей
INC
R1
DJNZ
R2,LOOP
; Цикл, если не все байты просуммированы
При сложении чисел без знака на переполнение укажет флаг С, а в случае сложения чисел со знаком – фалг
OV. Время суммирования составит (1+7N) мкс, где N – формат операндов в байтах.
Пример 8.42. Умножение. Команда MUL вычисляет произведение двух целых беззнаковых чисел, хранящихся
в регистрах А и В. Младшая часть произведения размещается в А, а старшая – в регистре-расширителе В. если содержимое В оказывается равным нулю, то флаг ОV сбрасывается, иначе – устанавливается. Флаг переноса всегда сбрасы вается. Например, если аккумулятор содержал число 200 (0С8Н), а расширитель 160 (0А0Н), то в результате выполнения команды MUL АВ, получится произведение 32000 (7D00Н). Аккумулятор будет содержать нуль, а расширитель –
7DH, флаг OV будет установлен, а флаг С – сброшен.
29+2
Пусть требуется умножить целое двоичное число произвольного формата на константу 173. Исходное число
размещается в РПД, адрес младшего байта находится в регистре R0. Формат числа в байтах хранится в регистре R1:
MOV
A,#0
; Сброс аккумулятора
LOOP:
ADD
A,@R0
; Загрузка множимого
MOV
B,#173
; Загрузка множителя
MUL
AB
; Умножение
MOV
@R0,A
; Запись младшего байта частичного произведения
INC
R0
; Приращение адреса
MOV
A,B
; Пересылка старшего байта частичного произведения
; в Аккумулятор
XCH
A,@R0
; Предварительное формирование очередного
; байта произведения
DJNZ
R1,LOOP
; Цикл, если не все байты исходного числа
; умножены на константу
Полученное произведение размещается на месте исходного числа и занимает в РПД на один байт больше. Вре мя вычисления составляет (1+13N) мкс, где N - формат исходного числа в байтах.
Пример 8.43. деление. Команда DIV позволяет производить деление содержимого аккумулятора на содержимое регистра-расширителя. После деления аккумулятор содержит целую часть частного, а расширитель – остаток. Флаги OV и С сбрасываются. При делении на нуль устанавливается флаг переполнения, а частное остается неопределен ным. Команда деления может быть использована для быстрого преобразования двоичных чисел в двоично-кодирован ные (BCD- числа).
В качестве примера рассмотрим программу, которая переводит двоичное число, содержащееся в аккумуляторе,
в BCD-код. При таком преобразовании может получиться трехразрядное BCD-число. Старшая цифра (число сотен) будет размещена в регистре R0, а две младшие – в аккумуляторе:
MOV
B,#100
; Загрузка 100 в «В» для вычисления количества сотен в числе
DIV
AB
; Аккумулятор содержит число сотен, т. е. старшую цифру
MOV
R0,A
; Пересылка в R0 старшей цифры
XCH
A,B
; Пересылка остатка исходного числа в аккумулятор
MOV
B,#10
; Загрузка 10 в «В» для вычисления количества десятков в числе
DIV
AB
; Аккумулятор содержит число десятков, «В» - число единиц
SWAP
A
; Размещение числа десятков в старшей тетраде аккумулятора
ADD
A,B
; Подсуммирование остатка (числа единиц), теперь аккумулятор
; содержит две младшие цифры
Время преобразования составляет 16 мкс.
8.3 Примеры использования команд логических операций
Пример 8.44. Выбрать нулевой регистровый банк:
ANL
PSW,#11100111B
; Сброс битов RS1 и RS0
Пример 8.45. Установить биты 0-3 порта 1:
ORL
P1,#00001111B
; Запись «1» в Р1.0, Р1.1, Р1.2, Р1.3
Пример 8.46. Сбросить биты 0, 2,6 порта 2:
ANL
P2,#10111010B
; Сброс битов 0, 2,6 порта 2
Пример 8.47. Проинвертировать биты порта Р1, соответствующие единичным битам аккумулятора:
XRL
P1,A
; «Исключительно ИЛИ» порта 1 и аккумулятора
Пример 8.48. Проинвертировать биты 7,6,5 порта 0:
XRL
P0,#11100000B
; «Исключительно ИЛИ» аккумулятора и константы
Пример 8.49. Проинвертировать биты 0-3 аккумулятора:
XRL
A,#0FH
; «Исключительно ИЛИ» порта 0 и константы
Пример 8.50. Управление группой бит порта. В РПД находится массив распакованных десятичных цифр. Требуется передать массив внешнему устройству в соответствии с протоколом, поясняемым рис.8.2. для передачи четырех
бит данных используются младшие линии порта 1. Линии Р1.4 и Р1.5 используются как сигналы квитирования. Передачу данных на выход МК сопровождает сигал на линии Р1.4. Внешнее устройство, приняв данные, сообщает об этом
в МК сигналом на входе Р1.5. Биты Р1.6-Р1.7 в процессе передачи данных не должны изменять своего значения. Исходными параметрами для программы являются начальный адрес массива (R0) и длина массива (R1). Неиспользуемые
в программе биты порта 1 необходимо сохранить в неизменном виде:
ORL
P1,#00100000B
; Настройка Р1.5 на ввод
LOOP:
MOV
A,@R0
; Загрузка байта в аккумулятор
ANL
P1,#11100000B
; Сброс данных и строба
ORL
P1,A
; Выдача данных
ORL
P1,#00010000B
; Выдача строба
WAIT:
JNB
P1.5,WAIT
; Ожидание ответа
INC
R0
; Продвижение указателя адреса
DJNZ
R1,LOOP
; Цикл, если не все данные переданы
29+3
8.3.1 Примеры операций с битами:
Пример 8.51. Программная реализация процедуры передачи байта последовательным кодом в МК51 реализуется так:
MOV
R7,#8
; Инициализация счетчика циклов
LOOP:
RRC
A
; Присвоение флагу переноса значения бита А.0
MOV
P1.0,C
; Передача бита
DJNZ
R7,LOOP
; Цикл, если не все биты переданы
Время исполнения программы – 41 мкс, время передачи бита – 5 мкс (скорость 200 кбит/с).
Пример 8.52. Вычислить булеву функцию трех переменных Y=XVW(XV). Переменные X,V и W поступают на лини 2, 1 и 0 порта 1 соответственно. Результат Y необходимо вывести на линию 3 порта 1:
Y
BIT
P1.3
; Спецификация битов порта 1
X
BIT
P1.2
V
BIT
P1.1
W
BIT
P1.0
MOV
C,X
; Ввод Х
ANL
C,/V
; X V
MOV
F0,C
; Запоминание результата в F0
MOV
C,X
; Ввод Х
ORL
C,V
; XV
ANL
C,W
; W(XV)
ORL
C,F0
; (W(XV))(X V)
MOV
Y,C
; Вывод результата
Флаг F0 используется для промежуточного хранения первой конъюнкции XY. Время выполнения программы
составляет 14 мкс.
Пример 8.53. Организовать последовательную передачу данных из аккумулятора на нулевой вывод порта 2.
Передачу необходимо вести в манчестерском коде (каждый бит передается двумя интервалами: первый интервал содержит инверсию бита, второй – прямое значение):
MOV
R0,#8
; Инициализация счетчика битов
LOOP:
RRC
A
; Перенос бита (A.0) в (C)
CPL
C
; Инверсия бита
MOV
P2.0,C
; Передача инверсного значения бита в линию 0 порта 2
CPL
C
; Восстановление прямого значения бита
NOP
; Три пустых команды для выравнивания
NOP
; длительности интервалов
NOP
MOV
P2.0,C
; Передача прямого значения бита в линию 0 порта 2
DJNZ
R0,LOOP
; Цикл, если не все биты переданы
Передача осуществляется младшими битами вперед. Длительность одного интервала равно шести машинным
циклам (6 мкс), время передачи бита равно 12 мкс, время передачи байта – 96 мкс (скорость 83 Кбит/с или
10.4 КБайт/с).
9 Организация взаимодействия микроконтроллера с объектом управления
9.1 Ввод информации с датчиков.
9.1.1 Опрос двоичного датчика. Ожидание события
В устройствах и системах логического управления объектами события в объекте управления фиксируются с использованием разнообразных датчиков цифрового и аналогового типов. Наибольшее распространение имеют двоичные датчики типа да/ нет, например концевые выключатели, которые подключаются к МК как показано на рис.9.1.
Ожидание статического сигнала. Типовая процедура ожидания события (WAIT) состоит из следующих действий: ввода сигнала от датчика, анализа значения сигнала и передачи управления в зависимости от состояния датчика.
На рис.9.2 представлена блок-схема алгоритма процедуры ожидания события, фиксируемого замыканием контакта
двоичного датчика. Конкретная программа реализации процедуры зависит не только от типа МК, но и от того, каким
образом датчик подключен к МК. Он может быть подключен к одной из линий портов МК или к специальным тестируемым входам (Т0, Т1, ЗПР0, ЗПР1).
Например, при подключении датчика к линии бита 3 порта 1 (именуется Р3.1) программа реализации процедуры ожидания замыкания контакта будет иметь вид
WAITO:
29+4
JNB
P1.3,WAITO
; ожидание размыкания контакта датчика
Другим частным случаем типовой процедуры ожидания события является процедура ожидания замыкания контакта, которая может быть реализована следующим образом:
WAITC:
JB
P1.3,WAITC
; ожидание замыкания контакта датчика
Режим прерывания целесообразно использовать только для опроса особо важных датчиков с целью уменьшения времени реакции на исключительную (аварийную ) ситуацию в объекте управления.
+Е
Ключ К
Rогр
WAITC
>
Ввод
a) ТТЛ-схема, оптрон
или схема
Сигнал на входе МК
согласования
уровней сигналов
U К разомкнут
Анализ состояния ключа К
Нет
К замкнут
Да
К замкнут
Выход
б)
t
Рис.9.2 - Блок-схема процедуры
Рис.9.1 - Схема двоичного датчика (а) и сигнал
ожидания события
на его входе (б)
9.1.2 Ожидание импульсного сигнала.
Схема подключения датчика импульсного сигнала аналогична схеме на рис.9.1. Особенность процедуры ожидания импульсного сигнала состоит в том, что МК должен обнаружить не только факт появления, но и факт окончания
сигнала.
Для программирования этой процедуры удобно использовать рассмотренные выше процедуры ожидания события, смонтировав их последовательно в линейную программу. Оформлять процедуры WAITC и WAITO в виде подпрограмм нецелесообразно, так как это удлиняет программу, а длина и, следовательно, время исполнения программы
определяют длительность импульса, который может быть обнаружен программой.
Последовательность склеивания процедур WAITC и WAITO зависит от формы импульса. Для
«отрицательного» импульса ( 1→ 0 →1 ) процедура WAITC предшествует процедуре WAITO , для «положительного»
( 0 → 1 → 0 ) следует за ней.
Ниже приведены примеры программной реализации процедуры ожидания «отрицательного» импульсного
сигнала при подключении датчика к биту 3 порта 1 при условии, что начальное состояние входа – единичное:
WAITC:
JB
P1.3,WAITC
; Ожидание Р1.3=0
WAITO:
JNB
P1.3,WAITO
; Ожидание Р1.3=1
Программная реализация цикла ожидания накладывает ограничения на длительность импульса: импульсы длительностью меньше времени выполнения цикла ожидания могут быть «не замечены» МК. Минимально допустимые
длительности импульсов для различных способов подключения импульсного датчика к МК приведены в табл. 6.1
Способ подключения датчика к МК51
P1, P2, BUS/P0
T0, T1
ЗПР0, ЗПР1
Максимально допустимая длительность импульса
отрицательного
положительного
10/2
12,5/2
5/2
5/2
10/2
5/2
Для обнаружения кратковременных импульсов можно использовать способ фиксации импульса на внешнем
триггере флага (рис.9.3). На вход МК в этом случае поступает не кратковременный сигнал с датчика, а флаг, формируемый триггером. Триггер устанавливается по фронту импульса, а сбрасывается программным путем – выдачей специального управляющего воздействия. Длительность импульса при этом будет ограничена снизу только быстродействием
триггера.
Текст программы приведен ниже:
FLAGIN:
; Процедура ввода флага
ANL
P2,#OFEH ; Формирование импульса сброса триггера
ORL
P2,#01H
WAITC:
JB
P3.4,WAITC ; Ожидание прихода импульса на вход Т0 (Р3.4)
29+5
+Е
+5В
Флаг
D T
Коротки
й
импульс
Q
R
R
ТО
C
&
На вход МК
K
R
&
<
Р2.0
МК
Рис.9.4 - Схема подавления дребезга контактов
Рис.9.3 - Схема фиксации короткого
импульса на триггере флага
9.2 Устранение дребезга контактов.
При работе МК с датчиками, имеющими механические или электромеханические контакты (кнопки, клавиши,
реле, и клавиатуры), возникает явление, называемое дребезгом. Это явление заключается в том, что при замыкании
контактов возможно появление отскока (BOUNCE) контактов, которое приводит к переходному процессу. При этом
сигнал с контакта может быть прочитан МК как случайная последовательность нулей и единиц. Подавить это нежелательное явление можно схемотехническими средствами с использованием буферного триггера (рис.9.4), но чаще это
делается программным путем.
Наибольшее распространение получили два программных способа ожидания установившегося значения:
1) подсчёт заданного числа совпадающих значений сигнала;
2) временная задержка.
Схемы процедур подавления помех от дребезга контактов (DEBOUNCE) при вводе сигнала 0 показаны на рис.9.5.
DEBOUNCE
DEBOUNCE
Загрузка в
счетчик числа
N
нет
К замкнут?
CALL DELAY
Ввод
Выход
нет
К замкнут?
б)
Декремент
счетчика
N = 0?
нет
Выход
а)
Рис.9.5 - Блок-схемы процедур подавления дребезга контактов путем
многократного считывания (а) и с использованием временной задержки (б)
29+6
1. Суть первого способа состоит в многократном считывании сигнала с контакта. Подсчет удачных опросов
(т.е. опросов, обнаруживших, что контакт устойчиво замкнут) ведется программным счетчиком. Если после серии
удачных опросов встречается неудачный, то подсчет начинается сначала. Контакт считается устойчиво замкнутым
(дребезг устранен), если последовало N удачных опросов. Число N подбирается экспериментально для каждого типа
используемых датчиков и лежит в пределах от 5 до 50.
Пример программного подавления дребезга контакта приводится для случая, когда датчик импульсного сигнала подключен к входу Т0 (Р3.4), счет удачных опросов ведется в регистре R3, N=20:
DBNC:
DBNC1:
MOV
JB
DJNZ
R3,#20
; Инициализация счетчика
P3.4,DBNC ; Если контакт разомкнут, то начать отсчет опросов сначала
R3,DBNC1 ; Повторять пока R3 не станет равным 0
2. Устранение дребезга контакта путем введения временной задержки заключается в следующем. Программа,
обнаружив замыкание контакта К, запрещает опрос состояния этого контакта на время, заведомо большее длительно сти переходного процесса. Программа, соответствующая блок-схеме процедуры на рис.9.5,б, написана для случая подключения датчика к входу ТО (Р3.4) и программной реализации временной задержки.
Временная задержка (в пределах 1-10 мс) подбирается экспериментально для каждого типа датчиков и реализуется подпрограммой DELAY.
9.3 Подсчет числа импульсов
Часто в управляющих программах возникает необходимость ожидания цепочки событий, представляемой по следовательностью импульсных сигналов от датчиков. Рассмотрим две типовые процедуры: подсчет числа импульсов
между двумя событиями и подсчет числа импульсов за заданный интервал времени.
9.3.1 Подсчет числа импульсов между двумя событиями.
Эту типовую процедуру удобно проиллюстрировать на конкретном примере.
А) Реализуем программный счетчик импульсов между двумя событиями.
Предположим, что необходимо подсчитать число деталей, сошедших с конвейера от момента его включения до
момента выключения. Факт схода детали с конвейера фиксируется фотоэлементом, на выходе которого формируется
импульсный сигнал (рис.9.6) и подаётся на вход Т0 (Р3.4). Пусть R0 – счетчик деталей. Для простоты реализации программы считаем, что общее количество деталей не превышает 255:
COUNT:
EXIT:
MOV
JB
JNB
JB
INC
JNB
……
R0, # 0
P3.4, $
P3.5, $
P3.5, $
R0
P3.4, COUNT
; обнуление счетчика деталей;
; ожидание включения конвейера;
; ожидание начала импульса;
; ожидание завершения импульса;
; инкремент счетчика деталей;
; продолжить, если конвейер включен.
; Выход из процедуры
По окончании выполнения процедуры в регистре R0 фиксируется число деталей, представленное в двоичном
коде.
+E
К
R
>
MК
T0
Включение
конвейера
Преобразователь
ФЭ
>
T1
Фотоэлемент
Рис.9.6- Схема подключения датчиков микроконтроллеру
29+7
Б) Используем аппаратурный счетчик импульсов между двумя событиями.
Процедура подсчета импульсов может быть реализована иначе, если использовать вход Т1 (Р3.5) не как тестовый, а как вход встроенного в МК счетчика событий (16-разрядный Таймер/Счетчик 1).
В аккумуляторе А и расширителе В фиксируется число деталей, представленное в двоичном коде (максимальное количество деталей 65535):
EXIT:
MOV
MOV
MOV
JB
SETB
JNB
CLR
MOV
MOV
……
TMOD,#01000000B
TL1,#0
TH1,#0
P3.4,$
TCON.6
P3.4,$
TCON.6
A,TL1
B,TH1
; Настройка счетчика 1
; Сброс счетчика деталей (счетчик 1)
; Ожидание пуска конвейера
; Пуск счетчика 1
; Ожидание останова конвейера
; Останов счетчика 1
; Младший байт числа деталей в аккумулятор
; Старший байт числа деталей в регистр В
; Выход из процедуры
9.3.2 Подсчет числа импульсов за заданный промежуток времени.
При решении задачи преобразования число-импульсного кода в двоичный код, при измерении частоты и ли
длительности импульсов, а также в ряде других задач может возникнуть необходимость подсчета числа импульсов за
заданный промежуток времени. Эта процедура может быть реализована тремя различными способами:
А) Программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК;
Б) Программной реализацией временного интервала и аппаратурным подсчетом числа импульсов (на внутреннем таймере/счетчике);
В) Аппаратурной реализацией временного интервала и программным подсчетом число импульсов.
Г) Аппаратурная реализация временного интервала с аппаратурным подсчетом числа импульсов.
А. Первый способ неэффективен и значительно сложнее других, а потому не рассматривается, второй и третий являются альтернативными, поскольку у МК48 имеется только один таймер/счетчик.
Б. При аппаратурной реализации подсчета числа событий импульсный датчик должен быть подключен ко входу Т1 (Р3.5) микроконтроллера. Подсчет импульсов производится аппаратурным счетчиком событий T/С1, а отсчет заданного временного интервала – подпрограммой DELAY:
STDLY:
EXIT:
MOV
MOV
MOV
SETB
CALL
CLR
MOV
MOV
……
TMOD,#01010001B
TL1,#0
TH1,#0
TCON.6
DELY
TCON.6
A,TL1
B,TH1
; Настройка счетчика 1
; Сброс счетчика 1
; Пуск счетчика 1
; Временная задержка
; Останов счетчика 1
; Младший байт числа деталей в аккумулятор
; Старший байт числа деталей в регистр В
; Выход из процедуры
В. При аппаратурной реализации отсчета временного интервала подсчет импульсов производится программным счетчиком R1, а отсчет заданного временного интервала таймером Т/С0:
CTLDYT:
WAITC:
STP:
EXIT:
29+8
MOV
MOV
MOV
MOV
SETB
JB
JB
JNB
INC
JMP
CLR
……
TMOD,#00000001B
TL0,A
TH0,A
R1,A
TCON.4
TF0,STP
P3.4,WAITC
P3.4,$
R1
WAITC
TCON.4
; Настройка режима таймера 0
; Установка таймера 0 на задержку 65536 мс
; Сброс счетчика импульсов R1
; Пуск таймера 0
; Если временной интервал истёк, то к остановке
; Ожидание импульса
; Инкремент счетчика импульсов R1
; К продолжению счёта
; Останов таймера 0
; Выход из процедуры
В приведенном примере таймер настроен на максимально возможный временной интервал 65,536 мс, счетчик
импульсов реализован в регистре R1. Проверка истечения заданного временного интервала осуществляется по флагу
переполнения таймера (TF0). Прерывание должно быть замаскировано.
Поскольку аппаратурный таймер не может реализовать временные задержки длительностью более 65 мс,
«длинные» временные задержки должны реализовываться программно, например, они могут «набираться» из интервалов в 65 мс (или меньших, например, 10 мс) с подсчетом числа прерываний от таймера.
Г. Четвертый (полностью аппаратурный ) способ подсчета числа импульсов требует использования двух аппаратурных счетчиков. На Т/С1 можно выполнять подсчет числа импульсов, а на Т/С0 – отсчет заданного интервала. Датчик импульсов должен быть подключен к входу Т1:
TIME:
WAIT:
EXIT:
EQU
NOT(10000)+1
MOV
CLR
MOV
MOV
MOV
MOV
ORL
JBC
SJMP
MOV
MOV
……
TMOD,#01010001B
A
TH1,A
TL1,A
TH0,#HIGH(TIME)
TL0,#LOW(TIME)
TCON,#50H
TCON.5,EXIT
WAIT
B,TH1
A,TL1
; Определение константы TIME
; для отсчета интервала 10 мс
; Настройка Т/С, 16 бит, Т/С0-таймер, Т/С1-счетчик
; Сброс аккумулятора
; Сброс Т/С1
; Загрузка в Т/С0 константы TIME
; Пуск Т/С1 и Т/С0
; Проверка переполнения Т/С0
; Цикл, если TF0=0
; Старший байт числа импульсов в регистр В
; Младший байт числа импульсов в аккумулятор
; Выход из процедуры
9.4 Опрос группы двоичных датчиков.
Микроконтроллеры чаще всего имеют дело не с одним датчиком, как в рассмотренных выше примерах, а с
группой автономных (логически независимых) или взаимосвязанных (формирующих двоичных код) датчиков (группу
взаимосвязанных датчиков называют композицией). При этом МК может выполнять процедуру опроса датчиков и
передачи управления отдельным фрагментам прикладной программы в зависимости от принятого кода.
Программную реализацию процедуры ожидания заданного кода (WTCODE) рассмотрим для случая подключения группы из восьми взаимосвязанных статических датчиков ко входам порта 1 МК:
Сравнение принятого кода с заданным осуществляется операцией «Исключительно ИЛИ». В приведенном примере заданное число равно 10 (00001010В).
WTCODE:
MOV
A,#10
; Загрузка в аккумулятор заданного кода
WAIT:
CJNE
A,P1,WAIT
; Если кодовая комбинация на входах порта 1
; не совпала с заданным значением, то ждать
EXIT:
……
; Выход из процедуры
При опросе композиции двоичных датчиков передачу управления удобно осуществлять по таблице переходов.
Ниже приводится текст программы, осуществляющей передачу управления одной из восьми прикладных программ
PR0G0-PROG7 (которые расположены в пределах одной страницы памяти программ) в зависимости от кодовой комбинации, набранной на переключателях, подключенных к входам Р1.0-Р1.2:
GOCODE:
MOV
DPTR,BASE
; Загрузка в DPTR начального адреса
; таблицы переходов
IN
A,P1
; Ввод байта
ANL
A,#00000111B
; Выделение младших трёх бит
ADD
A,R0
; Формирование адреса
JMP
@A+DPTR
; Передача управления строке в таблице переходов
BASE:
JMP
PROG0
……
JMP
PROG7
Программа обеспечивает опрос и выделение сигналов от трех датчиков путем маскирования (обнуления) старших бит аккумулятора. Адрес строки таблицы, в которой хранятся адреса переходов, вычисляется командой
JMP @A+DPTR как сумма начального адреса таблицы BASE и кода, принятого от датчиков, умноженного на 2 (т. к. команды JMP PROGх в таблице переходов - двухбайтовые).
При работе с композицией датчиков часто возникает необходимость осуществлять передачу управления не
только в зависимости от двоичного эквивалента принятого кода, как в рассмотренном примере, но и в зависимости от
соотношения принятого кода и некоторой заранее определенной уставки. Пусть, например, в порте 1 от группы двоич -
29+9
ных датчиков формируется восьмибитовый двоичный код. Если код равен десятичному эквиваленту 135, то необходимо передать управление программе с меткой LABELA, а если не равен – программе с меткой LABELB:
MOV
A,#135
; Загрузка уставки
CJNE
A,P1,LABELB
; Сравнение и передача управления
LABELA:
……
9.4.1 Опрос группы импульсных датчиков.
Эта процедура состоит из последовательности действий: ожидания замыкания одного из контактов, устранения
дребезга, ожидания размыкания замкнутого контакта.
Программная реализация процедуры для случая подключения четырех импульсных датчиков ко входам 0-3
порта 1 будет иметь вид:
KBRD:
IN
A,P1
; Ввод кода
CPL
A
; Инверсия кода
ANL
A,#00001111B
; Есть замкнутый контакт?
JZ
KBRD
; Если ни один контакт не замкнут, то ждать, иначе
MOV
R2,A
; Передача принятого кода в R2
DBNC:
CALL
DELAY
; Устранение дребезга (задержкой)
WAIT:
IN
A,P1
; Ввод кода
CPL
A
; Инверсия кода
ANL
A,#00001111B
; Есть замкнутый контакт?
JNZ
WAIT
; Если контакт замкнут, то ждать, иначе
EXIT:
……
; Выход из процедуры
Анализ состояния контактов осуществляется наложение маски на принятый от датчиков код. Для датчиков,
формирующих «отрицательный» импульс, принятый код удобно предварительно инвертировать.
Для группы импульсных датчиков, представляющих собой клавишный регистр, процедура KBRD должна быть
дополнена процедурами идентификации нажатой клавиши и защиты от одновременного нажатия двух и более клавиш.
Идентификация нажатой клавиши может осуществляться двумя способами по таблице или программно. При
табличном способе перекодирования в памяти программ должна находиться таблица двоичных эквивалентов кодов
клавиш.
Программное преобразование унитарного кода, принятого от клавиатуры, в двоичный может быть выполнено
методом сдвигов исходного унитарного кода и подсчетом числа сдвигов на счетчике до появления первого переноса.
Схема алгоритма такой процедуры приведена на рис.9.7.
DELAY
IDNKEY
(CC) ← 0
Загрузка числа Х в
регистр R
Сдвиг (А) вправо
С = 1?
(СС) = (сс) + 1
Да
Да
Нет
(А) = 0?
Выход
С - флаг переноса
СС- счетчик сдвигов
Рис.9.7 - Блок-схема процедуры преобразования
кода
29+10
(R) = 0?
Да
Нет
(СС) ← экстракод
Выход
Декремент регистра R
Нет
Рис.9.8 - Блок-схема процедуры
формирования временной задержки
малой длительности
Программа будет иметь вид:
IDNKEY:
MOV
MOV
CLR
ROTATE:
RRC
JC
CHECK:
EXIT:
INC
JMP
JZ
MOV
……
A,R2
R1,#0
C
A
CHECK
R1
ROTATE
EXIT
R1,#0FFH
; Передача принятого кода в аккумулятор
; Сброс счетчика сдвигов
; Сброс флага переноса
; Сдвиг унитарного кода
; Если возник перенос, то проверка
; на множественное нажатие
; Инкремент счетчика сдвигов
; Продолжение сдвигов
; Если (А)=0, то выход из процедуры
; Занесение в R1 кода одновременного
; нажатия нескольких клавиш
; Выход из процедуры
Результат формируется в регистре R1. В программе предполагается, что в R2 находится инверсия унитарного
кода, принятого от группы датчиков процедурой KBRD. В результате работы программы IDNKEY в R1 буде сформирован двоичный код нажатой клавиши или экстракод FFH «Нажато несколько клавиш».
10 Вывод управляющих сигналов из МК
10.1 Формирование статических сигналов.
Для управления исполнительным механизмом, работающим по принципу включено/выключено, на соответствующей выходной линии порта МК необходимо сформировать статический сигнал 0 или 1, что реализуется командами вывода непосредственного операнда, содержащего в требуемом бите значение 0 или 1.
В случае параллельного управления группой автономных исполнительных механизмов, подключенных к выходному порту, формируется не двоичное управляющее воздействие, а управляющее слова (УС), имеющее формат
байта, каждому разряду которого ставится в соответствие 1 или 0 в зависимости от того, какие исполнительные механизмы должны быть включены, а какие выключены.
Управляющие слова удобно формировать командами логических операций над содержимым порта. Команда
ANL используется для сброса тех битов УС, которые в операнде (маске) заданы нулем. Команда ORL используется для
установки битов УС. Командой XRL осуществляется инверсия битов в соответствии с выражением x1 = x.
Для формирования сложных последовательностей УС удобно пользоваться табличным способом, при котором
все возможные УС упакованы в таблицу, а прикладная программа МК вычисляет адрес требуемого УС, выбирает его
из таблицы и передает в порт вывода.
10.2 Формирование импульсных сигналов.
Управляющее воздействие типа «импульс» можно получить последовательной выдачей сигналов включить и
отключить с промежуточным вызовом подпрограммы временной задержки:
PULS:
; Выдача «положительного» импульса (0→1→0) в линию 3 порта 1
ON:
SETB
P1.3
; Включение исполнительные механизма (Р1.3 ← 1)
CALL
DELAY
; Временная задержка
OFF:
CPL
P1.3
; Отключение исполнительные механизма (Р1.3 ← 0) ……
Длительность импульса определяется временной задержкой, реализуемой подпрограммой DELAY. Другие линии порта 1 не затрагиваются.
10.2.1 Генерация периодического управляющего воздействия (меандра).
Для генерации меандра удобно воспользоваться процедурой выдачи импульсного управляющего воздействия
(PULS) и подпрограммой реализации временной задержки, равной половине периода сигнала (DLYX).
MEANDR:
CPL
P1.3
; Инверсия состояния линии Р1.3
ACALL
DLYX
; Временная задержка
SJMP
MEANDR ; Цикл
Бесконечный периодический сигнал формируется в линии 3 порта 1. На остальных линиях порта 1 сигналы
остаются неизменными.
10.2.2 Формирование апериодического управляющего сигнала.
Последовательность импульсных сигналов с произвольной длительностью и скважностью может быть получена аналогичным образом, т.е. путем чередования процедур выдачи изменяемого значения сигнала (0 или 1) и вызова
подпрограмм временных задержек заданных длительностей.
11 Масштабирование
При вводе и выводе информации часто возникает задача согласования диапазона представления чисел в МК и
во внешней аппаратуре, обеспечивающей связь МК с объектом управления. Эта задача называется масштабированием
и сводится к операции умножения/деления числа на некоторую константу k.
29+11
Масштабирование двоичных кодов, вводимых с цифровых датчиков для последующей обработки в МК или выводимых из МК на исполнительный механизм, можно выполнять с использованием стандартных команд или подпрограмм умножения и деления. Однако во многих применениях более эффективным (по быстродействию и длине программы) может оказаться способ умножения числа на константу путем сдвигов. Данный способ основан на том, что
сдвиг двоичного кода числа на один бит влево (в сторону старших бит) эквивалентен его умножению на 2, а сдвиг на
один бит вправо – делению на 2.
Поясним на двух простых примерах этот прием выполнения процедуры масштабирования. Пусть необходимо
двоичный код Х, полученный от цифрового датчика, умножить на константу 2.5. Результат масштабирования числа может быть получен в соответствии с выражением 2.5 Х= 2Х + Х/2, т.е. путем суммирования сдвинутых влево и вправо
двоичных кодов числа Х:
CLR
C
; Сброс флага переноса
IN
A,P1
; Ввод числа Х
MOV
R2,A
; Создание копии Х в R2
RL
A
; Умножение Х на 2
MOV
R3,A
; Создание копии 2Х в R3
MOV
A,R2
; Восстановление Х в аккумуляторе
RRC
A
; Деление Х на 2
ADDC
A,R3
; Результат в аккумуляторе
Пусть требуется сформированное в аккумуляторе МК управляющее слово Y перед выдачей его в ЦАП умножить (с целью согласования масштабов УС и его аналогового эквивалента) на константу 17. Операция умножения на
17 может быть (в соответствии с выражением 17Y = 16Y + Y) заменена четырьмя операциями сдвига и сложением:
MOV
R3,A
; Создание копии Y в R3
RL
A
; А ← 2Y
RL
A
; А ← 4Y
RL
A
; А ← 8Y
RL
A
; А ← 16Y
ADD
A,R3
; А ← 16Y+Y
Для упрощения примеров программ они составлены в предположении, что при умножении не происходит
переполнения одного байта (результат меньше 255).
В МК51 проблема масштабирования частично снимается, так как имеются быстрые команды умножения и деления байтов (MUL и DIV).
12 Реализация функции времени
12.1 Программное формирование временной задержки.
12.1.1 Временная задержка малой длительности.
Процедура реализации временной задержки использует метод программных циклов. При этом в некоторый рабочий регистр загружается число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех
пор, пока содержимое рабочего регистра не станет равным нулю, что интерпретируется программой как момент выхода из цикла. Время задержки при этом определяется числом, загруженным в рабочий регистр, и временем выполнения
команд, образующих программный цикл. Схема алгоритма такой программы показана на рис.9.8 (смотри раздел 9
выше). Программа имеет символическое имя DELAY.
Предположим, что в управляющей программе необходимо реализовать временную задержку 100 мкс. Фрагмент программы, реализующей временную задержку, требуется оформить в виде подпрограммы, так как предполагается, что основная управляющая программа будет производить к ней многократные обращения для формирования выходных импульсных сигналов, длительность которых кратна 100 мкс:
DELAY:
MOV
R2,#X
; (R2) ← X
COUNT:
DJNZ
R2,COUNT ; Декремент R2 и цикл, если не ноль
RET
; Возврат
Для получения требуемой временной задержки необходимо определить число Х, загружаемое в рабочий
регистр. Определения числа Х выполняется на основе расчета времени выполнения команд, образующих данную под программу. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений
команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В
описании команд МК указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих
данных определяется суммарное число машинных циклов в подпрограмме:
CALL - 2 МЦ,
MOV - 2МЦ,
DJNZ - 2МЦ,
RET - 2МЦ.
Если каждый машинный цикл выполняется за 1 мкс, то подпрограмма выполняется за время
TD = 2+2+2Х+2 = 6+2Х мкс. Для реализации временной задержки 100 мкс число Х = (100-6)/2 = 47.
29+12
В данном случае при загрузке в регистр R2 числа 47 требуемая временная задержка (100 мкс) реализуется точно. Если число Х получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более
точной подстройки в подпрограмму могут быть включены «пустые» команды NOP, время выполнения каждой из которых равно 1 мкс.
Минимальная временная задержка, реализуемая подпрограммой DELAY, составляет TDMIN = 8 мкс (Х=1). Временную задержку меньшей длительности программным путем можно реализовать, включая в программу цепочки команд NOP (1МЦ = 1 мкс).
Максимальная длительность задержки, реализуемая подпрограммой DELAY, составляет TDMAX = 518 мкс (Х=0,
что соответствует 256 циклам).
Для реализации задержки большей длительности можно рекомендовать увеличить тело цикла включением дополнительных команд или использовать метод вложенных циклов. Так, например, если в подпрограмму DELAY пред
командой DJNZ вставить дополнительно две команды NOP, то максимальная задержка составит
TDMAX = 6+Х(2+2) = 6+4×256 = 1 030 мкс (т.е. в два раза больше).
12.1.2 Временная задержка большой длительности.
Схема алгоритма программной реализации временной задержки большой длительности методом вложенных
циклов показана на рис.12.1. Там же обозначено, сколько раз выполняется каждый фрагмент программы. Числа X и Y
выбираются из соотношения Т= 2+2+Х(2+2Y+2)+2, где Т – реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким способом, при Х=Y=256 составляет 132 102 мкс, т.е. приблизительно 132 мс.
MEASURE
DELAY
Загрузка Х в R1
1
Нет
Событие 1?
Да
Загрузка Y в R2
Отсчет времени
Декремент R2
Событие 2?
Нет
Да
Конец отсчета времени
Нет
(R2) = 0?
Y
Х
Да
Выход
Декремент R1
Нет
(R1) = 0?
Да
Выход
1
Рис.12.1 - Блок-схема процедуры временной
задержки большой длительности
Рис.12.2 - Блок-схема процедуры изменения
времени
В качестве примера рассмотрим подпрограмму, реализующую временную задержку 100 мс:
DELAY:
MOV
R1,#199
; Загрузка Х
LOOPEX:
MOV
R2,#248
; Загрузка Y
LOOPIN:
DJNZ
R2,LOOPIN ; Декремент R2 и внутренний цикл если (R2) не равно 0
DJNZ
R1,LOOPEX ; Декремент R1 и внешний цикл если (R1) не равно 0
MOV
R3,#244
; Точная подстройка
LOOPAD:
DJNZ
R3,LOOPAD ; временной задержки (+494 мкс)
29+13
RET
; Возврат
Здесь два вложенных цикла реализуют временную задержку длительностью 6+199(4+2×248) = 99 506 мкс, а
дополнительный цикл LOOPAD реализует задержку 494 мкс [2+2+2×244+2 мкс] и тем самым обеспечивает точную
подстройку временного интервала 10 мс.
12.1.3 Временная задержка длительностью 1 с.
Из рассмотренного примера видно, что секунда является очень большим интервалом времени по сравнению с
частотой тактирования МК. Такие задержки сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку в 1 с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мс:
ONESEC:
MOV
R3,#10
LOOP:
CALL
DELAY
DJNZ
R3,LOOP
Погрешность подпрограммы составляет +55 мкс. Для очень многих применений это достаточно высокая
точность, хотя реализованные на основе этой программы часы астрономического времени за сутки «убегут» примерно
на 5 с.
12.2 Формирование временной задержки на основе таймеров.
12.2.1 Задержка малой длительности.
Недостатком программного способа реализации временной задержки является нерациональное использование
ресурсов МК: во время формирования задержки МК практически простаивает, так как не может решать никаких задач
управления объектом. В то же время аппаратурные средства МК позволяют реализовать временные задержки на фоне
основной программы работы.
В МК51 на вход таймера/счетчика (Т/С) могут поступать сигналы синхронизации с частотой 1 МГц (Т/С в режиме таймера) или сигналы от внешнего источника (Т/С в режиме счетчика). Оба эти режима могут быть использова ны для формирования задержек. Если использовать Т/С в режиме таймера полного формата (16 бит), то можно получить задержки в диапазоне от 1 до 65 536 мкс.
В качестве примера рассмотрим организацию временной задержки длительностью 50 мс в МК51. Предполагается, что бит IE.7 установлен. Организация перехода к метке NEXT при переполнении Т/С0:
ORG
0BH
; Адрес вектора прерывания от Т/С0
CLR
TCON.4
; Останов Т/С0
RETI
; Выход из подпрограммы
; обработки прерывания
ORG
100H
; Начальный адрес программы
MOV
TMOD,#01H
; Настройка Т/С0
MOV
TL0,#LOW(NOT(50000-1))
; Загрузка таймера
MOV
TH0,#HIGH(NOT(50000-1))
; дополнительным кодом числа 50 000(мкс)
SETB
TCON.4
; Старт Т/С0
SETB
IE.1
; Разрешение прерывания от Т/С0
SETB
PCON.0
; Перевод МК51 в режим холостого хода
NEXT:
……
Отсчёт временного интервала начинается командой SETB TCON.4 (старт таймера). Появление сигнала прерывания по переполнению таймера соответствует истечению временного интервала 50 000 мкс. Погрешность перехода к
метке NEXT будет составлять около +6 мкс (время выполнения команды передачи управления по вектору прерывания:
0BH, команды останова Т/С0: CLR TCON.4 и возврата из подпрограммы обработки прерывания: RETI).
12.3 Измерение временных интервалов.
В задачах управления часто возникает необходимость измерения промежутка времени между двумя событиями. Схема алгоритма типовой процедуры измерения (MEASURE) приведена на рис.12.2. Обычно события в объекте
управления представляются сигналами от двоичных датчиков. Считая событиями фронт и спад импульса, можно определять временные характеристики импульсных сигналов: длительность (τ), период (Т) и скважность (Т/τ). Кроме того,
с помощью процедуры MEASURE можно определять скорость перемещения подвижного органа объекта по эталонному (заданной длины) участку. Начало и конец участка должны быть снабжены датчикам (концевыми выключателями).
Простейшим способом измерения длительности импульса является программный. Для обнаружения событий
(фронт и спад импульсного сигнала) в этом случае используются типовые процедуры WAIT, а отсчет времени ведется
программным способом. Для «положительного» импульсного сигнала (0 → 1 → 0), поступающего на вход Т0, программа измерения его длительности будет иметь вид:
MSCONT:
MOV
R7,#0
; Сброс счетчика
WAIT0:
JNB
T0,WAIT0 ; Ожидание фронта сигнала (0 → 1) на входе Т0
COUNT:
INC
R7
; Инкремент счетчика
JB
T0,COUNT ; Ожидание спада сигнала (1 → 0)
EXIT:
……
; Выход из процедуры
29+14
После выхода из процедуры содержимое счетчика (R7) пропорционально длительности импульса.
Для нормальной работы этой программы необходимо, чтобы обращение к ней производилось в моменты, когда
на входе Т0 присутствует сигнал нулевого уровня. Верхний предел измеряемой длительности «положительного» импульса составит 255(1+2)1 мкс=765 мкс. Этот предел может быть увеличен включением в цикл COUNT дополнительных команд NOP. Максимальная погрешность измерений 3 мкс.
Для измерения длительности сигнала может быть использован таймер. Особенно эффективно использование
для это цели таймера в МК51, имеющего вход разрешения счета (альтернативная функция входа ЗПР). Измеряемый
сигнал можно, например, подавать на вход ЗПР0, измерение длительности «положительного импульса» будет выглядеть так:
MOV
TMOD,#00001001B
; Настройка Т/С0
MOV
TH0,#0
; Сброс таймера
MOV
TL0,#0
SETB
TCON.4
; Старт Т/С0
WAIT0:
JNB
P3.2,WAIT0
; Ожидание «1»
WAITC:
JB
P3.2,WAITC
; Ожидание «0»
CLR
TCON.4
; Стоп Т/С0
EXIT:
……
; Выход из процедуры
Управление программе должно быть передано при условии, что на входе ЗПР0 присутствует низкий уровень.
Прерывание от Т/С0 и внешнее прерывание по входу ЗПР0 должны быть запрещены. По завершению программы в
Т/С0 будет находиться число, пропорциональное длительности «положительного» импульса на входе ЗПРО. Верхний
предел измерения равен 65 536 мкс, а максимальная погрешность 1 мкс.
При необходимости измерения временных интервалов большей длительности можно программным способом
подсчитывать число переполнений от таймера, т.е. расширять его разрядность за счёт рабочего регистра или ячейки
РПД.
13 Преобразование кодов
В задачах управления может возникнуть необходимость преобразования информации из одной формы представления в другую. Это связано с тем, что обработка данных в МК осуществляется в параллельном двоичном коде, а
поступать в МК и выводиться из него информация может в иной форме представления.
Наиболее распространены в задачах логического управления следующие преобразования:
- из унитарного кода в двоичный (при вводе информации с клавиатуры или оцифрованных переключателей) и
из двоичного в унитарный;
- из одной системы счисления в другую (при работе со специальными клавиатурами);
- специальные преобразования (для организации индикации и при выводе информации на периферийные
устройства);
- из последовательного кода в параллельный (при вводе) и из параллельного в последовательный (при выводе);
- из аналоговой формы представления в цифровую и наоборот (для связи с аналоговыми датчиками и исполнительным механизмами).
13.1 Простейшие преобразования.
13.1.1 Преобразование унитарного кода в двоичный позиционный.
Двоичный эквивалент унитарного кода равен номеру бита, в котором находится единственная единица. Поэтому преобразование унитарного кода в двоичный позиционный удобно осуществлять путем сдвига исходного унитарного кода в сторону младших бит с одновременным подсчетам числа сдвигов. При «выдвигании» из младшего бита значения «1» сдвиги прекращаются, а в счетчике сдвигов будет содержаться двоичный эквивалент унитарного кода (смот ри п, 9.4).
13.1.2 Преобразования двоичного позиционного кода в унитарный.
Необходимость такого преобразования возникает, например, при выборке одного из исполнительных
устройств, мультиплексирующих шину BUS (Р0), по его номеру.
Пусть, например, требуется преобразовать 3-битный двоичный код из регистра R4 в 8-битный унитарный:
DECODE:
MOV
A,#0
; Сброс аккумулятора
SETB
C
; Установка флага переноса
ROTATE:
RLC
A
; Сдвиг унитарного кода
DJNZ
R4,ROTATE ; Декремент и цикл, пока не ноль
Преобразование осуществляется путем «вдвигания» единицы из флага переноса в аккумулятор. Результат формируется в аккумуляторе за N сдвигов (где N - эквивалент исходного двоичного кода). Недостатком приведенной программы является то, что для преобразования N=0 понадобится 256 сдвигов. Избежать этого можно, модифицировав
программу DECODE следующим образом:
DECODE:
INC
R4
; Инкремент исходного кода
MOV
A,#80H
; Установка старшего бита аккумулятора
29+15
ROTATE:
RL
DJNZ
A
; Сдвиг унитарного кода
R4,ROTATE ; Декремент позиционного кода и цикл, пока не ноль
Преобразование в этом случае осуществляется за N+1 сдвигов.
13.1.3 Преобразование кодов из одной системы счисления в другую.
Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного
числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы
счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно
быть поделено на 10. Деление должно осуществляться по правилам двоичной арифметики.
Пусть требуется выполнить преобразования 8-битного двоичного числа в двоично-десятичное. Исходный
двоичный код хранится в аккумуляторе. Результат преобразования состоит из 12 бит: младшие 4 бита - единицы, представляют собой остаток от деления исходного числа на 10; следующие 4 бита – десятки, представляют собой остаток
от деления на 10 полученного частного; старшие 4 бита – сотни, являются частным от второго деления:
BBD:
CALL
DIV10
; Деление исходного числа на 10
MOV
R7,A
; Сохранение остатка в R7
MOV
A,R1
; Загрузка в аккумулятор частного
CALL
DIV10
; Деление частного на 10
SWAP
A
; Передача остатка в старшую тетраду аккумулятора
ORL
A,R7
; Передача R7 в младшую тетраду аккумулятора
JMP
EXIT
; Выход из процедуры
; Подпрограмма деления на 10
; Исходный двоичный код в аккумуляторе
; Результат: в R1 - частное, в аккумуляторе - остаток
DIV10:
MOV
R1,#0
; Сброс R1
SUB10:
ADD
A,#(NOT(10)+1)
; Вычитание 10 (сложение с дополнительным
; кодом числа «-10») из делимого
INC
R1
; Инкремент частного
JC
SUB10
; Цикл, если остаток ≥ 0
DEC
R1
; Восстановление частного
ADD
A,#10
; Восстановление остатка
RET
; Возврат
EXIT:
……
В результате выполнения процедуры в младшей тетраде R1 хранятся сотни, в аккумуляторе – десятки и единицы двоично-десятичного эквивалента исходного двоичного числа.
Обратное преобразование (из двоично-десятичного кода в двоичный) осуществляется делением исходного числа на 16 по правилам десятичной арифметики. Программа преобразования приведена ниже. Исходный двоично-десятичный код хранится в аккумуляторе. После окончания работы программы в «А» находится двоичный эквивалент исходного двоично-десятичного числа.
Обращаем внимание на то, что команда DIV AB не может быть использована для деления чисел по правилам
десятичной арифметики:
BDB:
CALL
DIV16
; Деление исходного числа на 16
SWAP
A
; Передача остатка в старшую тетраду аккумулятора
ORL
A,R1
; Загрузка частного в младшую тетраду аккумулятора
SWAP
A
; Формирование результата в аккумуляторе
JMP
EXIT
; Выход из процедуры преобразования
; Подпрограмма десятичного деления на 16
; Делимое – в аккумуляторе
; Результат: частное – в R1, остаток – аккумуляторе
DIV16:
MOV
R1,#0
; Сброс частного
SUB16:
ADD
A,#84H
; Вычитание из делимого числа 16,
; представленного в двоично-десятичной системе
DA
A
; Коррекция
INC
R1
; Инкремент частного
JC
SUB16
; Цикл, если остаток ≥ 0
DEC
R1
; Восстановление частного
ADD
A,#16H
; Восстановление остатка
DA
A
; Коррекция
RET
; Возврат
EXIT
……
29+16
Кроме рассмотренного способа преобразования чисел из одной системы счисления в другую можно воспользоваться более меленным, но зато и более простым способом «двух счётчиков». При этом способе из исходного кода вы читается, а к новому коду прибавляется по единице до обнуления исходного кода, причем вычитание осуществляется
«в старой», а прибавление – в «новой» системе счисления. Пример программы преобразования двоичного числа в
двоично-десятичное методом двух счётчиков приводится ниже. Для упрощения программы принято, что исходное
двоичное число, заданное в «А», не превышает его десятичного эквивалента 99:
BBD:
MOV
R2,A
; Передача исходного кода в R2
MOV
A,#0
; Сброс аккумулятора
CONV:
ADD
A,#1
; Инкремент «нового» кода
DA
A
; Коррекция
DJNZ
R2,CONV ; Декремент исходного кода и цикл, если не ноль
EXIT:
……
; Выход из процедуры
После выхода из процедуры в «А» находится двоично-десятичный эквивалент исходного двоичного кода.
13.2 Преобразования параллельных и последовательных кодов.
13.2.1 Преобразование данных из параллельного кода в последовательный.
Наиболее важным применением процедур преобразования формы представления данных «параллельный/последовательный» является связь с удаленными датчиками, исполнительными механизмами и другими МК по однопроводным линиям передачи информации. Обычно при передаче байта данных в прямом последовательном коде для обеспечения согласования работы приёмника и передатчика используют старт-стопный (асинхронный) режим обмена
(смотри протокол UART). Передача последовательного кода байта предваряется посылкой старт-бита (0) и завершается
выдачей стоп-бита (1).
Процедура выдачи одного бита последовательного кода реализуется выдачей в линию передачи статического
сигнала 0 или 1 и вызовом подпрограммы временной задержки заданной длительности:
CLR
P1.3
; Выдача старт-бита
CALL
DELAYT
; Задержка на время Т
PSCONV:
MOV
R7,#8
; Инициализация счётчика битов
ROTATE:
RRC
A
; Сдвиг вправо, т.е. (С) ← А.0
JC
OFF
; Если перенос, то управление передаётся
; процедуре выдачи «1»
ON:
CLR
P1.3
; Выдача на Р1.3 сигнала «0»
JMP
DLY
; Задержка
OFF:
SETB
P1.3
; Выдача на Р1.3 сигнала «1»
JMP
DLY
; Задержка
DLY:
CALL
DELAYT
; Задержка на время Т
DJNZ
R7,ROTATE
; Декремент счётчика битов и цикл, если не ноль
SETB
P1.3
; Выдача стоп-бита
CALL
DELAYT
; Задержка на время Т
EXIT:
……
; Выход из процедуры
В МК51 имеются средства аппаратурного преобразования параллельного кода в последовательный с использованием УАПП. Вся программа преобразования параллельного кода в последовательный сводится при этом к одной команде передачи байта в буфер УАПП: MOV SBUF,A.
13.2.2 Преобразование данных из последовательного кода в параллельный.
Эта процедура является составной частью процедуры приёма информации в последовательном коде.
В МК51 приём последовательного кода в универсальный асинхронный приёмо-передатчик (УАПП) и его
преобразование в параллельный код инициируются старт-битом и выполняются аппаратурными средствами без участия программы. Основная программа МК51 должна только считать содержимое буфера УАПП (SBUF) после завершения приёма очередного байта. Завершение приёма УАПП отмечает выставлением флага и, если разрешено, выработкой
запроса прерывания.
При необходимости (например, нужен дополнительный канал) можно реализовать приём и декодирование программно.
При обмене информации в последовательном коде необходима предварительная настройка приёмника на начало слова. При асинхронном обмене процедура настройки сводится к ожиданию старт-бита. После обнаружения стартбита на входе приёмника начинается преобразование кода, совмещенное с процедурой ввода последовательного кода.
Схема алгоритма процедуры SPCONV, представлена на рис.13.1. МК51 обеспечивает приём бита последовательного
кода и его распознавание (конкретный вид этого блока зависит от способа представления бита информации в последовательном коде). При длине слова не более 8 бит для формирования параллельного кода удобно воспользоваться аккумулятором, тогда дешифрированный бит «вдвигается» в аккумулятор через флаг переноса. Поскольку последовательный код принимается младшими битами вперед, сдвиг параллельного кода осуществляется вправо. Аккумулятор пред-
29+17
варительно сбрасывается, а после N сдвигов (где N - разрядность слова, передаваемого в последовательном коде) в нём
фиксируется параллельный код принятого слова данных.
Для обеспечения временного согласования работы приёмника и передатчика, а также для снижения вероятности неправильного прочтения сигнала при вводе, стартовый бит после его обнаружения необходимо стробировать в середине интервала его представления. С этой целью программа повторяет анализ старт-бита через время, равное половине периода бита, и если старт-бит не подтвердился, то процедура ожидания повторяется.
Для приёма последовательного кода можно использовать любую линию любого порта, например вход Т0
(Р3.4). Опрос входа Т0 повторяется через время, равное периоду представления бита и смещённое на половину периода относительно его начала. Для синхронизации приёма/передачи подпрограмма DELAYT приёмника должна реализовать ту же самую задержку, что и подпрограмма DELAYT передатчика:
WAIT:
JB
P3.4,WAIT
; Ожидание старт-бита
CALL
DELAYX
; Задержка на время Т/2
JB
P3.4,WAIT
; Если на входе «1», то повторить
SPCONV:
MOV
R7,#8
; Загрузка счётчика битов, N=8
MOV
A,#0
; Сброс аккумулятора
LOOP:
CLR
C
; Сброс флага переноса
CALL
DELAYT
; Задержка на время Т
JNB
P3.4,ROTATE
; Если на входе «0», то сохранение
; нулевого состояния флага переноса, иначе
SETB
C
; установка флага переноса
ROTATE:
RRC
A
; Сдвиг параллельного кода
DJNZ
R7,LOOP
; и если не ноль, то цикл
EXIT:
……
; Выход из процедуры
I(U)
SPCONV
Загрузка N в счётчик битов
Требуемое
управляющее
воздействие
Сброс регистра накопителя
параллельного кода
Ввод бита
последовательного
кода
Бит = 1?
Да
Установка флага С
Сдвиг параллельного кода
вправо
Фактическое
управляющее
воздействие
Нет
Сброс флага С
t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
Период дискретизации
Рис.14.1 - Дискретизация непрерывной функции
Декремент счетчика битов
Нет
N = 0?
Да
Выход
29+18
t
Рис.13.1 - Блок-схема процедуры
преобразования последовательного кода в
параллельный
14 Цифро-аналоговые и аналого-цифровые преобразования.
14.1 Цифро-аналоговое преобразование.
Преобразование информации из цифровой формы в аналоговую осуществляется путём подключения БИС
ЦАП к одному из портов МК. Выдача аналогового управляющего воздействия в этом случае сводится к одной команде,
например, OUTL Р1,А. При этом на выходе ЦАП появится напряжение (ток), пропорциональное двоичному коду, загруженному в порт 1.
Некоторые объекты управления могут требовать непрерывного управляющего воздействия сложной формы.
Для реализации такого воздействия в МК используются цифровые методы интегрирования: на каждом интервале времени Δt непрерывная функция заменяется её средним дискретным значением. Таким образом, управляющее воздействие становится ступенчатым (рис.14.1) и программа его формирования может быть реализована с использованием
процедур выдачи кода и временной задержки заданной длительности.
Если предположить, что для управления некоторым объектом требуется сформировать управляющее воздействие, показанное на рис.14.1, с периодом дискретизации 100 мкс, то, прежде всего, в памяти программ следует сформировать таблицу (TABL) двоичных эквивалентов дискретных значений функции для каждого из периодов дискретизации. Если допустить, что длина TABL в байтах хранится в её первом байте, а выводимые из таблицы двоичные коды не
требуют масштабирования, то программа формирования управляющего воздействия:
FANCNV:
MOV
DPL,#LOW(TABL)
; Запись адреса первого байта таблицы TABL
MOV
DPH,#H
; в указатель DPTR
MOV
A,#0
MOVC
A,@A+DPTR
; Чтение длины таблицы из памяти программ
MOV
R2,A
; (R2) ← длина таблицы TABL в счётчик
LOOP:
INC
DPTR
; Продвижение указателя данных
MOV
A,#0
MOVC
A,@A+DPTR
; Чтение кода из TABL
OUTL
P1,A
; Вывод кода в ЦАП
CALL
DELAY
; Задержка на величину периода
DJNZ
R2,LOOP
; Декремент R2, и цикл, если не ноль
ЕXIT:
……
; Выход из процедуры
14.2 Аналого-цифровое преобразование.
Преобразование аналогового сигнала от датчика в цифровой код, принимаемый и обрабатываемый в МК, можно осуществить несколькими способами:
1 Аппаратурный на основе БИС АЦП, подключаемой к порту МК. В этом случае МК только инициирует АЦП
и через заданные периоды дискретизации считывает из него цифровой код. Данный способ характеризуется самым высоким быстродействием, но требует использования БИС АЦП, что далеко не во всех применениях МК является оправданным;
2 Аппаратурно-программный на основе подключаемых внешних БИС и программы, реализующей алгоритм
преобразования;
3 Наибольший практический интерес представляет использование МК со встроенным АЦП нужного типа.
Обычно это АЦП последовательных приближений или сигма-дельта АЦП. В настоящее время практически в каждом
семействе МК имеются изделия со встроенным АЦП, дополненного программируемым усилителем, входным аналоговым мультиплексором и другой вспомогательной аппаратурой.
29+19