ATXMEGA ADC Problem beim starten von 2 Kanälen

Gast #2753583
Lesenswert?

Hallo,

Ich habe gestern ein sehr komsiches Verhatlen von meinem Atxmega128a1 
entdeckt.

Der ADC ist Single Ended konfiguriert und ich habe Input-Voltage/1.6 als 
Referenzspannung genommen.

Wenn ich jetzt in 2 Kanälen eine Conversion starte, sind die Werte 
plötzlich viel zu klein. Obwohl die Werte passeen, wenn ich ein Kanal 
nach dem anderen starte und das Ergebnisregister auslese.

Zum starten von 2 Kanälen benutze ich:
   uint8_t chan = 0b11;
   ADCA_CTRLA |= (0xF & chan)<<2;

und zum auslesen vom nullten Kanal das etwas eigene Konstrukt:
   uint8_t chan = 0;
   return (*(volatile uint16_t *)(0x0224+0x8*chan));

Kann sich jemand von Euch dieses Verhalten erklären ?

Vielen Dank !

Besten Gruß,
Robert
#2753707
Lesenswert?

Hallo,

Rob88 schrieb:
> Kann sich jemand von Euch dieses Verhalten erklären ?

 // wait for result

while(!ADCA.CH0.INTFLAGS);    // wait for conversion complete flag


vermutlich wurde die zeitliche Abfolge nicht eingehalten.

Ich würde dir auch raten deinen Code ein bisschen leserlich zu 
schreiben.

z.B.

ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc;     // PORTA:0 positiv -> GND


Gruß G.G.
Gast #2753869
Lesenswert?

Hallo,

Das while(Intflag) habe ich mit eingebaut (sorry dass ich das nicht 
gepostet habe), daran kann es leider nicht liegen.

Ok zugegeben, dass sieht ein bisschen gruselig aus was ich da 
hingeschriben habe, aber ich habe versucht die Adressen für die 
einzelnen Ergebnisregister in eine schöne Form zu bringen mit den 
defines von Atmel wäre das dann:

return (*(volatile uint16_t *)(ADCA_CH0_RES+0x8*chan));

Jetzt kann ich eben der Variable chan = 0-N geben und komme so an die 
einzelnen Channel Ergebnisse. Ich fand das irgendwie elegant :) Außerdem 
kann ich so mit wenig Code schnell drauf zugreifen oder ginge es anders 
noch schöner ?

Dieses 0x8 sind die Abastände zwischen den Registern...

Danke für die gegebenen und kommenden Antworten,

Robert

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