- •Эрни Каспер Программирование на языке Ассемблера для микроконтроллеров семейства i8051
- •1.Что нужно знать программисту о микроконтроллерах семейства i8051
- •1.1.Общие сведения об архитектуре i8051
- •1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
- •1.3.Форматы и способы адресации данных
- •1.4.Форматы и способы адресации команд
- •1.5.Команды пересылки информации
- •1.6.Команды поразрядной обработки информации
- •1.7.Команды арифметических операций
- •1.8.Управляющие команды
- •2.Директивы ассемблера для микроконтроллеров семейства i8051
- •2.1.Общие понятия о процессах трансляции и компоновки
- •2.2.Обработка имен транслятором и компоновщиком
- •2.3.Директивы резервирования памяти и инициализации данных
- •2.4.Использование выражений в операндах
- •2.5.Директивы условной трансляции
- •2.6.Директивы подстановок
- •2.7.Директивы управления вводом и выводом
- •Глава 3.
- •3.Кросс-средства фирмы 2500 a.D. Software, Inc. Для семейства i8051
- •Глава 4
- •4.Программирование арифметических действий
- •4.1.Кодирование информации в микроконтроллере
- •4.2.Арифметические действия с большими числами
- •4.3.Арифметические действия с отрицательными числами
- •4.4.Контроль точности при программировании арифметических операций
- •Глава 5
- •5.Программирование вычисления функций
- •5.1.Возведение в квадрат и извлечение квадратного корня
- •5.2.Переход от десятичной системы счисления к двоичной и обратно
- •5.3.Вычисление функций при помощи таблиц
- •5.4.Вычисление обратной функции по таблице прямой функции
- •5.5.Компенсация систематических погрешностей при помощи таблиц
- •Глава 6
- •6.Программирование фильтрации сигналов
- •6.1.Особенности цифровой фильтрации сигналов
- •6.2.Программирование простейших фильтров нижних частот
- •6.3.Программирование фильтра для оценки параметров сигнала
- •6.4.Программирование медианного фильтра
- •Глава 7
- •7.Программирование взаимодействия с внешними устройствами
- •7.1.Общие вопросы взаимодействия
- •7.2.Порядок выполнения прерываний в микроконтроллерах семейства i8051.
- •7.3.Синхронизация работы программы внешним или внутренним сигналом
- •7.4.Программирование приема информации от датчиков
- •7.5.Программирование выдачи команд на исполнительные устройства
- •7.6.Программирование ввода и вывода информации для пользователя
- •8.Несколько рекомендаций о стиле программирования
- •8.1.Стиль программирования и использование ресурсов
- •8.2.Оформление исходного текста программы
- •8.3.Системы обозначений, выражения и простые подстановки
- •8.4.Применение подпрограмм и сложных текстовых подстановок
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 предусмотрены специальные счетчики для выдачи управляющих сигналов с широтно-импульсной модуляцией. В этом случае достаточно записать в определенные функциональные регистры коды, задающие частоту и длительность импульсов, с учетом некоторых ограничений на значения этих кодов.