Programació en mpasm del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Comparacions, màxims i mínims

Valor nul

Comprovar si un valor és zero o no és molt senzill ja que el bit d'estat Z ens diu si en resultat d'una operació és zero. En cas que no necessitem fer cap operació, podem copiar la variable sobre ella mateixa.

	movf		variable,f
	btfsc		STATUS,Z
	goto		Zero
NoZero
...
Zero

En cas de ser un valor de 16 bits, cal fer-ho dos cops ja que els dos bytes han de ser zero.

	movf		variable,f	; Mirem un dels dos bytes
	btfss		STATUS,Z
	goto		NoZero		; Si aquest no és zero ja estem
	movf		variable+1,f	; Si un és zero, mirem l'altre
	btfss		STATUS,Z
	goto		NoZero		; Si aquest no és zero
Zero					; Si tots dos són zero
...
NoZero

Igualtat / desigualtat

Una manera senzilla de comparar l'acumulador amb una variable o un valor és fer servir la funció xor (o exclusiva). Aquesta funció donarà 0 en les parelles de bits que coincideixin i 1 en les que no coincideixin. Per tant si tots els bits són iguals el resultat serà 0 i s'activarà el bit Z. El següent diagrama ho mostra.

Compara igualtat
	xorwf		variable,w
	btfsc		STATUS,Z
	goto		Iguals
Diferents
...
Iguals

	xorwf		variable,w
	btfss		STATUS,Z
	goto		Diferents
Iguals
...
Diferents

A l'Exemple CP podeu veure una possible implementació.

Més petit que / més gran o igual que

Per comparar si un número és més petit que un altre podem fer servir la funció resta (deixant el resultat a l'acumulador) ja que sabem que s'activa C si el resultat és positiu.

	subwf		variable,w	; W = variable - W
	btfss		STATUS,C	; C = 1 si variable >= W
	goto		MesPetit	; variable < W
MesGranIgual				; variable >= W
...
MesPetit				; variable < W

Màxim i mínim d'un valor de 8 bits

Anem llegint o calculant un valor i volem trobar el seus màxim i mínim.

A continuació hi ha un tros de programa. A la primera part inicialitzem max i min, respectivament, a 0 i a FFh i a la segona anem comparant Lectura per trobar-ne el màxim i el mínim.

...
					; Inicialització de les variables
	clrf		max		; Posa el valor màxim a zero
	movlw		0xFF		; Posa el mínim al més alt possible
	movwf		min		; o sigui, FFh
...
					; Recollim el màxim
	movf		max,w		; W té el màxim
	subwf		Lectura,w	; W = Lectura - W = Lectura - max
	btfss		STATUS,C	; C = 1 si Lectura >= max
	goto		MenorMax	; Si és més petit, no cal fer res
	movf		Lectura,w
	movwf		max
MenorMax
					; Recollim el mínim
	movf		min,w		; W té el mínim
	subwf		Lectura,w	; W = Lectura - W = Lectura - min
	btfsc		STATUS,0	; C = 0 si Lectura < min
	goto		MajorMin	; Si és més gran, no cal fer res
	movf		Lectura,w
	movwf		min
MajorMin
...

Màxim i mínim d'un valor de 16 bits

Anem llegint o calculant un valor i volem trobar el seus màxim i mínim.

Hi ha dues possibilitats de que Lectura > max:

		Cas 1:	Lectura+1 = max+1	i	Lectura > max
		Cas 2:	Lectura+1 > max+1

i dues possibilitats de que Lectura < min:

		Cas 1:	Lectura+1 = min+1	i	Lectura < min
		Cas 2:	Lectura+1 < min+1

A continuació hi ha un tros de programa. A la primera part inicialitzem max i min, respectivament, a 0 i a FFFFh i a la segona anem comparant Lectura per trobar-ne el màxim i el mínim.

...
					; Inicialització de les variables
	clrf		max		; Posa el valor màxim a zero
	clrf		max+1
	movlw		0xFF		; Posa el mínim al més alt possible
	movwf		min		; o sigui, FFFFh
	movwf		min+1
...
					; Recollim el màxim
	movf		max+1,w		; W té el màxim
	xorwf		Lectura+1,w	; Comparem amb Lectura+1
	btfss		STATUS,Z	; Si Z = 1 eren iguals
	goto		DifMax		; Si són diferents, provem el cas 2
	movf		max,w		; W té el màxim
	subwf		Lectura,w	; W = Lectura - W = Lectura - max
	btfss		STATUS,C	; C = 1 si Lectura >= max
	goto		MenorMax	; Si és més petit, no cal fer res
	goto		NouMax		; Si és més gran, cal guardar-lo
DifMax
	movf		max+1,w		; W té el màxim
	subwf		Lectura+1,w	; W = Lectura+1 - W = Lectura+1 - max+1
	btfss		STATUS,C	; C = 1 si Lectura+1 >= max+1
	goto		MenorMax	; Si és més petit, no cal fer res
NouMax
	movf		Lectura+1,w	; Copiem Lectura a max
	movwf		max+1
	movf		Lectura,w
	movwf		max
MenorMax
					; Recollim el mínim
	movf		min+1,w		; W té el mínim
	xorwf		Lectura+1,w	; Comparem amb Lectura+1
	btfss		STATUS,Z	; Si Z = 1 eren iguals
	goto		DifMin		; Si són diferents, provem el cas 2
	movf		min,w		; W té el mínim
	subwf		Lectura,w	; W = Lectura - W = Lectura - min
	btfsc		STATUS,0	; C = 0 si Lectura < min
	goto		MajorMin	; Si és més gran, no cal fer res
	goto		NouMin		; Si és més petit, cal guardar-lo
DifMin
	movf		min+1,w		; W té el mínim
	subwf		Lectura+1,w	; W = Lectura+1 - W = Lectura+1 - min+1
	btfsc		STATUS,C	; C = 0 si Lectura+1 < min+1
	goto		MajorMin	; Si és més petit, no cal fer res
NouMin
	movf		Lectura+1,w	; Copiem Lectura a min
	movwf		min+1
	movf		Lectura,w
	movwf		min
MajorMin
...

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.