Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения
 

Разработка программы программно-управляемого генератора

Работа из раздела: «Коммуникации, связь, цифровые приборы и радиоэлектроника»

/

Задание

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

2. На языке ассемблер в системе команд микроконтроллера написать программу для программно-управляемого генератора. При написании программы каждая строка должна быть сопровождена комментарием.

Примечание к заданию

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

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

3. В Приложении П.3 приведены сведения о системе команд МК 1816ВЕ51 и правилах написания программ на языке ассемблер, необходимые для выполнения контрольной работы. Вопросы, связанные с вводом, редактированием, трансляцией и отладкой прикладных программ, отражены в описании упомянутой выше лабораторной работы.

4. В Приложении П.4 приведен список сокращений, символических имен и аббревиатур.

генератор пауза импульс сигнал

Задания к контрольной работе

Рис. П1.6. Контрольная работа. Вариант 6.

РЕШЕНИЕ: В данном задании необходимо сформировать последовательность из трех пилообразных импульсов, имеющих время паузы tП, время нарастания tН и паузы между пилообразными импульсами длительностью Т. (рис.1).

Рисунок 1 - Заданная последовательность импульсов

Во время паузы на выходе формируется сигнал низкого уровня UMIN, а максимум пилообразного напряжения достигает величины UMAX.

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

Таким образом, можно принять:

tН> tП, Т = 3• (tН + tП) и UMAX > UMIN.

Задача формирования сигнала на рис.1 может быть разделена на две: первая - формирование трех пилообразных импульсов, вторая - формирование паузы длительностью Т. Так как пилообразные импульсы одинаковы, то целесообразно использовать цикл из трех шагов по формированию одиночного импульса или подпрограмму формирования одного импульса, которую можно вызвать три раза в цикле.

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

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

tН= (UMAX-UMIN) /U = (80Н - 20Н) /1Н= 60Н.

Примем tП =40Н, тогда длительность паузы составит:

Т = 3• (tН + tП) =3• (60Н+40Н) =1Е0Н.

Величина Т выходит за диапазон 8-ми разрядов регистров общего назначения микроконтроллера, поэтому для формирования паузы длительностью Т, следует разделить величину Т на 2 и два раза выполнить фрагмент кода с формированием сигнала низкого уровня длительностью:

Т1=Т/2=1Е0Н/2=F0H.

Ниже приведен вариант программы формирования сигнала на языке ассемблера К1816ВЕ51 при использовании цикла из трех шагов по формированию одиночного пилообразного импульса.

ORG 2000H

; определение начального адреса ОЗУ

SJMP

BEGIN

ORG 2030H

; определение начального адреса программы в ОЗУ

BEGIN:

MOV

R5, #3H

; загрузка числа циклов 'пилы'

NATH:

MOV

R1, #80H

; загрузка длительности 'низкого' уровня сигнала (tП)

MOV

R2, #1H

; загрузка скорости роста 'пилы' по амплитуде (U)

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

CYCLE

; увеличение 'пилы',

SJMP

ROST

; иначе переход к проверке количества циклов

CYCLE:

DJNZ

R5, NATH

; отсчет числа циклов

MOV

R4, #F0H

; загрузка длительности сигнала 'низкого' уровня Т1

MOV

P1, #20H

; загрузка 'низкого' уровня сигнала (UMIN)

LOOP1:

DJNZ

R4, LOOP1

; отсчет длительности 'низкого' уровня: декремент R4 и цикл, если не 0, то загрузка в порт P1 значения 'низкого' уровня (UMIN)

MOV

R4, #F0H

; повтор формирования сигнала 'низкого' уровня длительностью Т1

MOV

P1, #20H

; загрузка 'низкого' уровня сигнала (UMIN)

LOOP1:

DJNZ

R4, LOOP1

; отсчет длительности 'низкого' уровня: декремент R4 и цикл, если не 0, то загрузка в порт P1 значения 'низкого' уровня (UMIN)

SJMP

BEGIN

; возврат в начало программы

END

; конец программы

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

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

Операторы группы передачи данных 'MOV Rn, #data8' выполняют загрузку в регистр восьми битной константы в десятичной или шестнадцатеричной системе счисления. В программе использована шестнадцатеричная система.

В начале программы по метке BEGIN устанавливается в регистре R5 число циклов формирования пилы, их три. Далее c метки NATH в регистры R1-R3 записываются необходимые константы, определяющие вид пилообразных импульсов.

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

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

По окончании формирования низкого уровня сигнала UMIN с метки ROST, выполняются команды по формированию нарастающего фронта пилообразного напряжения.

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

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

Теперь приведем вариант программы формирования сигнала на языке ассемблера К1816ВЕ51 при использовании подпрограмм формирования одиночного пилообразного импульса и формирования сигнала низкого уровня заданной длительности. В программе также будем использовать цикл из трех шагов по вызову подпрограммы формирования одиночного пилообразного импульса. Использование цикла по вызову подпрограммы требует меньшего количества машинных циклов при выполнении, чем просто три раза вызвать подпрограмму, в тоже время выигрыша по объему занимаемой памяти нет.

Предполагается, что устройство при запуске (или нажатии на кнопку СБРОС) формирует аппаратный импульс рестарта (сброса) RST, по которому происходит начальная инициализация. В частности при этом устанавливается указатель стека по адресу 07Н, что необходимо при вызове подпрограмм. Поэтому аналогичные настройки в программе не приводятся.

Работа первых четырех строк этой программы аналогична работе предыдущей программы с идентичными операторами.

ORG 2000H

; определение начального адреса ОЗУ

SJMP

BEGIN

ORG 2030H

; определение начального адреса программы в ОЗУ

BEGIN:

MOV

R5, #3H

; загрузка числа циклов 'пилы'

ACALL

SAW

; вызов подпрограммы формирования импульса 'пилы'

CYCLE:

DJNZ

R5, BEGIN

; отсчет числа циклов

ACALL

DELAY

; вызов подпрограммы формирования сигнала 'низкого' уровня длительностью Т1

ACALL

DELAY

; вызов подпрограммы формирования сигнала 'низкого' уровня длительностью Т1

SJMP

BEGIN

; возврат в начало программы

; Подпрограмма формирования пилообразного импульса

SAW:

MOV

R1, #80H

; загрузка длительности 'низкого' уровня сигнала (tП)

MOV

R2, #1H

; загрузка скорости роста 'пилы' по амплитуде (U)

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

EXIT

; переход к возврату из подпрограммы,

SJMP

ROST

; иначе снова увеличение 'пилы'

EXIT:

RET

; возврат из подпрограммы

; Подпрограмма формирования сигнала 'низкого' уровня длительностью Т1

DELAY:

MOV

R4, #F0H

; загрузка длительности сигнала 'низкого' уровня Т1

MOV

P1, #20H

; загрузка 'низкого' уровня сигнала (UMIN)

LOOP1:

DJNZ

R4, LOOP1

; отсчет длительности 'низкого' уровня: декремент R4 и цикл, если не 0, то загрузка в порт P1 значения 'низкого' уровня (UMIN)

RET

; возврат из подпрограммы

END

; конец программы

Далее в теле цикла из трех шагов происходит вызов подпрограммы формирования одиночного пилообразного импульса АCALL SAW, расположенной в текущем банке памяти программ. Затем два раза вызывается подпрограмма формирования сигнала 'низкого' уровня длительностью Т1 ACALL DELAY, таким образом формируется сигнал 'низкого' уровня длительностью Т.

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

Далее приводятся тексты подпрограмм SAW и DELAY, которые заканчиваются командой возврата из прерывания RET. Текст подпрограмм аналогичен соответствующим фрагментам первого варианта программы.

Литература

1. Магда Ю.С. Микроконтроллеры серии 8051: практический подход. - М.: ДМК Пресс, 2008. - 228 с.

2. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В. Сташин, А.В. Урусов, О.Ф. Мологонцева. - М.: Энергоатомиздат, 1990. - 224 с.

ref.by 2006—2019
contextus@mail.ru