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;
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. ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.