Nabend, ich habe nochmal eine frage zu C und µC. Wie kann ich den Inhalt einer uint16_t Variable auf 2 Port ausgeben. Hintergrund ist, wenn ich zB 16 LED ansteuern möchte, die ich auf 2 Port ausgebe und ich die LED mit verschiedenen Lichtspielen ansteuern möchte, dann fehlt mir gerade die möglichkeit die Daten aus der 16bit breiten Variable auf 2 Port zu trennen. Für allfällige Tips bin ich immer offen :) Grüße Stephan
Gast
#2979965
Ganz einfach so: PORTA = (uint8_t)ui16Var; PORTB = (uint8_t)((ui16Var >> 8)); VG Thomas
Thomas danke, jetzt wo ich das lese sieht das auf einmal sogar logisch aus. Einfach um 8 stellen nach rechts geschoben und schon hat man die hinteren Bit im griff. Warum bin ich da nicht drauf gekommen. Wahrscheinlich weil ich nebenher noch C lerne und mich langsam einarbeiten muss :)
Gast
#2980728
Auf 8 bit Mikrocontrollern mache ich das immer mit einer UNION:
union {
uint8_t 8b[2];
uint16_t 16b;
} var;
var.16b = 0x1234;
PORTA = var.8b[0];
PORTB = var.8b[1];
Beim Programmieren muss etwas mehr getippt werden, dafür werden
die Schiebe-Befehle gespart.
Gruß, B.
Bernd schrieb: > Beim Programmieren muss etwas mehr getippt werden, dafür werden > die Schiebe-Befehle gespart. Du hältst wohl auch die Compilerbauer für Volltrottel?
Gast
#2980734
Bernd schrieb: > Beim Programmieren muss etwas mehr getippt werden, dafür werden > die Schiebe-Befehle gespart. und das ganze ist dann abhängig von alligment und dann auch nicht mal C konform - union ist dafür nicht gemacht. Diese diskusion war erst letzte woche hier.
Peter II schrieb: > Diese diskusion war erst letzte woche hier. Ach, nicht nur letzte Woche ;-)
Gast
#2981099
Die Antworten sind ja wirklich hilfreich. Kurzzusammenfassung: UNION zum type-casting zu benutzen gehört in die Abteilung "schmutzige Tricks" und hat Risiken und Nebenwirkungen. Und hier steht die ausführliche Diskussion: Beitrag "Kann man denn jetz das hi- und low-byte eines uint16_t effizient lesen in c?" Mit vielen Anregungen, wie es gemacht werden kann.
ein Gast schrieb: > Die Antworten sind ja wirklich hilfreich. Die erste Antwort ist hervorragend. Der Rest bezieht sich auf die unsinnige zweite Antwort. ein Gast schrieb: > Mit vielen Anregungen, wie es gemacht werden kann. Dafür braucht es nicht viele Anregungen denn es gibt nur eine Lösung: Thomas schrieb: > PORTA = (uint8_t)ui16Var; > PORTB = (uint8_t)((ui16Var >> 8)); mfg.
Den Cast kann man sich sparen, der passiert automatisch.
1 | |
2 | |
Gast
#2981800
Karl Heinz Buchegger schrieb: > Du hältst wohl auch die Compilerbauer für Volltrottel? Nein. Aber ich benutze den 8051-Compiler von Wickenhäuser und der optimiert da leider nicht in der gewünschten Weise. Ich habe einen Auszug aus dem erzeugten Assemblercode angehängt. Gruß, B.