;High priority interrupt routine.
HighIntCode:
movff FSR0H,FSR0H_SHADOW ;save FSR0H register
movff FSR0L,FSR0L_SHADOW ;save FSR0L register
btfss PIR2, CCP2IF ;check CCP2 INT
goto NextINT
btfsc PIR1, TMR1IF ;skip if TMR1 OVF
goto OverF
btfsc Flags, INTC ;skip if first capture
goto Flag2 ;second capture
clrf TMR1H
clrf TMR1L
clrf CCPR2H
clrf CCPR2L
bsf T1CON, TMR1ON ;Turn T1 on
bcf PIR1, TMR1IF ;clr INT flag
bsf Flags, INTC ;Record 1st Capture
goto EndHiInt2
Flag2: ;Second int, capture value.
btfsc PIR1, TMR1IF ;test if T1 OVF
goto OverF
movff CCPR2H, ACCbHI
movff CCPR2L, ACCbLO
bsf Flags, CAPT ;indicate capture occured
bcf PIE2, CCP2IE ;turn off CCP2 int
bcf TMR1, TMR1ON ;turn off TMR1
goto EndHighInt1
NextINT:
nop ;Place other Hi Priority int here
; bra Iserv ;if so, go get timing pulses
;can do special error handling here - an unexpected interrupt occurred
OverF:
bcf Flags, INTC
bcf Flags, CAPT
EndHighInt1:
bcf PIR1, TMR1IF ;Clear T1 Int
bcf Flags, INTC
EndHiInt2:
bcf PIR2, CCP2IF ;Clr CCP2 INT
movff FSR0L_SHADOW, FSR0L ;restore FSR0L register
movff FSR0H_SHADOW, FSR0H ;restore FSR0H register
retfie FAST ;return and restore context
Setup:
bcf INTCON, GIE ;disable global interrupts
bcf INTCON, PEIE ;disable peripheral interrupts (enable for USART)
bcf PIE1, TMR1IE ;disable timer 1 interrupts
bcf PIE2, CCP2IE ;disable CCP2 interrupts
bcf PIR1, TMR1IF ;clear TMR1 interrupt flag
bcf PIR2, CCP2IF ;Clr CCP2 int Flag
clrf WREG
movff WREG, ANSELA ;set all ports I/O
movff WREG, ANSELB
movff WREG, ANSELC
bsf TRISB, CCP2_PORTB ;set CCP2 input
movlw 0x05
movwf CCP2CON ;set every rising edge cap
clrf CCPR2H ;clear registers
clrf CCPR2L
clrf CCPTMRS0 ;Set for tmr 1
; movlw
bsf RCON, IPEN ;enable priority int
;----
clrf Flags
; incf Flags
movlw 0xbe ;tmr1 prescaler /8 and TMR1 off,
movwf T1CON ;and 32khz clk
clrf TMR1H ;clear timer 1 high
clrf TMR1L ;clear timer 1 low
; clrf PORTA ;Sst PORTA for I/O
bcf ADCON0, 0 ;Set ADCON0 off
movlw 0x0f
bsf INTCON, GIE
bsf PIE2, CCP2IE ;enable CCP2 interrupts
return
;