Читайте также: |
|
Алгоритм основной программы приведен на рис. 5.8., а алгоритм драйвера прерываний на рис. 5.9.
Рис. 5.8. Блок-схема алгоритма основной программы
Рис. 5.9. Блок-схема алгоритма обработчика прерываний
В данной программе используются все три таймера микроконтроллера PIC16F873A. TMR0 формирует выдержку 50 мс для защиты от дребезга контактов кнопки, TMR1 формирует выдержку времени длительностью пол периода звучания зуммера, то есть 0,5 с. TMR2 формирует выдержку времени равную половине периода частоты 2 кГц.
В первом блоке алгоритма подключается текстовый файл с символьными обозначениями РСН.
Порт А к которому подключен звукоизлучатель BZ1 настраивается на вывод информации, а порт В, к которому подключены контакты кнопок, – на ввод. К выводам порта В подключаются внутренние подтягивающие резисторы.
Разрешаются прерывания от таймеров, а так же от внешнего входа запроса прерываний INT, к которому подключена кнопка SA6. Таймеры настраиваются на соответствующие режимы работы и выдержки времени.
Во втором блоке программа ожидает вызов прерываний от одного из разрешенных источников.
Вся остальная обработка происходит в драйвере прерываний.
После вызова прерывания (блок 3) необходимо опросить флаги прерываний для того, что бы определить источник, вызвавший это прерывание. Необходимо учесть, что несколько флагов может ввестись одновременно.
В блоке 4 проверяется флаг прерывания от таймера TMR0. Если флаг сброшен, то программа переходит к опросу флага прерывания от таймера TMR1. Если флаг прерывания от таймера TMR0 взведен, то проверяется состояние кнопки SA6 (блок 5), если она отпущена, то это значит, что либо дребезг контактов еще не закончился, либо дребезг контактов возник при отпускании кнопки. В данном случае программа так же переходит к опросу флага прерывания от таймера TMR1. Если контакты кнопки замкнуты, то программа переходит к проверке состояния таймера TMR1 (блок 6). Если таймер выключен, то он настраивается на выдержку времени 0,5с и включается (блок 7), так же настраивается на выдержку времени 250мкс и включается таймер TMR2, формирующий звуковой сигнал (блок 9). Если таймер TMR1 уже был включен, то оба таймеры (TMR1 и TMR2) выключаются (блоки 8 и 10) и звуковой сигнал прекращается.
В блоке 11 проверяется флаг прерывания от таймера TMR1. Если флаг сброшен, то программа переходит к опросу флага прерывания от таймера TMR2. Если же флаг прерывания от таймера TMR1 взведен, то проверяется состояние таймера TMR2 (блок 12). Во время звукового импульса таймер TMR2 настраивается на выдержку времени 250 мкс и включается (блок 13), а во время интервала выключается (блок 14).
В блоке 15 проверяется флаг прерывания от таймера TMR2. Если он сброшен, то программа переходит к проверке прерывания от внешнего источника (кнопка SA6). Если флаг прерывания от таймера TMR2 взведен, то проверяется текущее состояние второго разряда порта А (блок 16) и изменение его на противоположное (блоки 17 и 18).
В блоке 19 проверяется флаг прерывания от внешнего источника INTF. Если флаг сброшен, то программа выходит из драйвера прерываний (блок 21), если флаг взведен (произошло замыкание контактов кнопки SA6), то таймер TMR0 настраивается на выдержку времени 50 мс и включается (блок 20). Далее программа выходит из обработчика прерываний в основную программу до возникновения следующего прерывания.
Дата добавления: 2015-07-08; просмотров: 195 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Написание текста программы на языке Ассемблер | | | Написание текста программы на языке Ассемблер |