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
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 :)
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?
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.
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 | PORTA = ui16Var; |
2 | PORTB = ui16Var >> 8; |
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.
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.