www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik word -> 2 bytes


Autor: Daniel Seven (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Daniel Seven (Gast)
Datum:

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

Autor: T.Stütz (Gast)
Datum:

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

Autor: T.Stütz (Gast)
Datum:

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

Gruss

Autor: Daniel Seven (Gast)
Datum:

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

Autor: Daniel Seven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned int sind doch auch 16 bit.
(zumindes bei 16 bit systemen)

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in einem union sind alle elemente im gleichen speicherbereich
unterbracht, überschneiden sich also

Autor: Daniel Seven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
heisst das, dass wenn ich

      unsigned char ucLow;
      unsigned char ucHigh;

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, dann wäre low und highbyte vertauscht

Autor: T.Stütz (Gast)
Datum:

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

Autor: Daniel Seven (Gast)
Datum:

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

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht natürlich auch.
Gruss

Autor: Daniel Seven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, vielen dank nochmals !!!
Gruß

Autor: Daniel Seven (Gast)
Datum:

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

Autor: T.Stütz (Gast)
Datum:

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

Autor: Daniel Seven (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schäm
@ Rufus T. Firefly
Du hast natürlich Recht !

Autor: Thomas (Gast)
Datum:

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

Autor: Daniel Seven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, hab ich auch gestern bemerkt.
Danke nochmal!

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.