MAIN movlw h’77’; Загружаем число h’77FF’, чтобы сформировать
movwf CCPR1H; интервал длительностью 60/64 с
movlw h’FF’
movwf CCPR1L
bsf STATUS,RP0; Переключаемся в 1-й банк
movlw b’00111000’; Таймер 0 — внешний сигнал, спад, фронт
movwf OPTION_REG; Без предделителя
bsf PIE1,CCP1IE; Разрешаем прерывание от ССР1
movlw b’00000110’; Все выводы порта А — цифровые
movwf ADCON1
bcf STATUS,RP0; Возвращаемся в 0-й банк
movlw b’00001011’; Модуль ССР в режиме сравнения (1011)
movwf CCP1CON; сбрасывает Таймер 1
movlw b’00001011’; Таймер 1 — предделитель 1:1, собств. генератор,
movwf T1CON; синхронный режим
clrf NEW; Сбрасываем флаг
bsf INTCON,PEIE; Разрешаем прерывания от Таймера/ССР
bsf INTCON,GIE; Разрешаем все прерывания
clrf TMR0; Обнуляем счетчик импульсов
clrf TMR1H
clrf TMR1L
; <<<< Остальной код фоновой программы >>>>
; **********************
; Сначала сохраним контекст
ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf _status
; ***********************
; Основной код
btfss PIR1,CCP1IF; Сброс Таймера 1 от ССР1?
goto ISR_EXIT; ЕСЛИ нет, ТО ложная тревога
incf NEW,f; Индицируем наличие нового значения
movf TMR0,w; Берем подсчитанное число импульсов
clrf TMR0; Обнуляем счетчик
movwf RPM; Сохраняем результат во временном регистре
; Теперь умножим на 64
clrf RPM+1; Обнуляем младший байт
rrf RPM,f; об/м — старший бит, т. е. х256
rrf RPM+1,f; >>2 для преобразования об/с в об/мин
rrf RPM,f
rrf RPM+1,f
bcf RPM,7; Сбрасываем два старших бита
bcf RPM,6
bcf PIR1,CCP1IF; Сбрасываем флаг прерывания
; ****************************
ISR_EXIT swapf _status,w; Восстанавливаем регистр STATUS
movwf STATUS
swapf _work,f; Восстанавливаем регистр W,
swapf _work,w; не затрагивая регистра STATUS,
retfie ; и выходим из прерывания
Необходимо с помощью микроконтроллера PIC16F877 измерить длительность некоторого события. Этим событием является ВЫСОКИЙ уровень сигнала, как показано на Рис. 13.11. Предполагается, что частота системного резонатора равна 8 МГц, а длительность измеряемого импульса не превышает 100 мс.
Рис 13.11.
Решение
Один из возможных вариантов решения этой задачи заключается в одновременной подаче отслеживаемого сигнала на выводы ССР1 и ССР2. Используя один из модулей для захвата нарастающего фронта, а другой — спадающего фронта, можно будет вычислить интервал между событиями, равный разности между двумя сохраненными значениями. В Программе 13.7 по нарастающему фронту импульса Таймер 1 обнуляется, соответственно состояние Таймера 1, захваченное по спадающему фронту, представляет собой искомую длительность. Если таймер будет работать от системного тактового сигнала с коэффициентом деления предделителя, равным 4, то инкрементирование счетного регистра будет происходить с частотой 500 кГц, т. е. временное разрешение составит 2 мкс. Максимальная длительность, которая может быть измерена при такой конфигурации, равна 216 х 2 мкс = 131.077 мс. Этого достаточно для работы с нашим сигналом, длительность которого не превышает 100 мс.