In generale una sequenza di conversione è costituita da una serie di conversioni successive intervallate da un periodo di campionamento. In alcuni casi (in particolare quando i dati acquisiti devono poi essere elaborati e riconvertiti) è importante mantenere un periodo di campionamento costante e rispettoso del teorema del campionamento. Per ottenere questo è possibile inserire dei cicli di ritardo fra una conversione e l'altra pari al periodo di campionamento desiderato o, preferibilmente, si può utilizzare un timer, magari programmato in modo da generare un interrupt ogni volta che si vuole acquisire un nuovo campione.
In altri casi è sufficiente avviare una conversione subito dopo che la precedente è terminata (o meglio, dopo aver atteso il tempo minimo fra due successive conversioni). Questa seconda modalità è meno precisa della precedente, ma permette di sfruttare il convertitore alla massima velocità e nel modo più semplice. Se per esempio il nostro scopo è semplicemente quello di acquisire una serie di valori da visualizzare immediatamente su un display, quest'ultimo è probabilmente il modo migliore di gestire la conversione.
Per maggiori dettagli generali sulle differenze fra le diverse tecniche di gestione di un convertitore AD, rimandiamo il lettore all'apposita lezione. Qui ci dedicheremo a sviluppare un semplice esempio di gestione di una sequenza di conversioni usando la modalità "libera", cioè quella che non utilizza nessuna tecnica per temporizzare il periodo di campionamento.
Un altro problema riguarda l'attesa e la gestione del segnale di fine conversione (End Of Conversion, nel nostro caso GO/DONE=0). Tale segnale può essere gestito in generale in tre modi diversi:
Nel seguito approfondiremo un esempio di gestione della fine conversione con la tecnica a polling (rimandando il lettore alla già citata lezione per approfondimenti sulle altre modalità).
Fatte le precedenti premesse, una sequenza di conversione per un singolo canale è costituita in generale dalle seguenti fasi:
Naturalmente se fosse necessario acquisire da più canali diversi (attraverso il multiplexer), occorrerebbe ripetere i passi precedenti per ogni canale.
Qui di seguito riportiamo un semplice codice in assembly per gestire la conversione di un segnale analogico sul pin RA0:
BANKSEL TRISA
BSF TRISA,0 ;RA0 viene programmato come input
BSF ANSEL,0 ; RA0 viene settato come ingresso analogico
MOVLW B’01100000’ ; fattore di prescaling 1:64
MOVWF ADCON1 ;
BANKSEL ADCON0
MOVLW B’10000001’ ;Right justified, Vdd, canale AN0 e ADON
MOVWF ADCON0 ;
CALL attesa ; subroutine di attesa del tempo
minimo
BSF ADCON0,GO ; Start of conversion
BTFSC ADCON0,GO ; test End of conversion
GOTO $-1 ; se la conversione non è terminata, ripete il test
MOVF ADRESH,W ; legge i due bit più significativi del dato
MOVWF ... ; li sposta da qualche parte
BANKSEL ADRESL
MOVF ADRESL,W ; legge gli 8 bit meno significativi del dato
MOVWF ...; li sposta da qualche parte
BANKSEL ADCON0
GOTO inizio
Si noti che preliminarmente è necessario programmare il pin usato per acquisire la tensione analogica come input (BSF TRISA,0) e come ingresso analogico (BSF ANSEL,0).
Si osservi che l'istruzione che avvia la conversione (BSF ADCON0,GO) è separata dall'altra istruzione che programma il contenuto di ADCON0. In generale il bit GO/DONE non deve essere settato nella medesima istruzione che accende il convertitore AD (settando il bit ADON di ADCON0).
Per quanto riguarda la subroutine "attesa", questa è comunque necessaria all'inizio del ciclo poiché, dopo l'accensione del convertitore e la selezione del canale occorre dare il tempo al condensatore CHOLD di caricarsi.
Sito realizzato in base al
template offerto da
http://www.graphixmania.it