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
1 | unsigned short steps = ((unsigned short)STEPS_H << 8) | (unsigned short)STEPS_L; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.