Programació en mpasm 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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock	0x20
Visualit		; Una variable per al comptador que canvia els LED
	endc
	org 0
Inici
	bsf		STATUS,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		STATUS,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

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 es proposa 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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock	0x20
Polsador		; Una variable amb l'estat del polsador (1 = premut)
Previ			; I una amb l'estat previ del polsador
Visualit		; Una variable on guardem el que mostraran els LED
Compta			; Una variable per comptar iteracions
Retard1			; Variable per al bucle de retard
	endc
	org 0
Inici
	bsf		STATUS,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		STATUS,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		b'00000001'
	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		STATUS,Z	; 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		STATUS,Z	; 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		STATUS,Z	; 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		b'00000001'	; 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

 

 

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