Forum: Mikrocontroller und Digitale Elektronik ATXMEGA ADC Problem beim starten von 2 Kanälen


von Rob88 (Gast)


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

von Ingo L. (Gast)


Lesenswert?

Meinst du erstnhaft jemand dröselt deine Hex-Schreibweise auf?
Wofür gibt es denn diese tollen #Defines ?


Ingo

von Gerhard G. (g_g)


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.

von Rob88 (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.