Noch Problem mit XMEGA ADC

Gast #3812734
Lesenswert?

Hallo Leute,

Ich möchte alle 8 Pins (singleended) von Port A digitalisieren. Für die 
Umsetzung möchte ich keinen Freerun-Modus verwenden sondern die 
Digitalisierung selber triggern.

Momentan benutze ich eine 4 Channel-Pipeline. Jeder Channel ist einem 
anderen Pin zugewiesen (CH0 = PORTA.0, CH1 = PORTA.1 usw.). Wenn ich die 
Digitalisierung der 4 Channel starte und solange warte bis die 
Interruptflags aller 4 Channel den Zustand 1 besitzen dann lese ich die 
Werte aus dem Ergebnisregister aus. Dies funktioniert auch bereits schon 
gut.

Jedoch wenn ich die 4 Channels nach dem Auslesen der Ergebisse umstelle 
um dann die anderen 4 Pins (PORTA.4 bis PORTA.7) zu digitalisieren, dann 
erhalte ich fehlerhafte Werte. Dies ist leider reproduzierbar. Muss ich 
eine Wartezeit einhalten wenn ich die MUX umstelle? Ich habe leider 
keine Informationen dazu im Datenblatt gefunden.

Den Quellcode habe ich beigefügt.
Angehängte Dateien:
#3812754
Lesenswert?

Der ADC geht durch eine Pipeline, wenn du den Channel auf einen anderen 
Pin legst, sind in der Pipeline evtl. noch die letzten Werte des 
Channels von dem vorherigen Pin.

Diese sollte im Datasheet beschrieben sein. Es gibt auch eine 
application note "using the xmega ADC" (AVR1300). Da steht sicher auch 
was zu möglichen Wartezeiten, wenn ein Channel auf einen anderen Pin 
gelegt wird.
Gast #3812758
Lesenswert?

Thomas F. schrieb:
> Der ADC geht durch eine Pipeline, wenn du den Channel auf einen anderen
> Pin legst, sind in der Pipeline evtl. noch die letzten Werte des
> Channels von dem vorherigen Pin.

Was meinst Du denn genau damit? Muss ich die Pipeline mit FLUSH löschen 
bevor ich die Pin änder?
Gast #3813067
Lesenswert?

Ob man es kann steht leider nicht im Datenblatt.

Wenn ich nur einen Kanal aktiviere kann ich dann einfach so zwischen den 
Pins umschalten ohne ein die Pipeline zu leeren?

Ich werde das mit der Pipeline leeren mal ausbrobieren.
Gast #3813096
Lesenswert?

So ich habe nun ein Spülung des ADCs vorgenommen und dann erst die 
Digitalisierung gestartet. Momentan sieht es so aus als wenn es 
funktioniert
1
// Flush ADC Pipeline
2
ADCA.CTRLA |= 0x02;
3

4
// Start the AD conversion on channel 0, 1 ,2 ,3
5
ADC->CTRLA |= 0x3C;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren