;******************************************************************
;
; static unsigned int Pulse = 1500; // range 600..2400 (usecs)
;
; void isr_hi ()
; { if (PIR1bits.CCP1IF == 1) // if CCP1 interrupt
; { if (CCP1CONbits.CCP1M0 == 0) // CCP1 is 'hi' so
; { CCPR1 += Pulse; // setup Pulse "on time"
; CCP1CONbits.CCP1M0 = 1; // make pin 'lo' on next
; } // compare match interrupt
; else // CCP1 is 'lo' so
; { CCPR1 += (20000-Pulse); // setup Pulse "off time"
; CCP1CONbits.CCP1M0 = 0; // make pin 'hi' on next
; } // compare match interrupt
; PIR1bits.CCP1IF = 0; // clear CCP1 int flag
; }
; }
;
ISR
movwf W_ISR ; save W-reg |B?
swapf STATUS,W ; doesn't change STATUS bits |B?
movwf S_ISR ; save STATUS reg |B?
clrf STATUS ; force bank 0 |B0
movf FSR,W ; |B0
movwf F_ISR ; save FSR |B0
;
btfss PIR1,CCP1IF ; CCP module interrupt? |B0
goto ISR_Xit ; no, branch, else |B0
;
btfsc CCP1CON,CCP1M0 ; is Pulse hi or lo? |B0
goto Pulse_Lo ; lo, branch, else |B0
;
; pulse is hi so setup CCP1 to go lo on Pulse "on-time" match
;
Pulse_Hi
movf PulseLo,W ; |B0
addwf CCPR1L,f ; CCPR1L += (Pulse)%256 |B0
movf PulseHi,W ; |B0
skpnc ; |B0
incf PulseHi,W ; |B0
addwf CCPR1H,f ; CCPR1H += (Pulse)/256 |B0
bsf CCP1CON,CCP1M0 ; setup CCP1 to go lo next match |B0
goto ISR_Xit ; |B0
;
; pulse is lo so setup CCP1 to go hi on pulse "off-time" match
;
Pulse_Lo
movf PulseLo,W ; |B0
sublw low d'20000' ; |B0
skpc ; borrow? no, skip, else |B0
decf CCPR1H,f ; |B0
addwf CCPR1L,f ; CCPR1L += (20000-Pulse)%256 |B0
skpnc ; |B0
incf CCPR1H,f ; |B0
movf PulseHi,W ; |B0
sublw high d'20000' ; |B0
addwf CCPR1H,f ; CCPR1H += (20000-Pulse)/256 |B0
bcf CCP1CON,CCP1M0 ; setup CCP1 to go hi next match |B0
;
; restore main program context
;
ISR_Xit
bcf PIR1,CCP1IF ; clear CCP1 interrupt flag |B0
movf F_ISR,W ; |B0
movwf FSR ; restore FSR |B0
swapf S_ISR,W ; |B0
movwf STATUS ; restore STATUS |B?
swapf W_ISR,f ; don't screw up STATUS |B?
swapf W_ISR,W ; restore W-reg |B?
retfie ; return from interrupt |B?