Главная | |
Материал взят из книги![]() Скачать оригинал КНИГИ в хорошем качествеp>Процедура приема сигнала ДУОтдельная крупная задача, которую мне пришлось решить при разработке позиционера — это заставить его подчиняться командам от пульта дистанционного управления. Задачу создания программы, принимающей команды ДУ, пришлось решать, не имея никакой справочной литературы на эту тему. Решено было просто приспособить для этой цели один из стандартных пультов ДУ от телевизора. Единственным критерием при выборе пульта была его достаточная распространенность. Исходя из этих соображений, был выбран пульт 11С-500 от телевизора «Горизонт». Это стандартный пульт для целой серии отечественных телевизоров с так называемой «скрин-индикацией». Скрин-индикацией (от слова screen — экран) называют вывод информации о режимах работы телевизора непосредственно на его экран. Выбранный пульт имеет довольно широко распространенную систему команд. Цел^ій ряд пультов импортного производства можно без каких-либо доработок использовать вместо пульта RC-500. Как уже говорилось, метод кодирования команд пульта мне заранее не был неизвестен. В связи с этим пришлось провести небольшие исследовательские работы. Для изучения сигнала, передаваемого с пульта ДУ, решено было использовать осциллограф. Причем осциллограф подключался не к пульту, а к выходу фотоприемника на самом позиционере (выход 3 фотоприемника DD5 на рис. 44). Излучающий диод пульта ДУ направлялся на фотоприемник и на пульте, поочередно, нажималась каждая кнопка. При этом на экране осциллографа появлялись пакеты импульсов, соответствующих различным командам ДУ. Несмотря на то, что длина каждого пакета оказалась намного меньше периода их следования, все же удалось засинхрони-зировать развертку осциллографа и рассмотреть форму сигнала внутри самого пакета. В результате этих исследований выяснилось следующее: ■ Каждая команда передается пакетами импульсов, по 26 или 28 импульсов в пакете (в разных командах по-разному). Период следования импульсов в пакете равен одной миллисекунде. ■ Каждый пакет построен таким образом, что промежутков между соседними импульсами нет, так что идущие подряд два единичных импульса сливаются в один импульс двойной ширины. ■ Таким же образом сливаются идущие подряд два нулевых импульса. ■ Для передачи команд используются специальный вид кодировки, обеспечивающий минимизацию полосы передаваемого сигнала. Для этого импульсы в каждом управляющем пакете подчиняются следующему правилу: не допускается, присутствия в одном пакете подряд более двух единиц или более двух нулей. ■ При нажатии каждой кнопки передается свой уникальный пакет импульсов, закрепленный именно за этой кнопкой. ■ Первые 12 импульсов пакета для всех кнопок одинаковые. Эти импульсы несут общую информацию о виде используемой системы команд. Эта информация используется для того, чтобы приемное устройство отличало сигналы своего пульта от чужих сигналов. ■ Описанные выше пакеты передаются один за другим с периодом примерно равным 100 мс все время, пока нажата кнопка на пульте. Передача пакетов прекращается сразу после отпускания кнопки. По результатам всех этих исследований было принято решение создать свой нестандартный алгоритм, основная задача которого — уверенно распознавать любую из команд указанного пульта ДУ. При этом не ставилась задача использования всех возможностей, заложенных в указанную систему кодировки. Для создания такого алгоритма было применено несколько приемов, упрощающих поставленную задачу. Однако рассмотрим все по порядку. В данном случае мы имеем дело с последовательным методом передачи управляющих кодов. Для организации процесса приема сохранения и расшифровки такого кода не обойтись без сдвигового регистра. Количество разрядов такого регистра должно быть равно максимальному количеству битов в принимаемом коде. Упрощенно, процесс приема сигнала можно представить следующим образом. Каждый принятый бит записывается в младший разряд этого регистра. При этом остальное содержимое регистра сдвигается па один разряд вверх. Указанный процесс записи повторяется для каждого принимаемого бита. Таким образом, принимаемый код постепенно заполняет регистр. После записи последнего бита пакета необходимо приостановить процесс записи и приступить к распознаванию кода и выполнению команды. Таким образом, если решать поставленную задачу напрямую, «в лоб», то нужно иметь регистр с числом разрядов, равным 28. Для организации такого регистра программным путем придется выделить под него 4 ячейки памяти. Это существенно затрудняет обработку принятого кода. Однако несколько нехитрых приемов позволяет существенно сократить размеры сдвигового регистра. Рассмотрим эти приемы подробнее. Первый прием связан с особенностями используемого метода кодирования. Данный метод широко известен в системах последовательной передачи данных. Его преимущество в том, что сформированный по такому принципу аналоговый сигнал имеет минимальную полосу частот, что снижает требования к каналам передачи данных. В то же время, передаваемый код обладает довольно большой избыточностью. В результате его можно легко сократить, без какой-либо потери информации. Порядок преобразования следующий: ■ Каждые два рядом стоящих разряда преобразовываются в один. ■ Для преобразования применяется следующее правило: • Если оба разряда в исходном коде равны между собой, то есть это 00 или 11, то в результирующем коде мы получим разряд, значение которого равно нулю. • Если исходные разряды отличаются друг от друга, то есть это 01 или 10, то соответствующий разряд в результирующем коде будет равен единице. Такой метод позволяет вдвое сократить длину принимаемого кода. Причем потери информации не произойдет. Каждой комбинации исходного кода будет соответствовать своя уникальная результирующая комбинация. А значит, всегда можно отличить одну команду от другой. Еще один резерв сокращения разрядности сдвигового регистра кроется в том, что для всех команд пульта начало кода всегда одно и то же. Для упрощения программы можно просто не учитывать первую половину кодовой посылки. Это несколько снижает защищенность системы от ложных срабатываний, но зато позволяет снизить количество принимаемых бит до восьми. В результате применения этих двух приемов принятый код занимает всего один байт в памяти компьютера, что значительно упрощает процедуру его обработки. Для реализации процесса приема кода было решено использовать синхронный метод приема. Синхронный метод состоит в следующем. На первом этапе реализован алгоритм обнаружения начала первого импульса. Этот момент служит точкой отсчета для остального процесса. Основной процесс приема организован в виде цикла, в котором оценка входного сигнала производится путем считывания его значения через фиксированные промежутки времени, равные периоду входного сигнала. Для считывания всего пакета программа производит 28 циклов чтения. В процессе чтения происходит попарное объединение соседних разрядов и отбрасывание лишних. Весь этот процесс организован в виде процедуры обработки прерывания, которая запускается при помощи внутреннего таймера/счетчика Т1. Интервал времени между отдельными циклами считывания определяется путем программирования периода таймера/счетчика. На рис. 49 показана временная диаграмма всего процесса приема кода. ![]() Весь процесс разбит на три фазы: «Фазу ожидания кода», «Фазу приема» и «Фазу ожидания отпускания кнопки». Периоды следования циклов чтения в различных фазах разные. Единицей отсчета для всех временных интервалов описываемой процедуры служит период следования импульсов в передаваемом сигнале. На рис. 49 этот период обозначен, как Тсиг„. В фазе ожидания кода циклы считывания повторяются с периодом равным 1/3 Тсигн. В этой фазе единственным действием, которое выполняет программа, является проверка наличия входного сигнала. Если в момент считывания на выходе фотоприемника окажется нулевой логический уровень, то программа считает, что сигнал с пульта отсутствует. Поэтому фаза ожидания продолжается. Если в очередном цикле чтения уровень сигнала окажется равным единице, то программа переходит в фазу приема. В фазе приема период следования циклов чтения точно равен Тсигн. Исключение составляет только самый первый временной интервал: интервал между последним чтением фазы ожидания и первым чтением фазы приема. Этот переходный интервал равен 1/3 Тсиги. Из рис. 49 хорошо видно, что такой способ выбора интервалов позволяет с большой точностью «попасть» в центр первого импульса принимаемого пакета. В фазе приема программа производит ровно 28 циклов чтения. Для реализации описанных выше методов сокращения разрядности, четный и нечетный биты принятого кода обрабатываются по-разному. Четный бит просто запоминается в специальном буфере. После чтения нечетного бита, программа производит операцию исключающего ИЛИ между обоими прочитанными битами. Полученный таким образом результирующий бит заносится в младший разряд регистра приема. Остальное содержимое этого регистра сдвигается на один разряд влево. Таким образом, за все время, пока длится фаза приема, в указанный регистр будет записано 14 бит данных. Так как размер регистра приема равен 8 битам, в результате всех этих операций, самые первые записанные туда биты будут утеряны. Однако полученный таким образом код, как уже указывалось выше, все равно будет уникальным для каждой команды. В конце фазы приема, считанный код помещается в буфер команд ДУ, где он становится доступным для специальной подпрограммы основного цикла, осуществляющей его дальнейшую обработку. Затем программа автоматически переходит в фазу ожидания отпускания кнопки. Фаза ожидания отпускания кнопки на рис. 49 не показана. В этой фазе считывание входного сигнала происходит с периодом 1/3 Тсигн. Задача программы в этом режиме — дождаться отпускания кнопки на пульте ДУ. Этот режим нужен для предотвращения повторного срабатывания команды. Как уже говорилось, все время, пока нажата кнопка пульта, происходит многократная передача управляющих пакетов. В фазе ожидания отпускания кнопки программа проверяет наличие сигнала на выходе фотоприемника. Эта фаза продолжается до тех пор, пока на выходе фотоприемника присутствует сигнал ДУ. Для надежности введен защитный интервал. Если сигнал с пульта пропадет, то мгновенного выхода их последней фазы не последует. >дного сигнала. Если в течение защит-хотя бы один входной импульс, то гея в фазе ожидания пси, а отсчет защит-зремени начинается з в том случае, если защитного интерва-аружено ни одного ьса, программа пе-чую фазу своей ра-идания кода. 1с. 50 изображен тм работы процеду-зема сигнала дина-сой индикации. ![]() После подробного описания всей процедуры распознавания кодов ДУ, я надеюсь, вы самостоятельно легко разберетесь во всех тонкостях представленного алгоритма. Одно учтите, что для лучшего восприятия приведенный алгоритм немного упрощен. Из него исключены элементы дежурного режима. Полное представление о процедуре приема сигнала ДУ вы получите после детального изучения текста этой процедуры, который представлен в виде фрагмента №10. ![]() ![]() Приведенный фрагмент состоит из собственно процедуры обработки прерывания (ьсапби) и подпрограммы чтения сигнала с фотоприемника (|'прф). Подпрограмма трГр является простейшей антидребезговой процедурой. Удобнее начать рассмотрение фрагмента именно с нее. Подоб- ную процедуру мы уже рассматривали в разделе, посвященном обработке сигнала с датчика поворота антенны. Сигналы ДУ не подвержены эффекту дребезга. Однако во избежание влияния различных помех введена простейшая накопительная подпрограмма. В данном случае подпрограмма 1пр1р осуществляет двенадцатикратное чтение входного сигнала и подсчет суммы всех принятых битов. Затем производится оценка полученной суммы. Если сумма больше или равна шести, то текущее мгновенное значение сигнала фотоприемника считается равным единице. Если сумма меньше шести, то считается, что мгновенное значение сигнала равно нулю. Я предлагаю вам самостоятельно разобраться в работе этой подпрограммы и ограничусь только несколькими общими пояснениями. Именем Юи обозначена линия порта РI, к которой подключен выход фотоприемника. Регистр гО используется в качестве параметра цикла считывания. В начале подпрограммы в этот регистр записывается начальное значение 12, которое равно количеству циклов считывания. Аккумулятор микроконтроллера в начале подпрограммы обнуляется и служит для вычисления суммы считанных битов. Бит считывается в ячейку признака переноса. Затем производится сложение содержимого накопителя с константой, равной нулю с учетом признака переноса. Операции чтения и сложения повторяются 12 раз. Оценка результата производится путем вычитания из полученной суммы битов числа шесть. По результатам вычитания устанавливается признак переноса. Однако его значение оказывается обратным относительно того, что должна возвращать подпрограмма. При преобладании единиц в считанном сигнале, мы получим ноль. И, наоборот, при преобладании нулей — единицу. Поэтому производится инверсия признака переноса (команда ср1). На этом подпрограмма трЕр завершается. Результат ее работы передается в вызывающую программу через признак переноса. Теперь перейдем к рассмотрению основной части фрагмента №10. И начнем мы ее с описания системы флагов. Для обеспечения всех необходимых режимов работы, связанных с процедурой приема команд ДУ, в программу введено несколько специальных флагов. Ниже перечислены названия всех этих флагов и их назначение. Аопс1и — флаг задержки включения ДУ. Сбрасывается в процессе начальной инициализации системы. Вызывает отключение всей процедуры считывания сигнала ДУ на некоторое время после включения питания. Используется для предотвращения ложных срабатываний от воздействия переходных процессов, вызванных включением питания. Устанавливается в единицу по окончании задержки, после чего больше не влияет на работу программы. Аоксіи — флаг готовности кода. Устанавливается в единицу сразу после того, как код очередной команды полностью принят и записан в буфер ДУ. Для основной программы позиционера служит индикатором того, что в буфере находится принятый код команды ДУ. Служит разрешением для начала процесса обработки принятого кода. Сбрасывается при переходе в режим ожидания новой команды. Аасіи — флаг включения режима приема. Устанавливается в единицу при обнаружении первого импульса кодовой посылки от пульта ДУ. Остается в этом состоянии все время, пока пульт излучает сигнал (пока кнопка на пульте нажата). Сбрасывается при пропадании сигнала от пульта (кнопка отпускается). Кроме этих трех флагов, специально введенных для процедуры приема команд ДУ, в программе используется уже знакомый нам флаг дежурного режима (ПопоП). Как любая процедура обработки прерывания, процедура приема сигнала ДУ начинается с сохранения всех используемых ею регистров. В данном случае сохраняемых регистров всего два. Сразу после сохранения регистров происходит выбор нового банка РОН. Для процедуры обработки прерываний ДУ выделен банка регистров номер три. После этих подготовительных действий начинается собственно сама процедура. Для удобства весь текст процедуры разделен на отдельные блоки, в соответствии с выполняемыми функциями. Каждый блок имеет свой заголовок. При рассмотрении программы мы будем ссылаться на эти заголовки. Итак, начинается наша процедура с модуля, обеспечивающего задержку при включении. Такую задержку пришлось ввести после первых испытаний программы дистанционного управления. Оказалось, что в момент включения возникали ложные срабатывания. Специально для режима задержки был введен флаг Попсіи. Этот флаг сбрасывается в процессе инициализации системы (см. раздел «Инициализация системы»). Там же происходит обнуление регистра г5 банка 3. Этот регистр используется в качестве счетчика задержки. В модуле задержки включения происходит проверка флага Попсіи. Если флаг сброшен, то приема команд ДУ не происходит. Вместо этого происходит увеличение содержимого регистра г5 на единицу при каждом прерывании. Затем происходит оценка содержимого этого регистра (фпе). Пока оно не равно 15, ситуация не меняется. Управление передается на конец процедуры по адресу ьс1и2. Основная часть процедуры при этом не выполняется. Когда содержимое регистра г5 достигнет 15, программа установит флаг Попби в единичное состояние. После этого модуль задержки больше никогда выполняться не будет. Сразу после начала процедуры управление будет передаваться по адресу ьбиЮ, откуда начинается основной процесс приема команд. Прием сигнала. Прием сигнала начинается с вызова подпрограммы тр1р, с описания которой мы начали рассмотрение текста процедуры. После выхода из подпрограммы признак переноса содержит текущее значение сигнала на выходе фотоприемника. Это значение необходимо программе в любом из трех режимов ее работы. Дальнейший алгоритм зависит от состояния специальных флагов. Сразу после выхода из подпрограммы начинается цепочка команд по проверке флагов. В зависимости от их значения программа выполняет ту или иную ветвь алгоритма, соответствующую одному из трех основных режимов работы. Сначала проверяется значение флага Покби (код готов/не готов). Если код готов, то программа переходит к обработке «режима ожидания отпускания кнопки». В противном случае проверяется значение флага йаби. Если этот флаг установлен в единицу, программа выполняет обработку «режима приема кода». Если же значение флага Аас1и равно нулю, то программа переходит в «режим ожидания сигнала». Рассмотрим работу процедуры приема сигнала ДУ в каждом из этих трех режимов. Изучать процедуры удобно не в той последовательности, как они записаны в тексте программы, а в порядке их чередования в процессе реальной работы. Режим ожидания сигнала (ьс1и1). Начинается с проверки значения признака переноса. Этот признак, как мы уже знаем, содержит текущее значение входного сигнала. Если признак переноса равен нулю (сигнал отсутствует), то вся процедура завершается (переход по адресу ь(1и7). Перед завершением выполняются команды перезапуска таймера Т1. Для этого в старшую и младшую части его регистра (ТН1 и ТЬ1) записывается константа, определяющая промежуток времени, через который процедура будет вызвана следующий раз. Для режима ожидания константы, записываемые в регистр таймера, будут равны Кби 1Й и Кс1и11. Они обеспечивают задержку в 1/3 Тсшн. Затем управление передается в самый конец процедуры (метка ьс1и2), где происходит восстановление регистров и завершение прерывания. Все это, напоминаю, происходит при отсутствии сигнала на входе. В том случае, если в результате проверки обнаружится, что сигнал на входе есть, то программа выполняет несколько подготовительных команд для перехода во второй режим — режим приема. Подготовительные действия сводятся к установке флага Па(1и в единичное состояние и инициализации счетчика принятых разрядов ^ггёи). В счетчик принятых разрядов программа записывает начальное значение (ко1гг<1и), которое в нашем случае равно 28. В процессе приема разрядов значение этого счетчика будет уменьшаться, и в тот момент, когда оно станет равно нулю, прием прекращается. После выполнения команд подготовки режима приема, управление передается по адресу в(1и7. В результате первая задержка перед переходом в режим приема будет равна 1/3 Тсиг„. Процедура на этом завершается, однако, благодаря тому, что флаг Аа(1и установлен в единичное значение, при следующем вызове процедуры она будет работать в режиме приема. Режим приема (вбиб). В режиме приема процедура работает ровно 28 раз. При каждом вызове процедуры происходит считывание и обработка очередного бита кода ДУ. Причем четные и нечетные принятые биты обрабатываются по-разному. Поэтому обработка режима приема начинается с проверки младшего разряда счетчика принятых битов $1гг(1и.О. Если этот разряд равен нулю, выполняются команды обработки четного разряда. Если он равен единице, то выполняются команды обработки нечетного разряда. Обработка четного разряда — это самая короткая из всех операций. Значение этого разряда просто записывается в специальный буфер ЬиАЫЕ После этого вся процедура заканчивается. Однако перед тем как выйти из этой процедуры программа передает управление по адресу 5с1и8, где происходит уменьшение значения счетчика принятых разрядов, и затем, если это не последний разряд, управление передается по адресу вёи5, где происходит загрузка регистров таймера, но уже другой константой (К(1и211, Кс1и21). Эта константа заставляет таймер сформировать задержку, равную Тсигн. При очередном запросе значение младшего бита счетчика разрядов (в^гби.О) изменится на противоположное. Поэтому программа выполнит переход по адресу вёиЗ и будет выполнять обработку нечетного разряда. Первым делом она выполнит операцию «исключающее ИЛИ» (ХОЯ) между предыдущим принятым битом, хранящимся в ЬиПзй, и новым его значением, хранящимся в ячейке признака переноса. К сожалению, операция ХОЯ в системе команд микроконтроллера АТ89С2051 не предусмотрена. Поэтому она заменяется эквивалентной операцией, состоящей из двух команд. Первая команда проверяет значение буфера ЬиАЬй. Если оно равно нулю, то значение признака переноса инвертируется. Если же в буфере ЬиАЬй окажется единица, то значение признака переноса останется без изменений. В результате выполнения этих операций ячейка признака переноса будет содержать искомую величину. То есть, ячейка признака переноса будет содержать результат операции ХОЯ между четным и нечетным битами команды ДУ. Но на этом обработка нечетного бита не заканчивается. Полученный таким образом результирующий бит записывается в сдвиговый регистр принятого кода. В программе применен 16-разрядный регистр принятого кода, в качестве которого выступают две зарезервированные ячейки в ОЗУ с начальным адресом ЬиРАи. Запись бита в такой регистр с одновременным сдвигом всего его содержимого происходит в два этапа. Сначала производится сдвиг старшего байта этого регистра с адресом ЫДйи, а затем сдвиг младшего байта. Его адрес равен ЫД(1и+1. Система команд микроконтроллера содержит несколько команд кольцевого сдвига разрядов. Однако все они применимы только к содержимому аккумулятора. Поэтому, каждый из двух байтов регистра ЬиРАи сначала переносится в аккумулятор. Там разряды числа сдвигаются при помощи команды ггс, а затем результат сдвига возвращается обратно, в соответствующую ячейку памяти. Сдвиг производится от старших разрядов к младшим. После сдвига первого байта буфера №(1и самый младший его бит должен перейти во второй байт буфера, то есть в ячейку Ьий1и+1. Для того, чтобы это стало возможным и была использована именно эта команда сдвига (ггс). На рис. 51 изображена схема работы команды ггс. ![]() Как видно из рисунка, сдвиг происходит по кольцу, от старшего разряда к младшему с использованием ячейки признака переноса с. Теперь представьте, что на первом этапе перед началом сдвига в ячейке признака переноса находится наш только что сформированный бит, предназначенный для записи в регистр приема. В аккумуляторе содер- жимое первой ячейки регистра приема. На втором этапе в ячейке признака переноса находится содержимое последнего разряда, оставшееся от первого этапа, а в аккумуляторе второй байт регистра приема. После 28 циклов приема мы получим 16-разрядный код команды. При желании можно использовать все 16 разрядов. Однако программа позиционера использует только 8 из них. Шестнадцать разрядов заложено для будущих расширений. При разработке программы в нее сознательно закладывались некоторые элементы избыточности для облегчения работ по расширению ее возможностей. В частности, предполагалось дополнить ее режимом обучения, позволяющим применять любой пульт. После операции сдвига программа завершает обработку нечетного разряда и плавно переходит к тем же самым операциям, которые выполнялись по окончании процесса обработки четного разряда, то есть по адресу вйив. Программа уменьшает содержимое счетчика принятых разрядов, записывает константы в регистры таймера и завершает процедуру обработки прерывания ДУ. Режим ожидания отпускания кнопки. Когда значение счетчика принятых битов достигнет нуля, команда фпг по адресу вйив, осуществляющая его уменьшение, не вызовет перехода по адресу в(1и5 и процессор перейдет к подготовке заключительного режима работы. То есть «режима ожидания отпускания кнопки пульта ДУ». Сначала обнуляется регистр гб, используемый в качестве счетчика задержки в этом режиме. Затем флаг готовности кода Аокйи устанавливается в единицу. На этом подготовка к новому режиму завершается. Однако пока не завершается сама процедура. Дело в том, что в этом самом месте удобнее всего расположить процедуру обработки дежурного режима. Как уже упоминалось, в дежурном режиме основная программа не работает. Однако позиционер должен выходить из дежурного режима не только при помощи кнопки «Вкл/выкл», но и при помощи пульта ДУ. Именно в этом месте программы, после того, как код от пульта ДУ принят, можно проверить, не равен ли он коду команды на включение позиционера. Обработка дежурного режима начинается с оценки значения флага Иопо(Т. Если значение этого флага равно нулю, то это не дежурный режим, управление передается по адресу ьс1и7, и дальнейшие операции по обработке дежурного режима не выполняются. Если флаг равен нулю, то это значит, что позиционер в дежурном режиме. В этом случае программа производит проверку принятого кода. Выход из дежурного режима должен происходить при нажатии на пульте ДУ одной из двух кнопок: кнопки «Вкл/выкл» или кнопки «1» (включения первого канала). Для осуществления проверки только что принятый код ДУ копируется в аккумулятор. Затем последовательно производятся две операции сравнения. Содержимое аккумулятора сравнивается сначала с кодом кнопки «Вкл/выкл» пульта (вбриД, а затем с кодом кнопки «1» (в<11). Если код ДУ не совпал ни с одним из вариантов, то выполнение программы продолжается в прежнем режиме. Если хотя бы одно из условий выполнилось, то выполняется переход по адресу вйиСЖ, где производятся операции, обеспечивающие выход позиционера из дежурного режима. Эти операции полностью повторяют аналогичные операции, выполняемые при первом способе выхода из дежурного режима. То есть при нажатии на кнопку «Вкл/Выкл» на клавиатуре. Как бы ни закончилась обработка дежурного режима, управление во всех случаях передается в одно и то же место — по адресу 8(1и7. В результате, перед выходом из процедуры таймер настраивается на формирование задержки в режиме ожидания в 1/3 Тсигн. Благодаря новому значению флага Поксіи при последующем вызове процедуры прерывания ДУ, она будет работать в режиме «ожидания отпускания кнопки пульта». Режим ожидания отпускания кнопки пульта ДУ. Программа обработки этого режима предельно проста. Первая команда проверяет значение признака переноса. Там в этот момент хранится значение входного сигнала. Если сигнал отсутствует, то процессор переходит по адресу вби9, где находится начало программного счетчика задержки. При каждом таком обращении содержимое счетчика увеличивается на единицу. Если при очередном обращении входной сигнал окажется равным единице, то счетчик обнуляется (команда шоу г6,#0) и счет начинается сначала. При этом процедура завершается переходом по адресу всіиб. При этом таймер будет запрограммирован на длительность задержки 1/3 Тсигн. И только в том случае, если сигнал на входе долгое время отсутствует (кнопка отпущена и выдача команд прекратилась), то счетчик досчитывает до своего максимального значения (255). Как только это произойдет, программа не совершит переход по адресу вби7, а перейдет к выполнению команд подготовки к начальному режиму (режиму ожидания сигнала). Подготовка состоит из двух команд, выполняющих сброс флагов Пасій и Поксіи. Затем программа выполняет переход по адресу 8(1и7, программирует таймер и заканчивает свою работу. При следующем вызове процедура будет работать в режиме ожидания. Теперь позиционер готов к приему следующей команды ДУ. Используются технологии uCoz
|