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

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

 
 


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

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

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

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

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

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

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

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

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

 
 


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

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

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

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

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

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

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

 
 


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

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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