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


von The E. (the_engineer)


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

von Reiner (Gast)


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

von Michael W. (mictronics) Benutzerseite


Lesenswert?

c = a;
c <<= 8;
c |= b; oder c += b;

/Michael

von The E. (the_engineer)


Lesenswert?

jo danke ! Klappt ! Also wenn ich an so was schon verzweifel*g

Gruß
Thorsten

von Vorn N. (eprofi)


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)??

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.