Forum: Mikrocontroller und Digitale Elektronik Zusammenführen von zwei werten in eine Variable (Arduino, HYT221)


von Frank (Gast)


Lesenswert?

Hallo,
Ich möchte für ein Projekt mit einem Arduino einen HYT221 
Temperatur/Luftfeuchte Sensor auslesen.

Als ich nach passendem Code gesucht habe bin ich hierrauf gestoßen:
http://www.mikrocontroller.net/attachment/110234/HYT-xxx.pdf

soweit auch sehr verständlich....aber eine Passage versteh ich nicht.

es sollen zwei Bitwerte zu eine Variablen kombiniert werden.

Gegeben ist diese Code Passage:

raw_T16 = Buffer[2] * 256 + Buffer[3]; oder
raw_T16 = Buffer[2] < 8 | Buffer[3];

Beide Zeilen sollen das selbe tun.

Die untere Kombiniert mit Hilfe eine "Bitwise or" das versteh ich. Aber 
ich verstehe den nutzen von "< 8" nicht.

Die obere Zeile versteh ich Garnicht. soll das eine Multiplikation oder 
ein dereference Pointer sein? Und warum 256?

Währe nett wenn ihr meinem Verständnis auf die Sprünge helfen könntet :)

von Benedikt S. (benedikt_s)


Lesenswert?

raw_T16 = Buffer[2] * 256 + Buffer[3];
Beispiel im dezimal System:
du hast zwei zaheln A=1 und B=2 jetzt möchtest du eine gemeinsame 
variable AB haben dies geht durch:
AB=10*A+B nichts andres mach das *256 es scheibt um log2(256)=8 Stellen 
nach links.


raw_T16 = Buffer[2] in der Variablen steht jetzt 00000000AAAAAAAA

 < 8 |in der Variablen steht jetzt  AAAAAAAA00000000 da die werte um 8 
bit nach links geschoben werden

 Buffer[3]; ist jetzt das Ergebniss der Addition AAAAAAAAAABBBBBBBBBB

von Udo S. (urschmitt)


Lesenswert?

Nochmal zur Multiplikation versus schieben.
Du bist beim Computer im Binärsystem. Mal 2 ist also nichts anderes als 
alle Ziffern eins nach links zu schieben, so wie beim Dezimalsystem mal 
10 auch alle Ziffern eins nach links schiebt.
Beispiel Dezimal:
156 * 10 = 1560
Binär:
1011 * 2 = 10110

von Frank (Gast)


Lesenswert?

Danke für diese schnelle und präzise Antwort =)
Das war genau was ich wissen wollte :)

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Frank schrieb:
> raw_T16 = Buffer[2] < 8 | Buffer[3];

Da ist ein Tippfehler drinnen, es muss heissen:
1
raw_T16 = Buffer[2] << 8 | Buffer[3];
und ich klammere Shift-Operationen grundsätzlich, also
1
raw_T16 = (Buffer[2] << 8) | Buffer[3];

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.