Разработка микропроцессорного устройства управления двухтактным двигателем внутреннего сгорания, страница 2

Разработка алгоритма решения задачи

Каждая программа имеет четыре основные части: инициализация, ввод данных, обработка данных, вывод данных.

Инициализация. Так как в программе происходит обращение к портам, то необходима инициализация интерфейса ввода/вывода путем загрузки управляющего байта 89h в порт 83h (модуль 1 алгоритма). Также, инициализация состоит в установке начальных значений регистров (например, указателя стека) и переменных (модуль 2). В данной программе необходимы две переменные: «текущий режим» и «текущая фаза». После старта программы и инициализации интерфейса ввода/вывода и переменных на индикаторах нужно установить текущую фазу работы двигателя. Для этого необходимо подготовить данные для вывода и соответствующим образом изменить переменную «текущая фаза» (модуль 3). После чего следует вывод новой фазы работы двигателя (модуль 4).

Для того чтобы двигатель крутился не слишком быстро следует ввести замедляющий цикл. Здесь необходимо ввести информационный элемент L1– «количество повторов цикла задержки». В модуле 5 происходит инициализация цикла задержки (d:=L1). Так как во время выполнения временной задержки (которая занимает большую часть времени работы процессора) может быть нажата клавиша, то целесообразно внутри цикла организовать опрос клавиатуры (модуль 6).

По результатам опроса клавиатуры переменная «текущий режим» принимает те или иные значения (см. далее модуль 6.6). В программе используются два режима «пуск» и «стоп». Отличие второго от первого в том, что временная задержка бесконечна. Если текущий режим «стоп» (модуль 7), то происходит переход к модулю 6 – временная задержка без уменьшения счетчика цикла. Если текущий режим «пуск» то происходит уменьшение счетчика цикла временной задержки и проверка его на 0 (модуль 8 и 9). Если d не 0 то продолжается отработка временной задержки, иначе следует переходить к выводу новой фазы.

Модуль 6 в этом алгоритме требует большей детализации (рис.1.2.). при опросе клавиатуры происходит анализ нажатия клавиш «0» и «1» - младшие 2 бита порта ввода 82H. При опросе порта необходимо учесть эффект дребезга. Отличительной чертой сигналов дребезга от полезного сигнала  является их малая длительность, но благодаря высокому быстродействию микропроцессора, дребезг может быть воспринят как полезный сигнал. Длительность сигнала может быть измерена путем подсчета количества повторений цикла ввода. Здесь необходимо ввести информационный элемент – L2 «количество повторов при защите от дребезга». Если количество повторов больше L2, то сигнал программой воспринимается как полезный.

Реакция микропроцессорной системы на нажатую клавишу может происходить на нажатие клавиши и отжатие. Первый способ самый удобный для пользователя и самый сложный для реализации. Этот способ требует одинаковой временной задержки в независимости от того, нажата клавиша, отжата или происходит дребезг. Наиболее простой способ опроса клавиатуры – на отжатие клавиши. Недостаток этого способа состоит в том, что работа в новом режиме начинается после отпуска клавиши – очень неудобно для пользователя.

Разработаем алгоритм опроса клавиатуры.

Инициализация цикла защиты от дребезга происходит в модуле 6.1. Далее, после ввода с порта клавиатуры (модуль 6.2) происходит проверка на нажатие клавиши переключающей двигатель на другой режим (если никакая клавиша не нажата, в том числе и вследствие дребезга, то происходит выход из модуля 6). Это условие проверяется в модуле 6.3. Иначе, происходит декремент и проверка на 0 счетчика (модули 6.4. и 6.5.). В том случае когда в счетчике не 0, то происходит дальнейший опрос клавиатуры. После достижения счетчика цикла защиты от дребезга 0 (т.е. получен полезный сигнал с клавиатуры) необходимо сохранить новый режим работы двигателя (модуль 6.6.).

Аналогичным образом происходит обработка защиты от дребезга на отжатие клавиши (модули 6.7. –6.11.). После отпуска клавиши и отработки дребезга (L2 повторов нулевого состояния порта клавиатуры), происходит выход из модуля 6.