Programació en mpasm del PIC 16F690

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

Filtrar els rebots d'un polsador

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. Quan només volem saber l'estat del polsador o interruptor això no sol ser important però sí quan volem comptar les activacions o fer que cada activació canviï l'estat del sistema.

El que cal fer és assegurar-nos que l'estat de l'entrada és estable. El programa que es proposa mira el polsador (o interruptor), aproximadament, cada mil·lisegon. Si N vegades seguides el troba igual ho considera estable. El diagrama de flux del programa seria el següent, on en verd hi tenim el nom de les etiquetes de cada part del programa.

Filtrat dels rebots

El programa mira el polsador de la placa (connectat a RA3). Recordem que l'entrada RA3 està habitualment activada i es desactiva quan es prem el polsador. En el programa hem considerat que N és 4 i fem servir la funció xor tant per comparar dos valors com per invertir un bit.

	cblock	0x20
Polsador		; Una variable amb l'estat del polsador (1 = premut)
Previ			; I una amb l'estat previ del polsador
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
	bcf		STATUS,RP0
	clrf		Compta		; Posa el comptador d'iteracions a valor zero
	clrf		Previ		; L'estat previ del polsador és no premut
BucleR
	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
Accions					; Aquí anirien les accions que cal fer cada cop
					; que es prem el polsador
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		BucleR		; 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.