Примеры программ формирования сигналов

 

Пример 1. В качестве одного из примеров, иллюстрирующих технику программирования микроконтроллера 1816ВЕ51, рассмотрим формирование текста программы для последовательности прямоугольных импульсов (рис.1).

 
 

 

 


Рис. 1. Последовательность прямоугольных импульсов

 

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

ORG 2000H ;определение начального адреса ОЗУ
  SJMP NATH  
ORG 2030H ;определение начального адреса программы ;в ОЗУ
NATH: MOV R1, #80H ;загрузка в регистр R1 длительности высокого ;уровня "1" (tИ)
  MOV R2, #60H ;загрузка в регистр R2 длительности низкого ;уровня "0" (tП)
  MOV P1, #80H ;загрузка в порт P1 значения уровня "1" (UMAX)
LOOP1: DJNZ R1, LOOP1 ;декремент R1 и цикл, если не 0
  MOV P1, #20H ;загрузка в порт P1 значения уровня "0" (UMIN)
LOOP2: DJNZ R2, LOOP2 ;декремент R2 и цикл, если не 0
  SJMP NATH ;возврат в начало программы
END   ;конец программы

Первые три строки программы и последняя являются обязательными, так как формируют необходимое адресное пространство для выполнения программы и завершают ее. Псевдооперация ORG осуществляет принудительную установку адреса следующей команды. Начальные адреса в ОЗУ определяются его объемом и свободным пространством для размещения пользовательских программ.

Оператор "SJMP rel" организует короткий относительный переход внутри страницы к программе формирования последовательности импульсов с меткой "NATH", где rel - метка в диапазоне [-128..+127] байт относительно адреса следующей команды.

Операторы группы передачи данных "MOV Rn, #data8" выполняют загрузку в регистр восьми битной константы в десятичной или шестнадцатеричной системе счисления. Оператор "MOV Pn, #data8" позволяет передать во все линии порта P1 (P1.0-P1.7) все восемь разрядов восьми битной константы для вывода на ЦАП. Таким же образом может быть произведена предварительная установка уровня сигнала на выходе ЦАП (например, в начале может быть организован вывод низкого уровня сигнала). В данном примере развертка сигнала на осциллографе начинается с высокого уровня.

Оператор "DJNZ Rn, rel" определяет декремент регистра и, если он не нуль, осуществляет переход по меткам "LOOP". В данном случае фактически осуществляется временная задержка, кратная числу, заданному константой, и времени выполнения операции микроконтроллером. В этой программе таким образом формируются длительности высокого и низкого уровней.

По окончании формирования низкого уровня сигнала производится переход в начало программы для организации циклического вывода сгенерированной последовательности импульсов через ЦАП на измерительные приборы.

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

 
 

 

 


Рис. 2. Последовательность пилообразных импульсов

 

Программа генерации последовательности может быть записана так:

ORG 2000H ;определение начального адреса ОЗУ
  SJMP NATH  
ORG 2030H ;определение начального адреса программы ;в ОЗУ
NATH: MOV R1, #80H ;загрузка длительности "низкого" уровня ;сигнала (tП)
  MOV R2, #1H ;загрузка скорости роста "пилы" по амплитуде (DU)
  MOV R3, #80H ;загрузка максимального уровня "пилы" (UMAX)
  MOV P1, #20H ;загрузка "низкого" уровня "пилы" (UMIN)
LOOP: DJNZ R1, LOOP ;отсчет длительности "низкого" уровня
ROST: MOV A, P1 ;формирование роста "пилы" с учетом
ADD A, R2 ;скорости роста
MOV P1, A  
MOV A, R3  
SUBB A, P1 ;если "пила" не достигла максимума, то снова
JZ NATH ;увеличение "пилы",
SJMP ROST ;иначе переход на начало программы
END   ;конец программы

Работа первых восьми строк этой программы аналогична работе предыдущей программы с идентичными операторами. Далее по метке "ROST" производится формирование линейного нарастания сигнала. Оператором "MOV A, P1" производится загрузка аккумулятора последним значением числа, выведенным в порт P1. Это число суммируется с заданной ступенькой роста "пилы" в регистре R2 ("ADD A, R2"). Далее полученное число из аккумулятора загружается в порт P1 ("MOV P1, A"), а в аккумулятор загружается заданный максимальный уровень "пилы" из регистра R3 ("MOV A, R3"). Затем производится вычитание из содержимого аккумулятора последнего числа, выведенного в порт P1 ("SUBB A, P1"), и, если аккумулятор не равен нулю, снова осуществляется переход по метке "ROST" для дальнейшего приращения "пилы" ("SJMP ROST"). В противном случае (если содержимое аккумулятора равно нулю) считается, что сигнал достиг своего максимального значения, и происходит переход в начало программы по метке "NATH" ("JZ NATH") для циклического запуска генерируемого сигнала.

В этой программе нет согласования заданных значений максимальной амплитуды сигнала UMAX и длительности "низкого" уровня с используемым значением скорости роста "пилы" DU. Фактически, скорость роста равна минимальному числу 1H. Более правильно вычислять скорость роста как отношение (UMAX-UMIN)/ tН. В этом случае сохраняются пропорции для заданных значений параметров, а точность достижения UMAX определяется погрешностью округления результата деления и минимально различимым разрядом числа.

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

Пример 3. Требуется составить программу, позволяющую воспроизводить на выходе программно-управляемого генератора сигнал, представленный на рис.3.

 
 

 

 


Рис. 3. Последовательность пилообразных импульсов

 

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

ORG 2000H ;определение начального адреса ОЗУ
  SJMP NATH  
ORG 2030H ;определение начального адреса программы ;в ОЗУ
NATH: MOV P1, #10H ;загрузка в P1 начального уровня сигнала (UMIN)
  MOV R1, #10H ;загрузка в R1 низкого уровня сигнала (UMIN)
  MOV R2, #60H ;загрузка длительности низкого уровня сигнала (tП)
  MOV R3, #5H ;загрузка дискретности спада сигнала по ;времени (DtС)
LOOP1: DJNZ R2, LOOP1 ;отсчет длительности низкого уровня сигнала
  MOV P1, #60H ;загрузка максимального уровня сигнала (UMAX)
SPAD: DEC P1 ;формирование спада сигнала
  MOV A, P1 ;если сигнал достиг низкого уровня, то переход
  SUBB A, R1 ;на начало для организации
  JZ NATH ;последовательности импульсов
LOOP2: DJNZ R3, LOOP2  
  SJMP SPAD  
END   ;конец программы

Работа этой программы аналогична программе в предыдущем примере. Отличие состоит в том, что в этом примере уменьшение амплитуды на единицу происходит за фиксированный интервал, определяемый временной задержкой DtС. В предыдущем случае фиксированное изменение амплитуды происходило за один такт приращения времени. Указанные в предыдущем примере недостатки присутствуют и этом.

Рассмотренные примеры отражают лишь достаточно простые частные случаи построения программ генерации сигналов. Более полно вопросы формирования функций времени, временных задержек, вопросы масштабирования и работы с портами ввода-вывода при использовании БИС 1816ВЕ51 рассмотрены в специальной литературе [6, 9]. При программировании микроконтроллеров обязательно необходимо использовать только те системы команд, которые соответствуют применяемым в реальных устройствах БИС.