Forum: Mikrocontroller und Digitale Elektronik 2x8Bit -> 2x4Bit ->1x8Bit


von Sascha D. (plutoonline)


Lesenswert?

Hallo,
ich möchte zwei Bytes in zwei 4Bitwerte umwandeln und dann in einem
Byte speichern. Hat jemand einen Vorschlag wie ich das am einfachsten
in C bewerkstelligen kann.

Um die 8Bit in 4Bit zu verwandeln kann ich sie ja einfach durch 2
teilen. Nur wie bekomme ich die beiden dann wieder zusammen in ein
Byte?

Jetzt schonmal Danke für eure Hilfe!

von Marcus (Gast)


Lesenswert?

Hallo,

wenn du 255 (0b1111 1111) durch 2 teilst (div) erhälst du doch 128
(0b0111 1111), was mehr als 4bit Daten enthält. Das Zusammenfügen geht
mit & und | mit entsprechenden Shifts (>> und <<).

Marcus

von inoffizieller WM-Rahul (Gast)


Lesenswert?

@Marcus:
Ein Teilen von 255 durch 2 ist das Gleiche wie ein einzelnes
Rechtsshift. Dabei kommt 127 heraus...

@Sascha:
Wie sollen die Zahlen denn aussehen?
Um das obere Nibble (höherwertige 4 Bits) zu erhalten, shiftet man
viermal nach rechts (x>>4). Fertig.
Um das untere Nibble zu erhalten verundet man mit 0x0F. (x & 0x0F)
Fertig.

Was möchstest du denn genau machen?

von Hans (Gast)


Lesenswert?

char byte1,byte2,byte3
byte3=(byte1&0x0f)<<4 | (byte2&0x0f);
die low-nibbles von beiden bytes werden damit low bzw high-nibble von
byte3

von Sascha D. (plutoonline)


Lesenswert?

Also nochmal etwas genauer,
ich möchte 2 8Bit Werte aus dem ADC lesen und diese dann per Infrarot
übertragen, ich brauche aber keine 8Bit Auflösung bei den Werten.
Um die Packete für die IR-Übertragung möglichst klein zu halten möchte
ich deshalb die 2 Werte beim senden in einen zusammenfassen und beim
Empfänger die Werte wieder auseinanderdröseln.

von Simon K. (simon) Benutzerseite


Lesenswert?

Was für 2x 8 Bit Werte vom ADC? Zwei unterschiedliche, von zwei
verschiedenen Messungen, oder ein High und ein Low Byte von einer
Messung?

von johnny.m (Gast)


Lesenswert?

Ich verstehe das jetzt mal so, dass Du von zwei Messungen je einen
ADC-Wert in 8 Bit hast, wobei Dir 4 Bit Auflösung für die Übertragung
genügen. D.h. Du willst die High-Nibbles der zwei Bytes in einem
einzigen Byte speichern und verschicken, um sie am anderen Ende wieder
in zwei einzelne Bytes zu zerlegen.

Also auf Senderseite z.B.:

unsigned char ADWert1, ADWert2, SendeByte;
//...irgendwas...
SendeByte = (ADWert1 & 0xF0) | (ADWert2 >> 4);

Auf Empfängerseite:

unsigned char ADWert1, ADWert2, EmpfangByte;
//...irgendwas...
ADWert1 = EmpfangByte & 0xF0;
ADWert2 = EmpfangByte << 4;

von Sascha D. (plutoonline)


Lesenswert?

2 Messungen mit je 8 Bit....

von Simon K. (simon) Benutzerseite


Lesenswert?

Dann müsste johnnys Lösung funktionieren. Beachte aber, dass du bei
dieser Variante nur noch 4-Bit Auflösung hast (Sprich: 16
"Spannungsstufen")

von johnny.m (Gast)


Lesenswert?

> dass du bei dieser Variante nur noch 4-Bit Auflösung hast
Naja, er sagt doch, das reicht ihm, gell?

von Sascha D. (plutoonline)


Lesenswert?

Vielen Dank vorerst mal an alle, ich glaube ich teste das mal mit dem
ansatz von johnny.m.
Ich muß eh erstmal testen ob die 4Bit Auflösung wirklich ausreichend
sind oder ob ich mich da verkalkuliert hab.

THX Sascha

von Marcus (Gast)


Lesenswert?

Danke inoffz...,

man hätte das binäre, das ja stimmt auch mal gegenrechnen können.

Marcus

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.