Programació en pic-as 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 ZERO
  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 ZERO
  goto NoZero  ; Si aquest no és zero ja estem
  movf variable+1,f  ; Si un és zero, mirem l'altre
  btfss ZERO
  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 ZERO
  goto Iguals
Diferents:
...
Iguals:

  xorwf variable,w
  btfss ZERO
  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 CARRY  ; 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 CARRY  ; 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 CARRY  ; 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 ZERO  ; 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 CARRY  ; 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 CARRY  ; 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 ZERO  ; 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 CARRY  ; 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 CARRY  ; 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.