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
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.
Aber wie kann ich trotzdem das linksjustierte wieder zusammen fügen? Gruß Steffen
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.