Programació en pic-as 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à:

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
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
  movlw 00010000B  ; Posa el conversor a 1/8 de la freqüència
  movwf ADCON1  ; Copia W a la configuració del conversor A/D
  bcf RP0
  bsf RP1  ; Tria el banc 2
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf ANSEL  ; Configura AN0-AN7 com entrades analògiques
  bcf RP0
  bcf RP1  ; Tria el banc 0
  movlw 00000001B  ; 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
  bsf GO_DONE  ; Inicia la conversió
  btfsc GO_DONE  ; 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 main

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_DONE 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'anterior de l'actual) 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.

SI alimentem la placa amb el programador és probable que no arribem a encendre tots els LED perquè la tensió d'alimentació és una mica inferior a 5 V i, per tant, l'entrada analògica llegeix una tensió inferior a la màxima.

 

 

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