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
Gast
#567645
1 | |
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
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...
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.