Anta att jag vill mäta amperetimmar, genom att räkna pulser, Frekvensen är proportionell mot strömmen. Genom att räkna dessa pulser uppnår jag en integrerande funktion.
Pulserna kommer in på RB7 och på RB6 har jag indikering av polaritet (laddning/urladdning). Anta att 1A = 278Hz (frekvensen väljs så att förnadlingen till text blir enklast möjligt, med rimlig upplösning), då blir 1Ah ca en miljon pulser. För att kunna räkna +/- 100Ah sådär behöver jag en räknare med 40 bitar:
Kod: Markera allt
; given address of 40 bit little-endian counter in W,
; increment or decrement the counter and return Z set if zero
;Inc32z
;From Dmitry Kiryashov
inc32z:
movwf FSR
clrz
incfsz INDF,F
return
incfsz FSR,F
incfsz INDF,F
return
incfsz FSR,F
incfsz INDF,F
return
incfsz FSR,F
incf INDF,F
return
incfsz FSR,F
incf INDF,F
return
Kod: Markera allt
; isr code can go here or be located as a call subroutine elsewhere
BTFSS INTCON, RABIF ; PortB interrupt?
GOTO other_int ; Other interrupt
MOVF PORTB, W ; Read PortB into flag register
movwf flags
; mismatch condition
BCF INTCON, RABIF ; Clear the RB interrupt flag.
; Do task for INT on RB7
movlw cntr ; Put counter in W
btfsc flags,6 ; Bit 6 of flags indicate up/down
call inc32z ; Increment
call dec32z ; Decrement