ADC pic 12f675

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

Reply to
Luca
Loading thread data ...

Per trovare il registro giusto che contiene ADCON0 e ANSEL perché non provi a dare la direttiva banksel? L'ho vista usare in qualche esempio.

BANKSEL ADCON0 MOVLW VALORE_DA_CARICARE MOVWF ADCON0

Reply to
andreafrigo

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.