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!
Gast
#357519
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
Gast
#357520
@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?
Gast
#357521
char byte1,byte2,byte3 byte3=(byte1&0x0f)<<4 | (byte2&0x0f); die low-nibbles von beiden bytes werden damit low bzw high-nibble von byte3
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.
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?
Gast
#357524
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;
2 Messungen mit je 8 Bit....
Dann müsste johnnys Lösung funktionieren. Beachte aber, dass du bei dieser Variante nur noch 4-Bit Auflösung hast (Sprich: 16 "Spannungsstufen")
Gast
#357527
> dass du bei dieser Variante nur noch 4-Bit Auflösung hast
Naja, er sagt doch, das reicht ihm, gell?
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
Gast
#357529
Danke inoffz..., man hätte das binäre, das ja stimmt auch mal gegenrechnen können. Marcus
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.