PIX16x pulsräknare upp/ned

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

PIX16x pulsräknare upp/ned

Inlägg av AndersG »

Postar detta som en separat tråd, även om det är relaterat till min fråga om interrupt on change..

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
Då har jag i min ISR:

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
Låter detta vettigt?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kod: Markera allt

                btfsc	flags,6			; Bit 6 of flags indicate up/down
		call	inc32z			; Increment
		call	dec32z			; Decrement
bör vara

Kod: Markera allt

                btfsc	flags,6			; Bit 6 of flags indicate up/down
		goto	cnt_up
		call	dec32z			; Increment
		goto	cnt_end
cnt_up
		call	inc32z			; Decrement
cnt_end
eller:

Kod: Markera allt

                btfsc	flags,6			; Bit 6 of flags indicate up/down
		goto	inc32z			; Increment
		goto	dec32z			; Decrement
cnt_end
och så avslutar du både inc32z och dec32z med "goto cnt_end".

I ditt fall kommer du att köra antingen bara dec32z eller *båda två* !

PS: Dmitry är en av de "vassaste" PIC programmerarna men just denna
kod var ju faktiskt ganska läsbar. Det brukar vara ett litet helsike att
förstå vad han gör... :-)
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

I ditt fall kommer du att köra antingen bara dec32z eller *båda två* !
Naturligtvis. Vad dum jag är ;)
PS: Dmitry är en av de "vassaste" PIC programmerarna men just denna
kod var ju faktiskt ganska läsbar. Det brukar vara ett litet helsike att
Jo, den var rätt elegant och lätt att utöka för godtyckligt antal bytes. I detta fall tänkte jag använda 40 bitar och sedan helt sonika betrakta de MSB 32 som ett 32-bitars heltal för presentation.
Skriv svar