www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Word in zwei bits verteilen


Autor: steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Larisch (matze88)
Datum:

Bewertung
0 lesenswert
nicht 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".
uint16_t mein_word;
uint8_t mein_high_byte, mein_low_byte;
mein_high_byte = mein_word >> 8;
mein_low_byte = mein_word & 0x00FF;

Matthias

Autor: Rasfunk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ungetested, gibt mehrere Varianten.
// input word
unsigned short input = 0xABCD;
unsigned char *byte;

byte = (unsigned char *)&input;

// byte[0] jetzt gleich "CD"
// byte[1] jetzt gleich "AB"

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Word in zwei bits verteilen

ich glaube das geht!

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

,vielmehr isses nicht. :)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
union wäre auch ein Weg, ganz ohne Operationen.

Autor: Sumynona (Gast)
Datum:

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

Autor: steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
upps soory habe bytes gemeint.

Und wie mache ich aus zwei Bytes eine Word?

Autor: Sumynona (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: steve (Gast)
Datum:

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

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
tydef union
{
  unsigned char b[2];
  unsigned int w;
}
converter;

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

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

Viel Spaß damit.

Autor: heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

struct data{
  uint8_t            byteWert;
  uint32_t           intWert      :17;
  uint8_t            freieBits    :7
};


Gruß

Martin

Autor: heinz (Gast)
Datum:

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

Gruß heinz

Autor: Marcin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.