Forum: Mikrocontroller und Digitale Elektronik Word in zwei bits verteilen


von steve (Gast)


Lesenswert?

Hallo Leute,

ich habe ein Word(16Bit) und möchte diese Daten in zwei Bytes verteilen, 
mit Hilfe von C.

Kennt jemand solche Befehle?

Gruß Steve

von Matthias L. (matze88)


Lesenswert?

Oh ja, das ist garnicht einmal so schwer.

Es gibt in C sogenannte "Shift Operatoren", außerdem auch noch logische 
Operationen wie z.B. die "Und Verknüpfung".
1
uint16_t mein_word;
2
uint8_t mein_high_byte, mein_low_byte;
3
mein_high_byte = mein_word >> 8;
4
mein_low_byte = mein_word & 0x00FF;

Matthias

von Rasfunk (Gast)


Lesenswert?

Ungetested, gibt mehrere Varianten.
1
// input word
2
unsigned short input = 0xABCD;
3
unsigned char *byte;
4
5
byte = (unsigned char *)&input;
6
7
// byte[0] jetzt gleich "CD"
8
// byte[1] jetzt gleich "AB"

von Z8 (Gast)


Lesenswert?

> Word in zwei bits verteilen

ich glaube das geht!

http://de.wikipedia.org/wiki/Microsoft_Word

,vielmehr isses nicht. :)

von Severino R. (severino)


Lesenswert?

union wäre auch ein Weg, ganz ohne Operationen.

von Sumynona (Gast)


Lesenswert?

jep. Die Sache mit der Verpointerung und die union sind gute Ideen :-)

von steve (Gast)


Lesenswert?

upps soory habe bytes gemeint.

Und wie mache ich aus zwei Bytes eine Word?

von Sumynona (Gast)


Lesenswert?

Das kommt wiederum wie die Bytes im Speicher verteilt sind. Wenn sie 
auseinander stehen, musst du kopieren, wenn sie zusammen und in der 
richtigen Reihenfolge sind, siehe "union"

von steve (Gast)


Lesenswert?

irgend wie blicke ich das mit union nicht. Habt Ihr ein Beispiel

von Jean P. (fubu1000)


Lesenswert?

Hi,
1
tydef union
2
{
3
  unsigned char b[2];
4
  unsigned int w;
5
}
6
converter;

word zu bytes:
1
unsigned int word = 0xFABA;
2
converter conv;
3
conv.w = word;
4
//nun steht in "w" dein word, lesen tust du es mittels b[];
5
also:
6
unsigned char byte1 = conv.b[0];
7
unsigned char byte2 = conv.b[1];

bytes zu word:
1
converter conv;
2
conv.b[0] = byte1;
3
conv.b[1] = byte2;
4
//nun steht in "b's" dein word, lesen tust du es mittels "w"; 
5
unsigned int word = conv.w;

Viel Spaß damit.

von heinz (Gast)


Lesenswert?

Hi,
ich hänge mich hier einfach mal ran. Habe folgendes "Problem":
ein Wert vom Typ uint32_t, der aber nur Werte zw. 0 und 100000 annehmen 
kann (3 byte genügen), möchte ich zusammen mit einem uint8_t Wert in 
einem uint32_t speichern. Wie mach ich das am elegantesten?

Danke und Gruss

von Michael H. (mah)


Lesenswert?

Sumynona wrote:
> jep. Die Sache mit der Verpointerung und die union sind gute Ideen :-)

Ich denke nicht. Die "Verpointerung" ist ein schlimmes Beispiel 
nicht-portabler Programmierung - man tritt sich für nichts eine schöne 
Abhängigkeit vom Bytesex der CPU ein (little- oder big-endian). Toll.

Wenn Du sicher sein willst, wo im Ergebnis das low- und wo das highbyte 
steht unabhängig von der CPU, dann verwende die shift-Variante.

-Michael

von Marcin (Gast)


Lesenswert?

> ich hänge mich hier einfach mal ran. Habe folgendes "Problem":
> ein Wert vom Typ uint32_t, der aber nur Werte zw. 0 und 100000 annehmen
> kann (3 byte genügen), möchte ich zusammen mit einem uint8_t Wert in
> einem uint32_t speichern. Wie mach ich das am elegantesten?

Hi heinz,

für Deinen ersten Wert (100000) brauchst Du 17 Bits.
Du hast dann noch 7 Bits zur freien Verfügung...

das kannst Du mit einer Struktur erledigen:

1
struct data{
2
  uint8_t            byteWert;
3
  uint32_t           intWert      :17;
4
  uint8_t            freieBits    :7
5
};


Gruß

Martin

von heinz (Gast)


Lesenswert?

Hallo Marcin,
diese Syntax mit dem : kannte ich noch gar nicht. Geht das echt?

Gruß heinz

von Marcin (Gast)


Lesenswert?

Hallo Heinz,

http://en.wikipedia.org/wiki/C_syntax#Bit_fields

hier kannst Du die kleine 'Lücke' in der Syntax wieder schliessen ...

Martin

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.