Урок 1
- Формирование импульсных сигналов
Формирование
импульса
Управляющий
сигнал типа «импульс» можно получить
последовательной выдачей сигналов «включить»
и «выключить» с промежуточным
вызовом подпрограммы временной
задержки. Для формирования сигналов
«включено» и «выключено» используем
те же команды BCF f, d и BSF f, d.
Модифицируем рассмотренную на
прошлом занятии программу (изменения
здесь и далее выделяются другим
шрифтом):
processor
16F84
Include
<p16f84.inc>
LED1 EQU
H’0’
BSF STATUS, RP0 ;установим
страницу 1 памяти данных
MOVLW B’11111110’ ; RB<0> -
на вывод,
; остальные на ввод
MOVWF TRISB ;запишем из
регистра W в TRISB
BСF STATUS, RP0 ;установим
страницу 0 памяти данных
BSF
PORTB, LED1 ;включим светодиод
CALL
DELAY
;временная задержка
BCF
PORTB, LED1 ;выключим светодиод
End
Новым в этой программе является
вызов подпрограммы временной
задержки. Длительность импульса
определяется временной задержкой,
реализуемой подпрограммой DELAY.
Подпрограмма (процедура) -
законченная командная
последовательность, которая
приводится в действие командой CALL.
Процедура выполняется до тех пор,
пока не встретится команда RETURN.
Широкое применение подпрограмм
имеет большое значение при
проектировании прикладных программ
благодаря следующим качествам:
-
сложную программу можно разделить на
небольшие, сравнительно простые и
управляемые модули, разработка
которых может проводиться
несколькими программистами с
соответствующим сокращением сроков
проектирования всей программы;
-
каждая процедура допускает
автономную отладку, что ускоряет
отладку всей программы;
-
процедуры сокращают длину
прикладной программы, обеспечивая
экономию программной памяти;
-
отлаженные процедуры организуются в
библиотеки
Напишем
подпрограмму временной задержки. Для
ее организации может понадобится
один или несколько регистров для
хранения значения задержки.
Рассмотрим
простейший случай с постоянной
задержкой. Пусть нам необходима
задержка в 10 мкс (при работе с
тактовым генератором 4 МГц). Для
организации задержки будем
использовать команду NOP. Эта команда
хороша тем, что не изменяет значения
регистров и флагов, поэтому не нужно
их контролировать. Однако здесь
нужно правильно посчитать, сколько
команд NOP нужно выполнить. Сначала
кажется, что 10. Но на самом деле нужно
учитывать, что выполнение команд CALL и
RETURN будет занимать по 2 машинных
цикла, а команда NOP выполняется за
один цикл. Таким образом, нужно 10 - 4 = 6
команд NOP. Подпрограмма будет
выглядеть следующим образом:
DELAY:
NOP
NOP
NOP
NOP
NOP
NOP
RETURN
Заметим, что для возврата из
подпрограммы необходимо
использовать оператор возврата (в
данном случае – RETURN), чтобы в счетчик
команд был загружен адрес команды,
следующей за вызовом подпрограммы.
Теперь рассмотрим более сложный
случай. Пусть нам необходима
переменная задержка в диапазоне 10 –
200 мкс. В данном случае нам необходима
память для хранения величины
задержки. Обычно для этого
используют один из регистров общего
назначения. В 8-битном регистре можно
хранить числа от 0 до 255. Таким образом,
достаточно одного регистра. Выберем
для этой цели регистр в первом банке
с адресом 10h и назовем его DELREG. В
подпрограмме задержки DELAY будем
уменьшать содержимое регистра DELREG,
пока он не станет равным 0. Тогда
выйдем из подпрограммы. Наилучшим
образом для этой цели подходит
команда DECFSZ f, d. Эта команда
декрементирует (уменьшает на 1)
значение регистра f. Затем проверяет
его значение на 0. Если оно не равно 0,
то выполняется команда, следующая за
DECFSZ. В противном случае следующая
команда пропускается, и выполнение
продолжается с команды, следующей за
ней (через одну команду).
processor
16F84
Include
<p16f84.inc>
LED1 EQU
H’0’
DELREG
EQU H’10’ ;регистр, в котором
будем хранить значение
;задержки
BSF STATUS, RP0 ;установим
страницу 1 памяти данных
MOVLW B’11111110’ ; RB<0> -
на вывод,
; остальные на ввод
MOVWF TRISB ;запишем из
регистра W в TRISB
BСF STATUS, RP0 ;установим
страницу 0 памяти данных
BSF
PORTB, LED1 ;включим светодиод
MOVLW
D'20' ;записываем требуемое
значение задержки
MOVWF
DELREG ;в регистр DELREG
CALL
DELAY ;временная
задержка
BCF
PORTB, LED1 ;выключим светодиод
End
;значение задержки
DELAY:
DECFSZ DELREG, F ;уменьшаем
значение на 1
GOTO
DELAY ;если
не 0, то продолжаем уменьшать.
RETURN
;возврат, если 0
Для определения начала подпрограммы
определена метка DELAY. В подпрограмме
DELAY организован «цикл». В регистре
DELREG хранится переменная цикла, с
помощью оператора GOTO (который
осуществляет переход по заданному
адресу) и DECFSZ осуществляется
проверка на окончание цикла. Начало
подпрограммы служит также началом
цикла.
Аналогично команде DECFSZ действует
команда INCFSZ, только она выполняет
инкремент (увеличение на 1)
содержимого регистра.
Формирование
периодического импульсного сигнала
Для
генерации периодического
импульсного сигнала необходимо
воспользоваться выдачей сигналов «включить»,
«выключить» и вызовом подпрограмм
временной задержки для формирования
импульса и паузы между импульсами. В
качестве основы также возьмем
программу из прошлого занятия.
Аналогично
формированию импульса рассмотрим
случай фиксированных длительности
импульса и паузы. Пусть требуется
импульс длительностью 6 мкс и пауза 8
мкс. Сделаем две подпрограммы
задержки DELAY6 и DELAY8.
processor
16F84
Include
<p16f84.inc>
LED1 EQU
H’0’
BSF STATUS, RP0 ;установим
страницу 1 памяти данных
MOVLW B’11111110’ ; RB<0> -
на вывод,
; остальные на ввод
MOVWF TRISB ;запишем из
регистра W в TRISB
BCF STATUS, RP0 ;установим
страницу 0 памяти данных
PULSES:
BSF
PORTB, LED1 ;включим
светодиод
CALL
DELAY6
;временная задержка 6 мкс
BCF
PORTB, LED1 ;выключим
светодиод
CALL
DELAY8
;временная задержка 8 мкс
GOTO
PULSES
;
подпрограмма задержки 6 мкс
DELAY6:
NOP
NOP
RETURN
; подпрограмма задержки 8 мкс
DELAY8:
NOP
NOP
NOP
NOP
RETURN
End
В основной программе мы организовали
цикл при помощи метки PULSES и оператора
GOTO.
Создайте в MPLAB новый проект и
проверьте работу данной программы на
макете. Сформированный сигнал
наблюдайте с помощью осциллографа.
Формирование
апериодического импульсного сигнала.
Апериодический
импульсный сигнал (когда его
длительность и скважность меняются
во времени) может быть получен
аналогично периодическому сигналу
или табличным способом.
Рассмотрим табличный способ
формирования сигнала. Сформируем
подпрограмму A_SIGNAL_TABLE. В отличие от
рассмотренных выше подпрограмм DELAY
возврат из нее будем производить с
помощью команды возврата RETLW k. Данная
команда позволяет при возврате из
подпрограммы записать в регистр W 8-битную
константу k. Располагая
последовательно несколько таких
констант, можно получить требуемую
импульсную последовательность. В
качестве основы опять возьмем
программу из прошлого занятия. Для
того, чтобы выбрать требуемую
константу, необходимо загрузить
перед вызовом подпрограммы в регистр
W номер константы. Регистру с адресом
11h присвоим символьное имя TBLCNT. Будем
использовать его в качестве счетчика
для последовательной выборки
значений из таблицы. Организуем в
программе 2 цикла. Первый цикл (PULSE)
для выборки сигнала из таблицы.
Второй (CYCLE), для того, чтобы
формировать апериодический сигнал
циклически (для визуального
наблюдения на осциллографе).
processor
16F84
Include
<p16f84.inc>
LED1 EQU
H’0’
TBLCNT
EQU H’11’ ;регистр, в котором
будем хранить значение
;задержки
BSF STATUS, RP0 ;установим
страницу 1 памяти данных
MOVLW B’11111110’ ; RB<0> -
на вывод,
; остальные на ввод
MOVWF TRISB ;запишем из
регистра W в TRISB
BСF STATUS, RP0 ;установим
страницу 0 памяти данных
CYCLE:
;инициализация
TBLCNT – число значений в таблице - 12
MOVLW D’12’
MOVWF
TBLCNT
PULSE:
;копируем
TBLCNT в W
MOVF
TBLCNT, W
DECF
TBLCNT, W
;уменьшаем
значение W на 1, чтобы выбирать
;значения
в диапазоне 0-11 вместо 1-12
;получим табличное значение в W
CALL
A_SIGNAL_TABLE6
; выводим табличное значение в порт RB
MOVWF PORTB
;уменьшаем значение регистра TBLCNT
DECFSZ TBLCNT, F
; если не 0, то продолжаем выбирать
данные из таблицы
GOTO
PULSE
; если 0, то повторим апериодический
сигнал
GOTO
CYCLE
;
подпрограмма-таблица сигнала
A_SIGNAL_TABLE6:
ADDWF PCL, F
;изменяем состояние счетчика команд
RETLW
B’11111110’
;возврат одной из констант
RETLW
B’11111111’
RETLW
B’11111110’
RETLW
B’11111110’
RETLW
B’11111111’
RETLW
B’11111111’
RETLW
B’11111110’
RETLW
B’11111110’
RETLW
B’11111110’
RETLW
B’11111111’
RETLW
B’11111111’
RETLW
B’11111111’
End
Формируемый сигнал следующий: первый
импульс и пауза - 3 мкс, второй – 2,
третий – 1. Импульс будем формировать
на выводе RB<0>, поэтому в
константах меняются только младший
бит. Заметьте также, что таблица
задана «задом наперед».
Создайте в MPLAB новый проект и
проверьте работу данной программы на
макете. Сформированный сигнал
наблюдайте с помощью осциллографа.