В Программе 13.5 Таймер 0 конфигурируется для работы на частоте 2 МГц (
Наличие такой компенсации может вызвать проблемы при крайних значениях коэффициента заполнения. Почему это происходит и что можно предпринять для улучшения данной ситуации?
MAIN bsf STATUS,RP0
; Переключаемся в 1-й банкmovlw b’00001000’
; Внутренний такт, сигнал, предделитель выкл.movwf OPTION_REG
bcf TRISA,0
; RA0 — выходbcf STATUS,RP0
; Возвращаемся в 0-й банкbsf INTCON,T0IE
; Разрешаем прерывание от Таймера 0bsf INTCON,GIE
; Разрешаем все прерывания; <<<<Остальной код фоновой программы>>>>
; *************
; * Обработчик прерывания формирует ШИМ-сигнал на выводе RA0 *
; * Значение периода в DATUM. PORTA[0] — текущее состояние ШИМ *
; *************
; Сначала сохраним контекст -
ISR movwf _work;
Сохраняем Wswapf STATUS,w
; и регистр STATUSmovwf _status
; *************
; Основной код
btfss INTCON,T0IF
; Было переполнение Таймера 0?goto ISR_EXIT
; ЕСЛИ нет, TO ложная тревогаbcf INTCON,T0IF
; Сбрасываем флаг прерыванияmovf DATUM,w
; Берем значениеbtfsc PORTA,0
; Сейчас на выходе НИЗКИЙ уровень?goto MAKE_L0
; ЕСЛИ нет, ТО выставляем НИЗКИЙМАКЕ_Н1 bsf PORTA,0
; ИНАЧЕ выставляем ВЫСОКИЙ уровень,xorlw b’11111111’
; вычисляем дополнительный кодaddlw 1
; (инвертируем и прибавляем 1)goto SET_UP
; и загружаем значение в Таймер 0MAKE_L0 bcf PORTA,0
; Выставляем на вывод НИЗКИЙ уровеньSET_UP addlw 2
; Компенсация задержки синхронизатораmovwf TMR0
; Инициализирум счетный регистр таймера; *************
ISR_EXIT swapf _status,w
; Восстанавливаем регистр STATUSmovwf STATUS
swapf _work,f
; Восстанавливаем регистр W,swapf _work,w
; не затрагивая регистра STATUS,retfie
; и выходим из прерыванияНекий тахометр предназначен для регистрации скорости вращения двигателя в диапазоне 0…120 000 об/мин. При каждом обороте вала двигателя генерируется один импульс. Для подсчета числа этих импульсов в секунду и вычисления соответствующего значения в об/мин предполагается использовать микроконтроллер PIC16F877. Используя два или три имеющихся в этой модели таймера, можете ли вы разработать схему подключения микроконтроллера и написать соответствующую программу для решения данной задачи?
Решение
Скорость в 12 000 об/мин соответствует 200 оборотам в секунду. Таким образом, в качестве счетчика импульсов мы можем использовать Таймер 0, тактируемый непосредственно с вывода T0CKI, без предделителя.