;
; count frequency for precisely 200 msecs (5 Hz resolution)
;
NewCount
clrf TMR0 ; clear TMR0 and prescaler |B0
clrf CountL ; clear 24 bit counter variables |B0
clrf CountH ; |B0
clrf CountU ; |B0
movlw 200 ; |B0
movwf MsecCtr ; gate timer = 200 msecs |B0
movlw TRISA ; |B0
movwf FSR ; setup indirect access to TRISA |B0
bsf INDF,4 ; TRISA.4 = 1, gate "on" |B0
GateLoop
btfsc INTCON,T0IF ; TMR0 overflow? no, skip, else |B0
incf CountU,F ; bump CountU |B0
btfsc INTCON,T0IF ; TMR0 overflow? no, skip, else |B0
bcf INTCON,T0IF ; clear T0IF interrupt flag |B0
DelayCy(1*msecs-7) ; delay 1 msec minus 7 cycles |B0
decfsz MsecCtr,F ; 200 msecs? yes, skip, else |B0
goto GateLoop ; loop again |B0
bcf INDF,4 ; TRISA.4 = 0, gate "off" |B0
btfsc INTCON,T0IF ; TMR0 overflow? no, skip, else |B0
incf CountU,F ; bump CountU |B0
bcf INTCON,T0IF ; clear T0IF interrupt flag |B0
;
; capture 1:256 prescaler value
;
movf TMR0,W ; |B0
movwf CountH ; save TMR0 value |B0
Flush bsf STATUS,RP0 ; bank 1 |B1
bcf OPTION_REG,T0SE ; clock on rising edge |B1
bsf OPTION_REG,T0SE ; clock on falling edge |B1
bcf STATUS,RP0 ; bank 0 |B0
decf CountL,F ; decrement counter LSB |B0
movf TMR0,W ; |B0
xorwf CountH,W ; prescaler overflow into TMR0? |B0
bz Flush ; no, clock prescaler again |B0
;
; divide by 2 for 10 Hertz resolution
;
clrc ; divide by 2 (10 Hz resolution) |B0
rrf CountU,F ; |B0
rrf CountH,F ; |B0
rrf CountL,F ; |B0
;