Forum: Mikrocontroller und Digitale Elektronik Atmega ADC linksjustiert auslesen


von Steffen H. (stef_fen)


Lesenswert?

Hallo Zusammen,

ich möchte gerne mit einem Atmega das ADC Ergebnis linksjustiert 
auslesen. Aber wie kann ich die Datenregister ADCL und ADCH dann wieder 
richtig zusammen fügen.

Beim rechtsjustierten würde ich es so machen:

uint16_t spannung = ADCL + (ADCH<<8) oder das Makro ADCW benutzen.


Beim linksjustierten so:

Das ADLAR bit in ADMUX habe ich dafür natürlich gesetzt.

uint16_t spannung = (ADCL>>6) + (ADCH>>6)

Aber da kommt nichts gescheites bei rum. Wie mache ich das richtig?

Vielen Dank.
Gruß Steffen

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Steffen Ha schrieb:
> Hallo Zusammen,
>
> ich möchte gerne mit einem Atmega das ADC Ergebnis linksjustiert
> auslesen.

Kein Problem. Wie das geht hast du bestimmt schon dem Datenblatt 
entnommen.

> Aber wie kann ich die Datenregister ADCL und ADCH dann wieder
> richtig zusammen fügen.

Wozu wieder zusammenfügen? Linksjustiert betreibt man den ADC eigentlich 
nur dann wenn man nur 8 Bit Auflösung benötigt.

> Beim rechtsjustierten würde ich es so machen:
>
> uint16_t spannung = ADCL + (ADCH<<8)

Zu umständlich.

> oder das Makro ADCW benutzen.

Richtig.

von Steffen H. (stef_fen)


Lesenswert?

Aber wie kann ich trotzdem das linksjustierte wieder zusammen fügen?

Gruß Steffen

von Martin H. (disjunction)


Lesenswert?

Steffen Ha schrieb:

> Beim linksjustierten so:
>
> Das ADLAR bit in ADMUX habe ich dafür natürlich gesetzt.
>
> uint16_t spannung = (ADCL>>6) + (ADCH>>6)
>

wenn dan sowas wie
  uint16_t spannung = (ADCH<<10) + (ADCL << 2);
oder                  (ADCL + (ADCH<<8)) << 2);


oder solche Späßchen wie

(unsigned char *) &spannung = ADCH;
                   spannung = (spannung & $FF00) + ADCL;
                   spannung = spannung  << 2;

: Bearbeitet durch User
von Detlef K. (adenin)


Lesenswert?

Wo ist das Problem?
Der Wert wird genauso ausgelesen, wie der rechtsjustierte.
Aber warum verschiebst Du den Mist dann wieder um 6 Stellen nach rechts?

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Steffen Ha schrieb:

> ich möchte gerne mit einem Atmega das ADC Ergebnis linksjustiert
> auslesen. Aber wie kann ich die Datenregister ADCL und ADCH dann wieder
> richtig zusammen fügen.

Häh?

> Beim rechtsjustierten würde ich es so machen:
> uint16_t spannung = ADCL + (ADCH<<8) oder das Makro ADCW benutzen.

> Beim linksjustierten so:
> uint16_t spannung = (ADCL>>6) + (ADCH>>6)

Was spricht gegen ein schlichtes

1
uint16_t spannung = ADC;

?

Ob der Wert dann links- oder rechtsbündig ist, entscheidet das Bit ADLAR 
im ADMUX Register. Der Witz an ADLAR ist ja gerade, dir das Shiften (mit 
dem << oder >> Operator) zu ersparen.


XL

(Edit) Nachtrag:

Und wenn du darauf bestehst, das 16-bittige ADC Register händisch 
einzeln nach L- und H-Teil auszulesen, dann ist das wieder unabhängig 
vom ADLAR Bit immer der gleiche Code:

1
uint16_t spannung = ADCL + ADCH<<8;

: Bearbeitet durch User
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.