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
; Разрешаем прерывание от ССР1movlw b’00000110’
; Все выводы порта А — цифровыеmovwf ADCON1
bcf STATUS,RP0
; Возвращаемся в 0-й банкmovlw b’00001011’
; Модуль ССР в режиме сравнения (1011)movwf CCP1CON
; сбрасывает Таймер 1movlw b’00001011’
; Таймер 1 — предделитель 1:1, собств. генератор,movwf T1CON
; синхронный режимclrf NEW
; Сбрасываем флагbsf INTCON,PEIE
; Разрешаем прерывания от Таймера/ССРbsf INTCON,GIE
; Разрешаем все прерыванияclrf TMR0
; Обнуляем счетчик импульсовclrf TMR1H
clrf TMR1L
; <<<< Остальной код фоновой программы >>>>
; **********************
; Сначала сохраним контекст
ISR movwf _work
; Сохраняем Wswapf STATUS,w
; и регистр STATUSmovwf _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
; об/м — старший бит, т. е. х256rrf 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
; Восстанавливаем регистр STATUSmovwf 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 мс.