Newsgroup: it.hobby.elettronica.digitale
Titolo: XMEGA A, problema con ADC

Ciao a tutti, mi sto avvicinando al processore in oggetto; nello specifico, 
sto scrivendo le librerie/routine per gestire le varie periferiche ed ho 
incontrato problemi con l'ADC, che ha moltissime configurazioni possibili.
 
Il datasheet 
http://www.atmel.com/images/atmel-8331-8-and-16-bit-avr-microcontroller-xmega-au_manual.pdf
 
 
A pag 339 la sezione ADC
 
 
Inizializzazione ADC A (ce ne sono due) :
 
adca_init(void){
//*********************
//* INIZIALIZZO ADC A *
//*********************
 
ADCA_CTRLA=1; //Enable ADCA
ADCA_CTRLB=16; //signed mode (11 bit), no freerun, 12 bit res right adj
ADCA_REFCTRL=16; // Vreference= VCC/1.6, quindi 2.06V
ADCA_PRESCALER=3; //Prescaler a 32, quindi 32 MHz/32 = clock ADC @ 1 MHz
 
ADCA_CH0_CTRL=1; //single ended
 
}
 
 
ROUTINE PER LEGGERE UN INPUT
 
 
unsigned int read_channel(unsigned char analog_channel){
 
 
 ADCA_CH0_MUXCTRL=analog_channel<<3; //shifto nella corretta posizione e 
seleziono l'ingresso MUX desiderato
      DelayUs(1); //tempo acquisizione
 
 ADCA_CTRLA |= 4; //start conversion
 
       while(!ADCA_CH0_INTFLAGS); //attendo fine conversione...
 
      DelayUs(10);
 
 return(ADCA_CH0_RES);   //ritorno il risultato della conversione
 
}
 
 
Il problema � che, se non inserisco il DelayUs(10) tra il loop che controlla 
in polling il bit di fine conversione e quando leggo il risultato della 
stessa conversione, questo contiene o il valore della conversione 
precedente, se lanciata subito prima, o dei valori "casuali".
 
A pag. 346 c'e' un paragrafo "propagation delay", con una formula per 
calcolarlo in base alla frequenza ed al clock. A me risulta 7 uS, pero' 
quando viene alzato il flag di fine conversione il dato dovrebbe essere 
pronto per essere letto, oppure ho frainteso e devo attendere 7 uS DOPO la 
chiamata dell'interrupt di fine conversione prima di poter leggere il 
risultato ?
 
 
Grazie.
Pier.
 
www.piergm.com
 
 
 

Ciao Pier,
 
hai ancora problemi con l'Xmega o hai poi risolto?
In passato ho fatto una serie di test e verifiche su questo processore e non ho incontrato il tuo problema.
Ho notato però che hai un approccio al convertitore AD inusuale...
Perchè imposti la porta di lettura analogica poco prima della lettura e non una volta sola in fase di setup del processore?
Di solito quando si scrive del firmware si dovrebbe prima definire la configurazione hardware (che sino a prova contraria non cambia...) e quindi si scrivono le funzioni per accedervi senza mai dover rivedere la configurazione.
In questo modo i tempi necessari ad ogni impostazione della porta vengono eliminati e si ottiene la massima risposta possibile dal sistema.
 
P.S se ti può servire ti giro qualche riga di codice perfettamente funzionante al massimo della risoluzione possibile (se non ricordo male 2msps sample)
 
Saluti 
Kokiua

 In questo modo i tempi necessari ad ogni impostazione della porta vengono eliminati e si ottiene la massima risposta possibile dal sistema.
 
Spesso si tratta di pochissimi cicli macchina, un paio perlopiù.
Danno più fastidio le capacità parassite sui pin di I/O: se cambi da OUT ad IN e le capacità non si scaricano alla svelta rischi di rileggere l'ultimo stato dell'out.
 
Piccio.

Kokiua
 
Ciao,
Pier.
 
www.piergm.com