Forum: Mikrocontroller und Digitale Elektronik Zwei 8bit in eine 16bit Variable


von Christian S. (mueke)


Lesenswert?

Hallo Leute,
programmiere jetzt unter C eine Schrittmotorsteuerung über den I2C-Bus.
Jetzt wird über den BUS die anzahl der Schritte übermittelt. Die Anzahl 
werden in zwei Variablen abgespeichert (STEPS_L und STEPS_H). So sind 
also mit einem mal bis zu 2^16 Schritte möglich. Jetzt möchte ich die 
zwei 8bit-Variablen in einer 16bit-Variable (STEPS) zusammenfassen. Wie 
mache ich das?

MfG
Muecke

von ARM-Fan (Gast)


Lesenswert?

1
unsigned short steps = ((unsigned short)STEPS_H << 8) | (unsigned short)STEPS_L;

von Christian S. (mueke)


Lesenswert?

Hallo,
danke für die Hilfe...
Geht es auch, dass man die Bytes einzeln setzt? Und wenn wie? Benutze 
Datentypen uint8_t und uint_16t

Danke schonmal

Chris

von Uhu U. (uhu)


Lesenswert?

union Steps {
   unsigned short steps
   struct _StepsB {
      unsigned char StepsL;
      unsigned char StepsH;
   } StepsB;
};

Steps SchrittVar;

SchrittVar.StepB.StepsL = STEPS_L;
SchrittVar.StepB.StepsH = STEPS_H;

// SchrittVar.steps enthält den 16-Bit-Wert

Für uint_*t kannst Du das selbst anpassen...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es sei darauf hingewiesen, daß es implementierungsabhängig ist, in 
welcher Reihenfolge die beiden Bytes der Union im 16-Bit-Wert landen.
(Stichwort: Endianness)

Es ist also gut möglich, daß die von Uhu vorgeschlagene Union-Variante 
auf einem Prozessor/mit einem Compiler andere Ergebnisse liefert als auf 
einem anderen Prozessor/mit einem anderen Compiler.

Beispielsweise legen Prozessoren der 68xx-Reihe von Motorola/Freescale 
den 16-Bit-Wert 0x1234 als im Speicher aufeinanderfolgende Bytes mit den 
Werten 0x12 0x34 ab, während Prozessoren der 80xx-Reihe von Intel (das 
schließt auch Z80 ein) den Wert als 0x34 0x12 im Speicher ablegen.

So würde ein C-Programm mit Union auf einem HC11 ein anderes Ergebnis 
als auf einem 8080 liefern, während die Shift-Or-Variante sich auf 
beiden Prozessoren
gleich verhält.

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.