В Программе 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; Разрешаем прерывание от Таймера 0
bsf INTCON,GIE; Разрешаем все прерывания
; <<<<Остальной код фоновой программы>>>>
; *************
; * Обработчик прерывания формирует ШИМ-сигнал на выводе RA0 *
; * Значение периода в DATUM. PORTA[0] — текущее состояние ШИМ *
; *************
; Сначала сохраним контекст -
ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf _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; и загружаем значение в Таймер 0
MAKE_L0 bcf PORTA,0; Выставляем на вывод НИЗКИЙ уровень
SET_UP addlw 2; Компенсация задержки синхронизатора
movwf TMR0; Инициализирум счетный регистр таймера
; *************
ISR_EXIT swapf _status,w; Восстанавливаем регистр STATUS
movwf STATUS
swapf _work,f; Восстанавливаем регистр W,
swapf _work,w; не затрагивая регистра STATUS,
retfie; и выходим из прерывания
Некий тахометр предназначен для регистрации скорости вращения двигателя в диапазоне 0…120 000 об/мин. При каждом обороте вала двигателя генерируется один импульс. Для подсчета числа этих импульсов в секунду и вычисления соответствующего значения в об/мин предполагается использовать микроконтроллер PIC16F877. Используя два или три имеющихся в этой модели таймера, можете ли вы разработать схему подключения микроконтроллера и написать соответствующую программу для решения данной задачи?
Решение
Скорость в 12 000 об/мин соответствует 200 оборотам в секунду. Таким образом, в качестве счетчика импульсов мы можем использовать Таймер 0, тактируемый непосредственно с вывода T0CKI, без предделителя.