www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik In uint16_t HB und LB schreiben !? In C


Autor: The Engineer (the_engineer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgendes Problem:

Habe 2 uint8_t Variablen a,b und eine uint16_t Variable c

möchte gerne das HB Variable a ist un das LB Variable b

Ansatz :

c = a; // a ins LB von c schreiben
c << 8; // Inhalt von c 8 Bits nach links schieben in HB von c
c = b; // b ins LB von c schreiben

c sollte jetzt HB a und LB b haben.

Aber genau das passiert nicht ! Hab im HB immer 0 stehen. Habe schon
anderes geschoben mit und ohne Zuweisung, aber ich verzweifel gerade an
so einer Kleinigkeit *nerv.

Andres herum aus einem uint16_t HB und LB auslesen, hab ich schon
hinbekommen, aber das andere *verzweifel.

Danke im vorraus
Gruß
Thorsten

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c = a; // a ins LB von c schreiben
c << 8; // Inhalt von c 8 Bits nach links schieben in HB von c
c |= b; // b ins LB von c schreiben

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c = a;
c <<= 8;
c |= b; oder c += b;

/Michael

Autor: The Engineer (the_engineer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo danke ! Klappt ! Also wenn ich an so was schon verzweifel*g

Gruß
Thorsten

Autor: Vorn Nachn (eprofi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Schieberei um 8 kannst Du Dir sparen.
#define lo 0   //low oder high hängt von little oder big-Endian ab
#define hi 1
union x{
  unsigned char b[2];
  unsigned int  w;}

Zugriff auf bytes:
x.b[lo]
x.b[hi]
Zugriff auf word:
x.w

Denkanstöße, Anregungen:

Habe es bisher noch nicht geschafft, sowas wie x.bl und x.bh (ohne
Arrayzugriff) zu formulieren. Evtl. geht das mit einem zusätzlichen
struct oder mit der Bitzuordnung :8??

union x{
  unsigned char a,b:8;  //geht nicht, a und b haben die selbe Adr.
  unsigned int  w;}

mit Pointern könnte es auch gehen:
unsigned int *x;
Zugriff auf Bytes:
*(x)  und *(x+1)   aber *(x+1) greift aber auf das nächste Word zu,
da der Compiler automatisch mit 2 skaliert

Also doch mit der Union und *(x.a) und *(x.a+1)??

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.