Controllare ADC pic 12f675
Ciao a tutti, ho cercato di capire come funziona l'adc di questo pic, credo di aver capito, ma non mi funziona; faccio un piccolo riassunto:
- Il pic ha 8 pin
Vdd -|^^U^^|- Vss GP5 -| |- GP0 * * GP4 -| |- GP1 * GP3 -|_____|- GP2 *
Ogni pin ha varie funzioni, ad esempio GP4 e GP5 possono essere usati per mettere il quarzo, ma questo pic ha un oscillatore interno ( io setto su icprog IntOSC GP4 ).
- Ha 4 canali impostabili come ingressi analogici per l'ADC che sono: GP0, GP1, GP2, GP4. Il riferimento in tensione viene misurato tra Vss e un valore massimo di riferimento ( come in ogni ADC ), per quetso valore si pu=F2 otilizzare Vdd o un'altro riferimento da dare eventulamente su GP4.
- Il dato digitale in uscita =E8 a 10 bit divisi in due registri.
- I registri di configurazione sono 2: ADCON0 e ANSEL il primo serve ad attivare la lettura, il secondo ad impostare l'ADC. Il mio primo porblema =E8 il seguente: ANSEL lo modifico dal banco dei registri 1 ( STATUR,RP0 =3D SET ) perch=E8 in alcuni esempi in cui si vuole disabilitare l'ADC vedo che viene modificatod a li ma l'altro? in teoria dovendo essere utilizzato per "accendere" la lettura dovrebbe essere utilizzato dal banco dei regitri 0 ( STATUS,RP0 =3D CLEAR)....
Vediamo i bit dei registri:
ANSEL 7 - niente 6,5,4 - codice a tre bit per definire la frequenza di conversione 3,2,1,0 - non ho capito .. dice: "analog select bits: 1 =3D analog input; pin is assigned as analog input; 0 =3D Digital I/O; assigned to port or special function. Io credo che voglia sapere quali dei quattro pin utilizzo per la lettura...
ADCON0
7 - formattazione dato a 10 bit nei due registri ADRSH e ADRSL 6 - 1-> riferimento a Vref pin, 0-> riferiemnto a Vdd 5,4 - niente 3,2 - canale da digitalizzare 00, 01, 10, 11 1 - 1-> avvio avquisizione, 0-> acquisizione finita 0 - 1-> adc operativo, 0-> adc spento ... non ho capito questo cosa fa...ok... ho fatto un programmino semplice semplice... ho implementato un loop in cui acquisisce la tensione, controlla un bit di uno dei regitri dove stanno i 10 bit e a seconda che sia set o clear accendo o spengo un led. In questo modo varuando la tensione in ingresso dovrei vedere accendere e spegnere il led, ma non funziona.
/////////////////////////////////////
INCLUDE
org 0
bsf STATUS,RP0 ; Select Bank 1
movlw b'00111011' ; Set GP as output movwf TRISIO movwf WPU ; Select Weak Pull-up Enabled ; INTCON OK bcf OPTION_REG,7 ; Enable all Weak Pull-up
movlw b'00001001' movwf ANSEL ; settaggio adc
bcf STATUS,RP0 ; Select Bank 0 clrf GPIO ; Init GPIO movlw 07h movwf CMCON ; Comparator OFF
leggi movlw b'10000011' movwf ADCON0 ; attivo adc
attendi
btfsc ADCON0,1 ; controllo conversione quando pronto salta goto attendi
btfsc ADRESL,7 goto ledon goto ledoff
ledon bsf GPIO,2 goto leggi
ledoff bcf GPIO,2 goto leggi
end
///////////////////////////////
Luca