Forum: Mikrocontroller und Digitale Elektronik word -> 2 bytes


von Daniel Seven (Gast)


Lesenswert?

Hallo.

kann mir jemand sagen, wie ich ein word in 2 bytes aufteile ?
z.B. word: 00001111 11110000

byte1: 00001111
byte2: 11110000

das kan man doch sicher irgendwie in der art machen:
byte1 = word;
byte2 = word<<8;

ich bin relativ neu in sachen C.
und weiss auch nicht wie ich das ohne großen aufwand testen könnte.

MfG Dani

von Tobi (Gast)


Lesenswert?

"und weiss auch nicht wie ich das ohne großen aufwand testen könnte."
mit einem x beliebigen pc c compiler

word w;
byte bl,bh;

bl = w & 0xFF;
bh = w >> 8;

von Daniel Seven (Gast)


Lesenswert?

Danke für deine schnelle antwort.

für was ist bei "bl = w & 0xFF;" die verknüpfung mit 0xFF ?
ist die nicht sinnlos ?

MfG Dani

von T.Stütz (Gast)


Lesenswert?

Noch eine Möglichkeit, die zwar kompliziert aussieht aber
meist kürzer codiert und dadurch schneller ist:

typedef struct  {
  union  {
    struct  {
      unsigned char ucLow;
      unsigned char ucHigh;
    } bytes;
    struct  {
      unsigned int wWort;
    } word;
  } u;
} WTOB;

WTOB sWort;
unsigned char ucByte1,ucByte2;


sWort.u.word.wWort = 0x0FF0; // Beispiel

ucByte1 = sMerkBestCS.u.bytes.ucLow;
ucByte2 = sMerkBestCS.u.bytes.ucHigh;

Es entfällt dabei das ausmaskieren mit FFh und das Schieben
eventuell muss noch dir Reihenfolge ucLow/ucHigh angepaßt werden

Gruss

von T.Stütz (Gast)


Lesenswert?

Sorry: ich gehe davon aus das unsigned int == 16Bit
solltest du eventuell noch in unsigned short umändern.

Gruss

von Daniel Seven (Gast)


Lesenswert?

@T.Stütz: kannst du deine variante mal ein bisschen erklähren ?
was bedeutet das union ?
und wiso ist bytes und word nicht getrennt im speicher ?

hab in meinem C++ buch nix zu union gefunden ;(

MfG Dani

von Daniel Seven (Gast)


Lesenswert?

unsigned int sind doch auch 16 bit.
(zumindes bei 16 bit systemen)

von Tobi (Gast)


Lesenswert?

in einem union sind alle elemente im gleichen speicherbereich
unterbracht, überschneiden sich also

von Daniel Seven (Gast)


Lesenswert?

heisst das, dass wenn ich

      unsigned char ucLow;
      unsigned char ucHigh;

vertauschen würde, würde auch ucLow das andere byte bekommen ?

von Tobi (Gast)


Lesenswert?

ja, dann wäre low und highbyte vertauscht

von T.Stütz (Gast)


Lesenswert?

Also mit "union" werden in meinem Falle 2 Speicherbereiche quasi
übereinandergelegt:
 1xword (16Bit) und
 2xbyte (jeweils 8Bit)

Ich übertrage also ein Wort in ein 16Bit speicher
und kann dann danach BYTEweise zugreifen. Ein guter Compiler mach aus
der C-Source in Assembler ein laden eines 16Bit-Register mit
nachfolgendem Transfer der Byte(Hälften) in den neuen Speichern

Bei C++ wirst du das vermutlich nicht finden,
ist schon bei C möglich (K&R-C)

Hoffe das Hilft , Gruss

von Daniel Seven (Gast)


Lesenswert?

OK, ich glaub ich habs verstanden. Hab doch was über union in meinem
buch gefunden.
Noch eine letzte frage:
würde das auch so gehen:?

  union WTOB
    {
      unsigned short w_word;
      struct
      {
        char byte1;
        char byte2;
      } bytes
    };

char byte_1;
WTOB a;
a.w_word = 0x0FF0;
byte_1 = a.bytes.byte1;


MfG

von T.Stütz (Gast)


Lesenswert?

Geht natürlich auch.
Gruss

von Daniel Seven (Gast)


Lesenswert?

Ok, vielen dank nochmals !!!
Gruß

von Daniel Seven (Gast)


Lesenswert?

Noch mal ein Problem:
hab nun meine structur so definiert:

union WordADR
{
  unsigned short W_Adr;
  struct
  {
  char byte1;
  char byte2;
  } bytes
};

jetzt will ich die structur überladen:

char Read_F(WordADR.W_adr AdressA, uint8_t Select_byte);

so gehts nicht. kann ich das irgendwie anders machen ?
Ich weiss ich kann einfach ein word übergeben und dann dem WordADR
zuweisen aber geht das nicht irgendwie eleganter ?

MfG

von T.Stütz (Gast)


Lesenswert?

WordADR.W_adr ist kein Datentyp sondern eine Variable.
Nimm mal WordADR.

Was soll Read_F machen ?

Eine Funktion überladen heißt ja, das es mehr als eine
GLEICHNAMIGEFunktion gibt mit unterschiedlichen Parametern oder
eine Klasse die von einer anderen Klasse abgeleitet wurde und dort
einer (virtuellen) Funktion ein anderes Verhalten beigebracht wird.

Gruss

von Daniel Seven (Gast)


Lesenswert?

Mit WordADR gehts auch nicht. Ich kann nichtmal in einer funktion ein
solches Object erstellen. Da kommt immer der fehler: WordADR
undeclared, first use in this function.
Dieser fehler tritt auch bei folgendem code auf:

union WordADR
{
  unsigned short W_Adr;
  struct
  {
  char byte1;
  char byte2;
  } bytes
};

void main()
{
WordADR a;
}

(ich benutze den WINAVR)
PS: die funktion liest daten aus dem eeprom und legt die userdaten in
den entsprechenden variablen ab.

MfG

von Rufus T. Firefly (Gast)


Lesenswert?

Probiers mal so:

  typedef union
  {
    unsigned short W_Adr;
    struct
    {
    char byte1;
    char byte2;
    } bytes
  } WordADR;

  void main()
  {
  WordADR a;
  }

oder so:

  union WordADR
  {
    unsigned short W_Adr;
    struct
    {
    char byte1;
    char byte2;
    } bytes
  };

  void main()
  {
  union WordADR a;
  }

Derlei Details sind übrigens im Buch "Programmieren in C*" (Kernighan
& Ritchie, zweite Auflage, Hanser Verlag) gar nicht so schlecht
beschrieben.


*) Ja, Textbaustein. Und Kommission einfordern. Sollte ich jetzt
wirklich mal.

von T.Stütz (Gast)


Lesenswert?

schäm
@ Rufus T. Firefly
Du hast natürlich Recht !

von Thomas (Gast)


Lesenswert?

noch eine kleine bemerkung am rande:

die methode mit schieben und maskieren ist unabhängig von der
endianness der target cpu, die variante mit der union dagegen nicht.

von Daniel Seven (Gast)


Lesenswert?

Ja, hab ich auch gestern bemerkt.
Danke nochmal!

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.