Programació en mpasm del PIC 16F690

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

Diversos polsadors connectats a una sola entrada

En alguns casos ens cal fer servir uns quants polsadors (o interruptors) però ens preocupa ocupar moltes entrades amb ells. Una solució al problema és llegir tots els polsadors des d'una entrada analògica. Hi ha diverses formes per a fer-ho però la que presentem aquí ens permet connectar fins a cinc polsadors i de forma que podem detectar si es premen dos o més polsadors al mateix temps. El circuit que farem servir es el de la figura següent:

Esquema de connexió

Mentre no hi ha cap polsador premut, atès que no pot circular corrent, l'entrada RA2 està connectada a 0 V a través de la resistència d'1 kΩ; per tant, llegirem aproximadament un valor zero.

Si premem el polsador P1 tindrem dues resistències en sèrie i, per tant, el corrent que circularà tindrà aproximadament el següent valor:

Equació

A l'entrada analògica hi haurà una tensió que correspon al producte de la resistència comuna pel corrent que hi passa:

Equació

Fent la conversió, podem saber el valor aproximat que veurem a la sortida del conversor analògic-digital:

Equació

La següent taula ens indica els valors corresponents als cinc polsadors. Atès que és més fàcil comparar amb només vuit bits, la darrera columna ens mostra els valors que obtindríem a ADRESH si configurem el conversor amb el resultat justificat per l'esquerra.

Polsador Resistència Tensió Lectura ADRESH
P1 220 Ω 4,1 V 839 210
P2 390 Ω 3,6 V 737 184
P3 680 Ω 3,0 V 610 153
P4 2200 Ω 1,6 V 320 80
P5 4700 Ω 0,9 V 180 45

Les lectures no seran exactament aquests valors ja que depenen de la tensió d'alimentació i de la precisió de les resistències que fem servir. Per això és recomanable fer correspondre un rang de valors a cada polsador.

Si premem dos polsadors a la vegada, per exemple P1 i P3, tindrem les dues resistències en paral·lel:

Equació

que dona una tensió de 4,3 V i una lectura de 878.

Si volem detectar la pulsació de més d'un polsador, haurem de fer servir marges de comparació força estrets. En aquest cas és recomanable veure quines són les lectures reals a l'hora de definir els marges.

La següent funció llegeix els polsadors i retorna en una variable el bit que correspon al polsador actiu. No s'ha contemplat que es puguin prémer dos polsadors al mateix temps.

El programa de l'exemple PA permet provar-ho.

	cblock 0x20
Polsador		; Variable que conté un bit per a cada polsador per saber si està premut	
...
	endc
					;
					; Funció per llegir els polsadors
					;
Llegir
	clrf	Polsador	; Si aquest valor no es canvia és que no hi ha cap polsador premut
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon
	nop			; espera un microsegon, en total 5
	bsf	ADCON0,GO	; Inicia la conversió
	btfsc	ADCON0,GO	; Quan el bit sigui 0 la conversió haurà acabat
	goto	$-1		; repetim la línia fins que deixi de ser 0
				; Comparació P1
	movlw	.220		; Límit superior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP1		; ADRESH >= W
	movlw	.200		; Límit inferior de P1
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP1		; ADRESH < W
	movlw	b'00000001'	; Polsador P1
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP1				; Comparació P2
	movlw	.194		; Límit superior de P2
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP2		; ADRESH >= W
	movlw	.174		; Límit inferior de P2
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP2		; ADRESH < W
	movlw	b'00000010'	; Polsador P2
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP2				; Comparació P3
	movlw	.163		; Límit superior de P3
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP3		; ADRESH >= W
	movlw	.143		; Límit inferior de P3
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP3		; ADRESH < W
	movlw	b'00000100'	; Polsador P3
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP3				; Comparació P4
	movlw	.90		; Límit superior de P4
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP4		; ADRESH >= W
	movlw	.70		; Límit inferior de P4
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP4		; ADRESH < W
	movlw	b'00001000'	; Polsador P4
	movwf	Polsador	; Ho copia a Polsador
	goto	NoP5
NoP4				; Comparació P5
	movlw	.55		; Límit superior de P5
	subwf	ADRESH,w	; W = ADRESH - W
	btfsc	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH >= W
	movlw	.35		; Límit inferior de P5
	subwf	ADRESH,w	; W = ADRESH - W
	btfss	STATUS,C	; C = 1 si ADRESH >= W
	goto	NoP5		; ADRESH < W
	movlw	b'00010000'	; Polsador P5
	movwf	Polsador	; Ho copia a Polsador
NoP5
	return

 

 

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