Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
120
Добавлен:
09.11.2019
Размер:
954.88 Кб
Скачать

7.5.Программирование выдачи команд на исполнительные устройства

Программирование выдачи команд на исполнительные устройства дискретного действия типа реле или ключей не представляет проблемы. Для работы с исполнительными устройствами аналогового типа прихо­дится использовать преобразователи цифра-аналог, но иногда можно обойтись и без них. Приведем пример использования счетчика 1 для управления приводом постоянного тока посредством широтно-импульсной модуляции (ШИМ). В этом случае при инициализации в старшую половину байта регистра управления режимами нужно запи­сать 9h. Пусть частота циклов синхронизации как и в предыдущих при­мерах равна 100 Гц, а импульсы ШИМ должны выдаваться на выход Р3.1. Начнем с программирования обработки запроса на прерывание. После отработки заданной длительности импульса нужно очистить заданный бит выходного порта и бит разрешения прерываний по счетчику 1.

.ORG 1Bh ; адрес для прерывания по счетчику 1

CLR РЗ.1 ; выключение импульса ШИМ

CLR ET1 ; запрет прерывания по счетчику 1

RETI ; выход из программы обработки прерывания

Как видите, программа обработки запроса на прерывание достаточно компактна, чтобы поместиться в пределах 8 байт. С момента выдачи запроса на прерывание до выключения импульса пройдет 12 мкс. Следо­вательно, программа не может выдать импульс с длительностью, меньшей некоторого порогового значения.

Теперь перейдем к программе включения импульса ШИМ. Предпо­ложим, что длительность импульса записана в ячейках pdh (старший байт) и pdl (младший байт). Ограничим длительность импульсов значе­ниями от 13 мкс до 9996 мкс. Минимальное значение обусловлено за­держками при выполнении запроса на прерывание, а максимальное — запретом на постоянное включение питания. Сначала проверим заданную длительность импульса. При длительности меньше нижней границы не будем включать импульс, а при длительности больше верхней границы включим его на максимально допустимое время.

CLR С

MOV A, pdl

SUBB А, #13

MOV R0, А ; младший байт для отсчета задержки

MOV A, pdh

SUBB A, #0

MOV R1, А ; старший байт для отсчета задержки

JC zrdp ; переход по слишком малой длительности

SUBB A, #27h ; проверка на максимальную длительность

JC nzdp ; переход при отсутствии насыщения

MOV RO, #FFh ; младший байт для максимальной задержки

MOV Rl, #26h ; старший байт для максимальной задержки

nzdp: MOV TL1, #0 ; для задержки переноса в старший байт

SETB ET1 ; разрешение прерывания по счетчику 1

CLR С

MOV A, #FCh ; младший байт максимального кода

SUBB A, RO ; вычитание младшего байта длительности

MOV В, А ; младший байт кода длительности

MOV A, #FFh ; старший байт максимального кода

SUBB A, R1 ; вычитание старшего байта длительности

MOV TH1, А ; старший байт кода длительности

MOV TL1, В ; начало отсчета длительности импульса

SETB РЗ. 1 ; включение импульса ШИМ

zrdp: NOP ; для записи метки

Задержка разрешения включения импульса относительно начала счета равна 3 мкс. Следовательно, максимальное значение кода, записываемого в счетчик 1, равно FFFCh. При этом длительность импульса ШИМ соста­вит 13 мкс.

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