Forum: Mikrocontroller und Digitale Elektronik AVR: 10 bit ADC-Wert in eine 16 bit variable lesen


von ik (Gast)


Lesenswert?

Hallo,

kann man in c den 10 bit ADC-Wert in eine 16 bit variable lesen ohne hin 
und her zu verschieben?

ich realisiere das lesen von 10 Bits auf dieser Art:
(ADLAR=0)
UInt16 x = ADCL;
UInt16 y = ADCH << 8;
UInt16 ADC = x|y;
von Hannes L. (hannes)


Lesenswert?

ik schrieb:
> kann man in c den 10 bit ADC-Wert in eine 16 bit variable lesen ohne hin
> und her zu verschieben?

C kennt keine 10-Bit Variablen. Das ADC-Ergebnis liegt in 2 Registern, 
also in zwei Bytes, bildet also einen 16-Bit Wert (bei dem Werte über 
1023 nicht vorkommen). Du musst also nur die beiden Bytes zu einem Int 
zusammensetzen. Da wird nix verschoben, jedenfalls nicht bitweise über 
die CPU.

Aber frag' doch mal die Doku zu AVRGCC, ich halte es für sehr 
wahrscheinlich, dass der Compiler das selbst macht, wenn Du einen (in C 
vereinbarten) Namen für den ADC (als Alias-16-Bit-Register) angibst. 
Beim Timer1 ist das statt TCNT1H und TCNT1L TCNT1, beim ADC geht das 
glaube nicht so einfach, da ADC ein Schlüsselword in ASM ist.

...
von Krapao (Gast)


Lesenswert?

uint16_t foo = ADCW;

> UInt16

uint16_t bevorzuge ich, da es ein Standard Integer Typ der avr-libc ist
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html

> ADC

Solche Variablennamen vermeide ich um den Quelltext besser lesbar zu 
machen. Alles groß sind bei mir Makronamen z.B. auch Makronamen für SFRs 
bei AVRs.

> ADCL, ADCH

Bei manchen AVR sind die aufeinanderfolgend und als 16-Bit-Wert ADCW 
zugänglich. Der Compiler kümmert sich dann um die richtige 
Zugriffsreihenfolge, die man beim Einzelzugriff selbst richtig machen 
muss.
von ik (Gast)


Lesenswert?

Krapao schrieb:
> uint16_t foo = ADCW;

Danke das hat funktioniert. Es handelte sich hierbei um Atmega16.

Danke auch für alle andere Tipps...
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.