Forum: Mikrocontroller und Digitale Elektronik [C] uint16_t auf 2 Port ausgeben


von Stephan W. (stipo)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Ganz einfach so:

PORTA = (uint8_t)ui16Var;
PORTB = (uint8_t)((ui16Var >> 8));

VG
Thomas

von Stephan W. (stipo)


Lesenswert?

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 :)

von Bernd (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Ralf G. (ralg)


Lesenswert?

Peter II schrieb:
> Diese diskusion war erst letzte woche hier.

Ach, nicht nur letzte Woche ;-)

von ein Gast (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Fabian O. (xfr)


Lesenswert?

Den Cast kann man sich sparen, der passiert automatisch.
1
PORTA = ui16Var;
2
PORTB = ui16Var >> 8;

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.