Главная | |
Материал взят из книги![]() Скачать оригинал КНИГИ в хорошем качествеВ предыдущем разделе была описана процедура приема сигналов ДУ. Процедура оканчивалась тем, что принятые коды команд ДУ записывались в буфер bufdu. Там же было сказано, что дальнейшая обработка команд возлагается на основную программу позиционера. В этом разделе мы рассмотрим подпрограмму, которая занимается окончательной обработкой команд дистанционного управления. Подпрофамма обработки кодов ДУ включена в основной цикл профаммы (см. начало главы). Если вы вернетесь к фрагменту программы №5, то обнаружите, что основной цикл содержит обращение к подпрограмме обработки команд ДУ (indu). Ниже приведен текст этой самой подпрофаммы indu (фрагмент №11). ![]() Алгоритм работы данной подпрограммы очень похож на алгоритм аналогичной процедуры (inkl), которая занимается обработкой команд с клавиатуры. Однако существуют и отличия. Например, для правильной работы процедуры indu введен дополнительный системный флаг flkdu — флаг «код обработан». Его назначение — исключить повторную обработку одной и той же команды. Начинается процедура обработки команд ДУ с проверки флага готовности кода (flokdu). Пока код не готов управление будет передаваться в конец подпрограммы (по адресу indl), где сначала происходит сброс флага flkdu, а затем выход из подпрограммы. Когда при очередном обращении к подпрограмме окажется, что код уже готов (флаг flokdu установлен в единицу), то выполняется проверка флага flkdu. При первой попытке обработать принятый код этот флаг, естественно, будет сброшен. Поэтому команда проверки не вызовет передачи управления и выполнение программы продолжится. Дальнейшая программа очень похожа на аналогичную процедуру проверки кода клавиатуры. Принятый код помещается в аккумулятор, где он будет находиться до конца проверки. Последующие команды проверки будут сравнивать его с различными константами. Каждая константа соответствует одной из используемых команд. Но прежде чем начинать сравнение, программа устанавливает флаг flkdu. Теперь, пока флаг установлен, повторной обработки этой команды не произойдет. После команды установки флага в тексте подпрограммы вы видите закомментированный фрагмент, озаглавленный «Вставлено для отладки». Назначение этого фрагмента мы рассмотрим немного позже. Фрагмент используется исключительно в режиме отладки программы. В рабочей версии эти команды отсутствуют. Мы же закончим описание подпрограммы. Сразу за отключенным пока фрагментом следуют три оператора сравнения. Они последовательно сравнивают код ДУ, находящийся в аккумуляторе с тремя разными константами. Каждая из констант — это код одной из трех команд ДУ. Используемый в системе пульт способен выдавать 23 различные команды. Из всех этих команд, используются только три. Их описание приведено в табл. 5. При совпадении принятого кода с одной из констант выполняется переход к соответствующей подпрограмме. Например, при нажатии на пульте ДУ кнопки «Power», программа получит код, равный 057Н. Это вызовет переход к процедуре onoff, которая предназначена для перевода позиционера из дежурного режима в рабочий и обратно. Если окажется, что принятый код не соответствует ни одной из вышеперечисленных констант, то это значит, что на пульте ДУ нажата кнопка, которая не используется для управления позиционером. Это равносильно отсутствию команд. Поэтому программа, прежде чем завершиться, сбрасывает флаг flkdu. Сброс флага необходим потому, что в этом случае становится бессмысленным блокирование повторной обработки команды. Теперь вернемся к закомментированной процедуре. Как уже говорилось, этот модуль используется в режиме отладки. Признаки комментария (точки с за- пятой) в начале двух команд этого модуля, удаляются. И мы получаем программу с новыми свойствами. Для чего же нужен этот отладочный режим? ![]() Асло в том, что по осциллографу очень трудно разглядеть форму каждого конкретного сигнала. Как же узнать коды каждой из команд? Самый лучший способ — сделать это программным путем. Для определения кодов команд ДУ я применил следующий метод: ■ Создал вышеописанную программу для приема сигналов ДУ. ■ Создал специальную подпрограмму, способную выводить любой восьмиразрядный двоичный код на индикатор позиционера в шестнадцатеричном виде. ■ Записал эту программу в программную память микроконтроллера позиционера. Адрес начала этой подпрограммы: ргпЬех. ■ Временно вставил в подпрограмму обработки команд ДУ описанный выше отладочный модуль. Этот модуль сразу после того, как принятый код готов к обработке, вызывает подпрограмму ргпЬех. ■ Включил позиционер, направил на него пульт и, нажимая по очереди все кнопки на пульте, увидел на индикаторе все коды команд. Именно таким образом я узнал коды команд, приведенные в табл. 5. ■ Закомментировал в тексте программы отладочный модуль. ■ Подставил коды трех нужных команд в соответствующее место программы. ■ Проверил работу пульта и убедился, что все команды работают нормально. В заключении я хочу рассмотреть принцип работы программы ргпйех. Сначала рассмотрим общие принципы ее работы. Для вывода шестнадцатеричного кода на семисегментный индикатор программа использует следующие знаки (рис. 52). ![]() Буквы с1 и Ь пришлось сделать маленькими. На семисегментном индикаторе иначе не получается. Однако при таком способе индикации шестнадцатеричных цифр числа прекрасно читаются. Специально для этой программы в конце таблицы символов были добавлены все недостающие знаки (см. фрагмент №8). Для упрощения процесса перевода из двоичной системы в шестнадцатеричную, дополнительные знаки в таблице символов были расположены по алфавиту. В результате получился следующий алгоритм вычисления кодов букв: ■ Для того, чтобы вывести код любого байта на индикатор, сначала нужно разделить его на две тетрады. Тетрадой называется двоичное число, состоящее из четырех разрядов. ■ Затем нужно получить код символа для каждой тетрады. ■ Символ старшей тетрады нужно вывести в старший разряд индикатора, а символ младшей тетрады — в младший разряд. При вычислении кодов символа для каждой из тетрад применяется следующее правило: ■ Если значение кода, записанного в тетраду, лежит в диапазоне от 0 до 9, то его не нужно преобразовывать. Сам этот код и является рабочим кодом выводимого символа. ■ Если значение кода в тетраде лежит в диапазоне от 10 до 15, то это значит, что на индикатор нужно вывести одну из цифр. Для этого код нужно преобразовать. Преобразование кода сводится к прибавлению константы смешения. Эта константа равна 22. В результате число 10 превратится в рабочий кол 32. А это код символа «А» и так далее. Фрагмент №12 представляет собой полный текст подпрограммы, реализующей описанный выше алгоритм. ![]() ![]() Приведенная подпрограмма получает код, предназначенный для вывода на индикатор через аккумулятор. Она разделяет код на тетрады, затем получает код символа для каждой из них. Для получения кода символа используется специальная вспомогательная подпрограмма phx2. Затем коды обоих символов помещаются в буфер экрана, после чего их изображение появляется на индикаторе. Я предлагаю самостоятельно разобраться с текстом подпрограммы. Почти все команды, применяемые в описываемой подпрограмме, нам уже известны. Новой командой для нас является команда swap. Команда swap меняет местами младшую и старшую тетрады аккумулятора. На этом заканчивается описание управляющей программы позиционера. В книге дано описание далеко не всех процедур и подпрограмм. Однако книга не является описанием конструкции позиционера. Книга предназначена для того, чтобы дать читателю основные понятия о принципах и приемах построения микропроцессорных устройств и написания управляющих программ. Если вы желаете просто повторить позиционер, обращайтесь за полным текстом программы к ее автору на сайт http://avbelov.by.ru или по электронной почте: belov@gomail.com.ua. А мы перейдем к последнему этапу в проектировании микропроцессорных устройств: этапу трансляции и отладки программ. Используются технологии uCoz
|