Programació en pic-as del PIC 16F690

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

Exemple CP - Comptador amb polsador

En aquest exemple volem implementar un comptador (que serà la variable Visualit) que incrementarem amb el polsador que porta la placa (entrada RA3). Els quatre bits inferiors del valor del comptador els mostrarem als LED; per tant els LED mostraran un nombre binari que s'anirà incrementant quan es premi el polsador.

Com farem un bucle que vagi mirant el polsador, no n'hi ha prou en mirar si el polsador està activat per incrementar el valor ja que el bucle és tan ràpid que el polsador podria estar premut en unes quantes iteracions seguides i el valor canviaria a salts. Per això en el programa següent esperem que es deixi anar el polsador per continuar.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Visualit EQU 0x20  ; Variable per al comptador que canvia els LED
PSECT code, class=CODE, delta=2, abs  ; A l'inici de la memòria
main:
  bsf RP0	; Tria el banc 1
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf TRISA  ; Posa tots els bits del port A com a entrada
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  bcf RP0
  clrf Visualit  ; Posa la variable a valor zero
  movf Visualit,w  ; Copia el comptador a l'acumulador
  movwf PORTC  ; I ho posa als LED
Bucle:
  btfsc PORTA,3  ; Mira si està desactivada l'entrada A3
                 ; Si està desactivada, no fa la instrucció següent
                 ; Fa la instrucció si l'entrada està activada
  goto Bucle  ; Si no està premut, ja estem
  incf Visualit,f  ; Si ho està, incrementa el valor del comptador 
  movf Visualit,w  ; Copia el comptador a l'acumulador
  movwf PORTC  ; I ho posa als LED
  btfss PORTA,3  ; Mira si està activada l'entrada A3
  goto $-1  ; repetim la línia fins que es deixi el polsador
  goto Bucle  ; Repetim-ho...
END main

Si heu provat aquest programa, pot ser que en algun moment us hagi fallat i hagi saltat dos o tres valors de cop. Els polsadors i els interruptors tenen el problema que quan canvien d'estat els contactes reboten i, per això, sovint el microcontrolador no veu només una activació entrada sinó unes quantes. En el nostre cas, el polsador de la placa és força bo i rebota molt poc.

El que cal fer és assegurar-nos que l'estat és estable. El programa que hi ha més avall incorpora un filtre per no veure els rebots del polsador.

Si el polsador no funciona, assegureu-vos que heu marcat 3-State on 'Release from Reset' a la finestra de propietats del PICkit 2:

PICkit 2

Quan activem aquesta casella li estem dient al programador que es desconnecti del microcontrolador quan acabi de programar. Aquesta desconnexió, però, no és instantània i això pot produir funcionaments inesperats en aquells programes que comprovin l'estat del polsador poc després de que s'iniciï el programa. Per evitar aquests problemes podem posar un retard (per exemple, un segon) entre les inicialitzacions i el tros del programa on es mira el polsador.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Polsador EQU 0x20  ; Una variable amb l'estat del polsador (1 = premut)
Previ EQU 0x21  ; I una amb l'estat previ del polsador
Visualit EQU 0x22  ; Una variable on guardem el que mostraran els LED
Compta EQU 0x23  ; Una variable per comptar iteracions
Retard1 EQU 0x24  ; Variable per al bucle de retard
PSECT code, class=CODE, delta=2, abs  ; A l'inici de la memòria
main:
  bsf RP0  ; Tria el banc 1
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf TRISA  ; Posa tots els bits del port A com a entrada
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  bcf RP0
  clrf Compta  ; Posa el comptador d'iteracions a valor zero
  clrf Visualit  ; Posa el comptador dels LED a valor zero
  clrf Previ  ; L'estat previ del polsador és no premut
  clrf PORTC  ; Comencem amb els LED apagats
Bucle:
  movlw 00000001B
  movwf Polsador  ; Activem polsador abans de comprovar
  btfsc PORTA,3  ; Mira si està desactivada l'entrada A3
					; Si desactivat (premut), no fa la instrucció següent
  clrf Polsador  ; Si no està premut, desactiva polsador
  movf Previ,w  ; Copia Previ a l'acumulador
  xorwf Polsador,w  ; Compara Previ amb Polsador, si són iguals s'activa Z
  btfsc ZERO  ; Si són iguals va a Final
  goto Esborra
  incf Compta,f  ; Si són iguals, incrementa el valor de Compta
  movf Compta,w  ; Copia Compta a l'acumulador
  xorlw 4  ; Comprova si val 4, si ho val s'activa Z
  btfss ZERO  ; Si val 4 no fa la instrucció següent
  goto Final  ; Si no era 4 va a Final
  movf Polsador,w  ; Copia Polsador a W, si val 0 s'activa Z
  btfsc ZERO  ; Si Polsador valia 1 (Z=0) no fa la instrucció següent
  goto Invert  ; Si no està premut, ja estem
  incf Visualit,f  ; Si ho està, incrementa el valor de Visualit
  movf Visualit,w  ; Copia Visualit a l'acumulador
  movwf PORTC  ; I ho posa als LED
Invert:
  movf Previ,w  ; Copia Previ a l'acumulador
  xorlw 00000001B  ; Inverteix el valor
  movwf Previ  ; I ho guarda a Previ
Esborra:
  clrf Compta  ; Posa el comptador d'iteracions a valor zero
Final:  ; Funció de retard 1 ms
  nop
  decfsz Retard1,f	
  goto Final
  goto Bucle  ; Repetim-ho...
END main

 

 

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