Адрес строки таблицы, в которой хранятся адреса переходов, вычисляется как сумма относительного (внутри текущей страницы резидентной памяти программ) начального адреса таблицы BASE и кода, принятого от датчиков. Команды MOVC A, @A+DPTR , JMP @A+DPTR, таблица BASE и программы PROG0 - PROG7 должны располагаться в одной странице памяти программ.
Опрос группы импульсных датчиков. Эта процедура состоит из последовательности действий: ожидания замыкания одного из контактов, устранения дребезга, ожидания размыкания замкнутого контакта.
Программная реализация процедуры (KBRD) для случая подключения четырех импульсных датчиков к входам 0 - 3 порта 1 будет иметь вид:
Анализ состояния контактов осуществляется наложением маски на принятый от датчиков код. Для датчиков, формирующих “отрицательный” импульс, принятый код предварительно инвертируется.
Для группы импульсных датчиков, представляющих собой клавишный регистр, процедура KBRD должна быть дополнена процедурами идентификации нажатой клавиши и защиты от одновременного нажатия двух и более клавиш.
Идентификация нажатой клавиши может осуществляться двумя способами: по таблице или программно. При табличном способе перекодирования в памяти программ должна находиться таблица двоичных эквивалентов кодов клавиш. Программное преобразование унитарного кода, принятого от клавиатуры, в двоичный код может быть выполнено методом сдвигов исходного унитарного кода и подсчетом числа сдвигов на счетчике до появления первого переноса [1].
3.3. Реализация функций времени
3.3.1. Программное формирование временной задержки
Временная задержка малой длительности. Процедура реализации временной задержки использует метод программных циклов. При этом в некоторый рабочий регистр загружается число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех пор, пока содержимое регистра не станет равным нулю, что интерпретируется программой как момент выхода из цикла. Время задержки при этом определяется числом, загруженным в рабочий регистр, и временем выполнения команд, образующих программный цикл.
Предположим, что в управляющей программе необходимо реализовать временную задержку 99 мкс. Фрагмент программы (DELAY) оформим в виде подпрограммы, так как предполагается, что основная управляющая программа будет производить к ней многократные обращения для формирования выходных импульсных сигналов, длительность которых кратна 99 мкс:
Для получения требуемой временной задержки необходимо определить число X, загружаемое в рабочий регистр. Определение числа X выполняется на основе расчёта времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки.
В описании команд микроконтроллера [4] указывается, за сколько машинных циклов (МЦ) исполняется каждая команда: CALL - 2 МЦ, MOV - 1 МЦ, DJNZ - 2 МЦ, RET - 2 МЦ. На основании этих данных определяется суммарное число машинных циклов в подпрограмме. При тактовой частоте 12 МГц каждый машинный цикл выполняется за 1 мкс. Таким образом, подпрограмма выполняется за время 2 + 1 + 2Х + 2 = 5 + 2Х мкс. Для реализации временной задержки 99 мкс число Х = (99 - 5)/2 = 47.
В данном случае при загрузке в регистр R2 числа 47 требуемая временная задержка (99 мкс) реализуется точно. Если число Х получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более точной подстройки в подпрограмму могут быть включены команды NOP, время выполнения каждой из которых равно 1 мкс.
Минимальная временная задержка, реализуемая подпрограммой DELAY, составляет 7 мкс (X = 1). Временную задержку меньшей длительности программным путем можно реализовать, включая в программу цепочки команд NOP.
Максимальная длительность задержки, реализуемая подпрограммой DELAY, составляет 515 мкс (X = 255). Для реализации задержки большей длительности можно рекомендовать увеличить тело цикла включением дополнительных команд или использовать метод вложенных циклов. Так, например, если в подпрограмму DELAY перед командой DJNZ вставить дополнительно две команды NOP, то максимальная задержка составит 5 + Х(2 + 1 + 1) = 5+4 * 255 = 1025 мкс (т.е. почти в два раза больше).
Временная задержка большой длительности. Задержка большой длительности может быть реализована методом вложенных циклов. Числа Х и Y выбираются из соотношения Т = 2 + 1 + Х(1 + 2Y + 2) + 2, где Т - реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким способом, при Х = Y = 255 составляет 130.82 мс, т.е. приблизительно 0.13 с.
В качестве примера рассмотрим подпрограмму (DLY100), реализующую временную задержку 100 мс.
Здесь два вложенных цикла реализуют временную задержку длительностью 5 + 195(3 + 2*254) = 99 650 мкс, а дополнительный цикл LOOPAD и команда NOP реализует задержку 350 мкс и тем самым обеспечивает точную настройку временного интервала.
Временная задержка длительностью 1 с. Из предыдущего примера видно, что секунда является очень большим интервалом времени по сравнению с тактовой частотой микроконтроллера. Такие задержки сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку в 1 с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мс:
Погрешность подпрограммы DLY1 составляет 21 мкс. Для очень многих применений это достаточно высокая точность, хотя реализованные на основе этой программы часы астрономического времени за сутки “убегут” примерно на 1.8 с.
3.3.2. Формирование временной задержки таймером
Недостатком программного способа реализации временной задержки является нерациональное использование ресурсов микроконтроллера: во время формирования задержки он практически простаивает, так как не может решать никаких задач управления объектом. В то же время аппаратные средства позволяют реализовать временные задержки на фоне работы основной программы.
На вход таймера/счетчика (Т/С) могут поступать сигналы синхронизации с частотой 1 МГц (Т/С в режиме таймера) или сигналы от внешнего источника (Т/С в режиме счетчика). Оба эти режима могут быть использованы для формирования задержек [1]. Если использовать Т/С в режиме таймера полного формата (16 бит), то можно получить задержки в диапазоне 1 - 65 536 мкс.
В качестве примера рассмотрим организацию временной задержки 50 мс (TIMER). Предполагается, что бит IE.7 установлен, т.е. снята блокировка всех прерываний.
Обратите внимание, что здесь использована команда перевода микроконтроллера в режим холостого хода, который прекращается после истечения 50 мс.
Этот режим реализован в микроконтроллере Intel 80C51 (отечественный аналог КР1830ВЕ51), изготовленный по технологии КМОП [3]. Поэтому для отладки этой программы через пункт Debug меню Options выберите указанный тип микроконтроллера.
3.3.3. Измерение временных интервалов.
В задачах управления часто возникает необходимость измерения промежутка времени между двумя событиями. Обычно события в объекте управления представляются сигналами от двоичных датчиков. Считая событиями фронт и спад импульса, можно определять временные характеристики импульсных сигналов: длительность, период и скважность.
Программный способ. Это простейший способ измерения длительности импульса. Для обнаружения событий (фронт и спад импульсного сигнала) в этом случае используются типовые процедуры WAIT, а отсчёт времени ведется программным способом. Для “положительного” импульсного сигнала, поступающего на вход Т0, программа измерения его длительности (MSCONT) будет иметь вид:
После выхода из процедуры содержимое счетчика R7 пропорционально длительности импульса.
Для нормальной работы этой программы необходимо, чтобы обращение к ней производилось в моменты, когда на входе Т0 присутствует сигнал нулевого уровня. Верхний предел измеряемой длительности “положительного” импульса составит 255(1 + 2) мкс = 765 мкс. Этот предел может быть увеличен включением в цикл COUNT дополнительных команд NOP. Максимальная погрешность измерений 3 мкс.
Применение таймера. Для измерения длительности сигнала может быть использован таймер. Особенно эффективно использование для этой цели таймера в 8051 Intel, имеющего вход разрешения счёта (альтернативная функция входа INT).
Измеряемый сигнал можно, например, подавать на вход INT0, а измерение длительности при этом будет выполняться в Т/С0. Программа измерения длительности “положительного” импульса (MSTIMER) будет выглядеть так:
Управление программе должно быть передано при условии, что на входе INT0 присутствует низкий уровень. Прерывание от T/C0 и внешнее прерывание по входу INT0 должны быть запрещены. По завершении программы в T/C0 будет находиться число, пропорциональное длительности “положительного” импульса на входе INT0. Верхний предел измерения равен 65 536 мкс, а максимальная погрешность 1 мкс.