NewCount
clrf TMR0 ; clear TMR0 and prescaler |B0
bcf INTCON,T0IF ; clear T0IF interrupt flag |B0
clrf CountL ; clear 24 bit counter registers |B0
clrf CountH ; |B0
clrf CountU ; |B0
movlw 200 ; |B0
movwf msctr ; gate timer = 200 msecs |B0
movlw TRISIO ; |B0
movwf FSR ; setup TRISIO indirect access |B0
bsf INDF,2 ; counter "on" (T0CKI = input) |B0
;
; count pulses on the T0CKI input for precisely 200-msecs
;
GateOn setz ; set Z = 1 |B0
btfsc INTCON,T0IF ; TMR0 overflow? no, skip, else |B0
incf CountU,F ; bump CountU, Z = 0 |B0
skpz ; TMR0 overflow? no, skip, else |B0
bcf INTCON,T0IF ; clear T0IF interrupt flag |B0
DelayCy(1*msecs-8) ; delay 1 msec minus 8 cycles |B0
decfsz msctr,F ; 200 msecs? yes, skip, else |B0
goto GateOn ; loop again |B0
bcf INDF,2 ; counter "off" (T0CKI = output) |B0
btfsc INTCON,T0IF ; TMR0 overflow? no, skip, else |B0
incf CountU,F ; bump CountU |B0
bcf INTCON,T0IF ; clear T0IF interrupt flag |B0
;
; collect 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 it again |B0
;
; do something with the 24-bit (frequency/5) count
;