;=======================================================
; Проект 32. Измеритель длительности импульса (TMR1 + захват CCP)
; PIC16F877A, 4 МГц. Вход сигнала — RC2/CCP1
; Результат (старший байт длительности) — на RB0..RB7
;=======================================================
        LIST    p=16F877A
        #include <p16f877a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF

        cblock  0x20
        t1l, t1h, res
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB           ; индикация
        bsf     TRISC,2         ; RC2/CCP1 — вход
        bcf     STATUS,RP0
        movlw   b'00000001'     ; TMR1 вкл, предделитель 1:1, внутр. такт
        movwf   T1CON

Main
        movlw   b'00000101'     ; захват по нарастающему фронту
        movwf   CCP1CON
        bcf     PIR1,CCP1IF
        clrf    TMR1L
        clrf    TMR1H
W1      btfss   PIR1,CCP1IF     ; ждём начала импульса
        goto    W1
        clrf    TMR1L           ; обнуляем счётчик
        clrf    TMR1H

        movlw   b'00000100'     ; захват по спаду
        movwf   CCP1CON
        bcf     PIR1,CCP1IF
W2      btfss   PIR1,CCP1IF     ; ждём конца импульса
        goto    W2

        movf    CCPR1L,w        ; младший байт результата
        movwf   t1l
        movf    CCPR1H,w        ; старший байт
        movwf   t1h
        movf    t1h,w           ; выводим старший байт
        movwf   PORTB
        goto    Main

        END
