Forum: Compiler & IDEs Casten von uint16_t zu uint8_t


von Matthias H. (klaus2000)


Lesenswert?

Moin,

ich möchte aus dem internen ADC vom ATMEGA16 (10 Bit breit),
welchen ich in eine uint16_t gelesen habe,
mit Informationsverlust in ein uint8_t lesen.
1
uint16_t test;
2
uint8_t result;
3
4
uint16_t ReadChannel(uint8_t mux)
5
6
test = ReadChannel(1);
7
8
result = (uint8_t) test >> 2;

Kann dies leider im Augenblick nicht testen?!

Die Unterschiede "zwischen" zwei Werten soll somit bei
4 liegen.


Leider kann ich mich nicht besonders artikulieren,
falls einer nicht genau verstanden hat was ich möchte,
bitte nachfragen

Danke
Matthias

von Uwe .. (uwegw)


Lesenswert?

Man kann den ADC auch so einstellen, dass das Ergebnis linksbündig in 
die ACDH/L-Register geschrieben wird. Dann kann man ADCH auslesen, ADCL 
verwerfen, und erhält sofort den 8bit-Wert.

von Johannes M. (johnny-m)


Lesenswert?

Ja, so wie Du es oben schreibst, müsste es gehen. Aber Du machst es Dir 
unnötig kompliziert, wie Uwe schon sagt. Setz das ADLAR-Bit im 
ADMUX-Register und lies nur das High-Byte aus (direkt in eine 
8-Bit-Variable).

von carlos (Gast)


Lesenswert?

Johannes M. schrieb:
> Ja, so wie Du es oben schreibst, müsste es gehen. Aber Du machst es Dir
> unnötig kompliziert, wie Uwe schon sagt. Setz das ADLAR-Bit im
> ADMUX-Register und lies nur das High-Byte aus (direkt in eine
> 8-Bit-Variable).

Hallo,

ich bin ein absoluter Anfänger und hab ein Frage. Ich hab soweit alles 
versatanden mit "Das Ergebnis linksbündig schreiben und ADCH 
auslesen"... was ich noch nicht verstanden habe ist folgendes: Wenn ich 
den 10 Bit Wert (ADC) auslese kann ich mit folgender Formel:
Vin = ADC * (Vref/1024)
bestimmen ob das Ergebnis richtig ist. Wie ist es nun im Falle wo ich 
nur den High Byte benutze? ändert sich da was in der Formel (Da ich 
quasi mit einer 8Bit Auflösung umsetze)?

Danke
Carlos

von Bernd N (Gast)


Lesenswert?

Was glaubst du wo 1024 her kommt ?

>> 8Bit Auflösung

ist dann ?

von Carlos (Gast)


Lesenswert?

Bernd N schrieb:
> Was glaubst du wo 1024 her kommt ?
>
>>> 8Bit Auflösung
>
> ist dann ?

Danke für die Antwort Bernd N

dann sind es wohl 256 [ Vin = ADC * (Vref/256) ]. jetzt kommt aber meine 
nächste Frage: Wie beeinflusst diese Maßnahme meinen Ergebnis jetzt 
abgesehen vom Quantisierungsfehler? wohlwissend, dass bei meiner Messung 
8Bits ausreichend sind.

Zum Testeb hab ich mir vorgenommen einen Poti am ADC-Eingang 
einzuschalten und dann die Messwerte vergleichen...

Danke
Carlos

von Peter (Gast)


Lesenswert?

Da würde ich noch Klammern setzten:

result = (uint8_t) (test >> 2);

Zuerst rechts schieben und erst dann auf 8 Bit casten.

von Karl H. (kbuchegg)


Lesenswert?

Wenn er nach über 3 Jahren die Klammern noch nicht richtig hat, dann 
wird das wohl nichts mehr.

von Klaus W. (mfgkw)


Lesenswert?

Stell dir vor, der rätselt jetzt schon drei Jahre rum.
Warum soll man ihn  nicht wenigstens jetzt erlösen?

Oder jemand schreibt das ab und wundert sich...

von Peter (Gast)


Lesenswert?

Hehehe Hab völlig übersehen, dass hier wieder mal ein Uralt-Thread 
ausgegraben wurde!

Ich liebe Aerchologie...

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.