Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОМТ (на редактировании).doc
Скачиваний:
31
Добавлен:
17.05.2015
Размер:
3.86 Mб
Скачать

Порядок выполнения работы

В данной лабораторной работе необходимо разработать и отладить программу, формирующую временные интервалы при помощи таймеров микроконтроллера. Конкретное задание выдается преподавателем.

В качестве примера рассмотрим следующее задание. В исходном состоянии звуковой сигнал отсутствует. При нажатии на кнопку SA6 включается прерывистый зуммер с частотой сигнала 2 кГц и периодом звучания 1 с. При повторном нажатии на кнопку SA6 звук прекращается.

Постановка задачи

Исходную словесную форму задания можно представить в виде графа переходов (рис. 5.7.), аналогично лабораторной работе 3.

Рис. 5.7. Граф переходов по программе

Как видно из рисунка, имеется всего два состояния программы и два перехода между ними. Единственную сложность представляет то, что переходы происходят по нажатию одной и той же кнопки, а как известно замыкание контактов происходит не мгновенно и сопровождается явлением, называемым «дребезгом», то есть многократным замыканием и размыканием электрической цепи. Таким образом не возможно предугадать в каком из состояний окажется программа после очередного нажатия на кнопку SA6. Для исключения дребезга контактов существует целый ряд способов, самым простым является проверка замкнутого либо разомкнутого состояния контактов на протяжении определенного времени. В большинстве случаев это время не превышает 50 мс.

Разработка алгоритма программы

Алгоритм основной программы приведен на рис. 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). Далее программа выходит из обработчика прерываний в основную программу до возникновения следующего прерывания.

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

#include p16f873a.inc

__CONFIG _HS_OSC ;высокочастотный кварцевый резонатор

ORG H'000' ;вектор сброса

GOTO BEGIN ;переход на начало основной программы

ORG H'004' ;вектор прерывания

GOTO INT ;переход к обработчику прерываний

;начало основной программы

BEGIN: BSF STATUS,RP0 ;выбираем банк регистров 1

;задаем режимы работы параллельных портов

MOVLW B'00001110' ;задаем аналоговый вход PORTA,0

MOVWF ADCON1 ;программируем регистр АЦП 1

MOVLW B'00000001' ;PORTA, 7-1 выходы, PORTA, 0 вход

MOVWF TRISA ;программируем регистр направления PORTA

MOVWF OPTION_REG;включаем подтягивающие резисторы PORTB

MOVLW B'11111111' ;PORTB, 7-0 входы

MOVWF TRISB ;программируем регистр направления PORTB

;задаем режим работы таймера TMR0

MOVLW B'00100111' ;коэфф. деления предделителя 1:256

MOVWF OPTION_REG;|

BCF STATUS,RP0 ;выбираем банк регистров 0

MOVLW D'60' ;задаем выдержку времени 256*(256-60)=50176мкс

MOVWF TMR0 ;|

;задаем режим работы таймера TMR1

MOVLW B'00110000' ;коэфф. деления предделителя 1:8

MOVWF T1CON ;|

MOVLW H'0B' ;задаем выдержку времени 8*(65536-3036)=500000

MOVWF TMR1H ;|

MOVLW H'DC' ;|

MOVWF TMR1L ;|

;задаем режим работы таймера TMR2

MOVLW B'00000000' ;коэфф. деления делителей 1:1

MOVWF T2CON ;|

BSF STATUS,RP0 ;выбираем банк регистров 1

MOVLW D'250' ;задаем период таймера 2

MOVWF PR2 ;|

;разрешаем прерывания от таймеров и входа INT

MOVLW B'11110000' ;биты GIE, PEIE, T0IE и INTE = 1

MOVWF INTCON ;программируем регистр управления прерываниями

BSF PIE1,TMR1IE ;разрешение прерываний от таймера 1

BSF PIE1,TMR2IE ;разрешение прерываний от таймера 2

;основная программа

M10: GOTO M10 ;зацикливаемся здесь

;драйвер прерываний от таймеров и внешнего входа

INT: BCF STATUS,RP0 ;выбираем банк регистров 0

BTFSS INTCON,T0IF;проверка флага прерывания от таймера 0

GOTO I20 ;переход к проверке флага прерыв. от таймера 1

BCF INTCON,T0IF;сброс флага прерывания от таймера 0

BSF STATUS,RP0 ;выбираем банк регистров 1

BSF OPTION_REG,T0CS ;выключаем таймер 0

BCF STATUS,RP0 ;выбираем банк регистров 0

BTFSC PORTB,0 ;проверка, что кнопка SA6 все еще нажата

GOTO I20 ;переход к проверке флага прерыв. от таймера 1

BTFSS T1CON,TMR1ON ;проверка, что таймер 1 включен

GOTO I10 ;переход к включению таймера 1

BCF T1CON,TMR1ON;выключение таймера 1

BCF T2CON,TMR2ON;выключение таймера 2

GOTO I20 ;переход к проверке флага прерыв. от таймера 1

I10: MOVLW H'0B' ;задаем выдержку времени 8*(65536-3036)=500000

MOVWF TMR1H ;|

MOVLW H'DC' ;|

MOVWF TMR1L ;|

BSF T1CON,TMR1ON;включение таймера 1

BSF T2CON,TMR2ON;включение таймера 2

I20: BTFSS PIR1,TMR1IF ;проверка флага прерывания от таймера 1

GOTO I40 ;переход к проверке флага прерыв. от таймера 2

BCF PIR1,TMR1IF ;сброс флага прерывания от таймера 1

MOVLW H'0B' ;перезапускаем таймер 1

MOVWF TMR1H ;задаем выдержку времени 8*(65536-3036)=500000

MOVLW H'DC' ;|

MOVWF TMR1L ;|

BTFSS T2CON,TMR2ON;проверка, что таймер 2 включен

GOTO I30 ;переход к включению таймера 2

BCF T2CON,TMR2ON;выключение таймера 2

GOTO I40 ;переход к проверке флага прерыв. от таймера 2

I30: BSF T2CON,TMR2ON;включение таймера 2

I40: BTFSS PIR1,TMR2IF ;проверка флага прерывания от таймера 2

GOTO I60 ;переход к проверке флага внешнего прерывания

BCF PIR1,TMR2IF ;сброс флага прерывания от таймера 2

BTFSS PORTA,2 ;проверка, что на BZ1 '1'

GOTO I50 ;переход к подаче импульса на BZ1

BCF PORTA,2 ;сброс BZ1 в '0'

GOTO I60 ;переход к проверке флага внешнего прерывания

I50: BSF PORTA,2 ;установка BZ1 в '1'

I60: BTFSS INTCON,INTF;проверка флага внешнего прерывания

GOTO I70 ;переход к выходу из драйвера прерываний

BCF INTCON,INTF;сброс флага внешнего прерывания

MOVLW D'60' ;задаем выдержку времени 256*(256-60)=50176мкс

MOVWF TMR0 ;|

BSF STATUS,RP0 ;выбираем банк регистров 1

BCF OPTION_REG,T0CS ;включаем таймер 0

I70: RETFIE ;выход из драйвера прерываний

END ;конец программы

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описан в лабораторной работе 1.

Тестирование и отладка

На этапе отладки программы необходимо выявить и устранить все возникшие на предыдущих этапах ошибки. Описание процесса программирования микроконтроллера и запуска программы приведен в лабораторной работе 1.

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо поддерживать лишь до момента защиты лабораторной работы преподавателю.