Programació en mpasm del PIC 16F690

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

Exemple EA - Entrada analògica

Anem a provar el funcionament d'una entrada analògica. Agafarem l'entrada analògica on hi ha connectat el potenciòmetre i llegirem el valor de l'entrada.

En el nostre cas tindrem un resultat de 10 bits (valors de 000h a 3FFh; o sigui de 0 a 1023) però només tenim quatre LED. Si agaféssim els quatre bits de més a la dreta ens trobaríem que al llarg de tot el recorregut del potenciòmetre els valors passarien diverses vegades de 0000 a 1111 recorrent tots els valors intermedis. El mateix passaria si agaféssim bits del mig. En canvi, si agafem els bits de valor més alt (els de més a l'esquerra) només passarem un cop per cada combinació de bits en tot el recorregut de la roda del potenciòmetre.

El que farem doncs serà triar l'alineació a l'esquerra (ADFM valdrà 0). Quan acabi la conversió permutarem els nibbles del resultat (instrucció swapf) i copiarem el resultat al port on hi ha els LED. Estarem escribint valors a les altres quatre sortides però com no les farem servir no passa res. Si féssim servir les altres quatre sortides del port C caldria complicar el programa amb un emmascarament de bits.

La figura següent és un esquema del que fem amb els bits del resultat.

Permutació de bits

El programa que emprarem serà:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	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
	movlw	b'00010000'	; Posa el conversor a 1/8 de la freqüència
	movwf	ADCON1		; Copia W a la configuració del conversor A/D
	bcf	STATUS,RP0
	bsf	STATUS,RP1	; Tria el banc 2
	movlw	0xFF		; Posa l'acumulador a FFh (tot uns)
	movwf	ANSEL		; Configura AN0-AN7 com entrades analògiques
	bcf	STATUS,RP0
	bcf	STATUS,RP1	; Tria el banc 0
	movlw	b'00000001'	; activa el conversor A/D connectat a AN0
	movwf	ADCON0		; amb el resultat justificat per l'esquerra
Bucle
	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 1
	swapf	ADRESH,w	; Permuta els nibbles dels bits superiors
	movwf	PORTC		; Copia el resultat sobre els LED
	goto	Bucle
	end

Veiem que al començament hi ha uns quants canvis de banc (bits RP0 i RP1) ja que necessitem registres dels bancs 0, 1 i 2. Tota la part inicial del programa (fins a l'etiqueta Bucle) és on es configura el funcionament. En començar el bucle esperem els 5 μs i activem el bit GO per iniciar la conversió. La instrucció btfss mira l'estat del bit i si encara està activat la instrucció goto torna una línia enrere ($-1 vol dir l'actual menys 1) i ho torna a mirar. Quan el bit es desactiva es salta el goto i es tracta el resultat tal com hem comentat. Un cop fet això, es torna a repetir el cicle.

 

 

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