[asm] vraag over instructie

Ik ben een beginner met de pic.
Nu heb ik een stukje gemaakt waarmee ik met 2 knoppen
op of af kan tellen. De waarde komt op een 7segment display. 0 tot F. Het werk eindelijk goed.

code:

		include "P16F84a.inc"


cntr1		Equ	21
cntr2		Equ     22
value		Equ	23
	

	
		org	00h
		bsf 	STATUS,	RP0	       ;select bank 1
   		movlw 	b'11111'	       ;set PortA 5 inputs
   		movwf 	TRISA
		movlw	b'00000000'
		movwf	TRISB
		bcf	STATUS,	RP0	       ;select bank 0
		

		call	resetvalue

; main loop
main	        btfss	PORTA,0		; Check SW1
		goto	add	
		btfss	PORTA,1		;Check SW2
		goto	sub
		goto	main

segment	addwf 	PCL,f		; add offset to pcl to generate a computed goto
		retlw	b'00000011'	; Number 0 
		retlw	b'10011111'	; Number 1
		retlw	b'00100101'	; Number 2
		retlw	b'00001101'	; Number 3
		retlw	b'10011001'	; Number 4
		retlw	b'01001001'	; Number 5
		retlw	b'01000001'	; Number 6
		retlw	b'00011111'	; Number 7
		retlw	b'00000001'	; Number 8
		retlw	b'00001001'	; Number 9
		retlw	b'00010001'	; Character A
		retlw	b'11000001'	; Character B
		retlw	b'01100011'	; Character C
		retlw	b'10000101'	; Character D
		retlw	b'01100001'	; Character E
		retlw	b'01110001'	; Character F

; add 

add		incf	value, f	; Add 1 to PORTB.	
		call	outputvalue	;naar outp.
add2	        call	delay		; 10 millieseconden wachten
		btfss	PORTA,0		;SW1 checken,laag->main
		goto	add2
		goto	main		

; sub

sub		decf	value, f
		call	outputvalue
sub2	        call	delay
		btfss	PORTA,1
		goto	sub2
		goto 	main


resetvalue
		clrf	value

outputvalue
		movf	value, w	; put value into w
		andlw	0x0F		; limit the value to max 15.
		call	segment		; haal waarde uit segment
		movwf	PORTB		; verplaats naar PORTB
		return

; Delay routine

delay	        movlw	0x0D
		movwf	cntr2
delay1	        movlw	0xff
		movwf	cntr1
delay2	        decfsz	cntr1, f 
		goto	delay2
		decfsz	cntr2, f
                goto	delay1
		return

                END

Nu de vraag.

In het stukje Outputvalue wordt het W-regiter beperkt tot 15, maar als ik het verander tot 9 slaat de pic nummers over.
Hoe moet ik dit dan beperken?

De andlw 0x0F is eigenlijk een truukje. Met 16 mogelijke waardes (0 t/m 15) heb je toevallig 4 bits. Als je de andere bits weggooit, beperk je dus de waarde tussen 0 en 15. Dat is wat andlw 0x0F doet.

Als je met de waarde 9 werkt heb je niet een precies aantal bits, dus moet je wat anders doen.

Je zou het kunnen veranderen in dit:

code:


outputvalue
	movf	value, w	; put value into w
	sublw	0x09		; compare to the max value
	btfsc   STATUS,C        ; value is > max?
        clrw                    ; then W=0
        call	segment		; haal waarde uit segment
	movwf	PORTB		; verplaats naar PORTB
	return

Maar het is al laat, kan zijn dat het BTFSS moet zijn. Even proberen.

[Bericht gewijzigd door Fuzzbass op zaterdag 4 maart 2006 00:45:20

Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com

Bedankt voor de uitleg.
Ik heb het nog iets veranderd, nu telt het van 0 tot 9 en derna weer naar 0.

code:

outputvalue
		movf	value, w	; put value into w
		sublw	0x09		; compare to the max value
		btfss   STATUS,C        ; value is > max?
                goto	main            ; then W=0
	        call	segment		; haal waarde uit segment
		movwf	PORTB		; verplaats naar PORTB
		return

Als ik de regel "clrw" gebruik stopt ie wel bij 9 en 0 maar als ik bijvoorbeeld nog 6x op de plusknop druk moet ik ook weer 6x op min knop drukken voordat het weer gaat aftellen. Nu heb ik hier "goto main" neergezet.
Is hier nog een handigheidje voor?

Dit lijkt wel van mijn site te komen? PIC tutorial oefening 9
http://home.versatel.nl/edithenwilliam/william/pictut.htm#_Toc11027345…

Probeer dit eens:

code:


outputvalue
		movf	value, w	; put value into w
		sublw	0x09		; compare to the max value
		btfss   STATUS,C        ; value is > max?
		clrf	value           ; then W=0
		movf	value, w	
	        call	segment		; haal waarde uit segment
		movwf	PORTB		; verplaats naar PORTB
		return

Teller loopt tot 9 en begint weer bij 0.

Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm