Forum: Mikrocontroller und Digitale Elektronik Bit in Ausgaberegister als Variable definieren


von Nicola R. (pastulla)


Lesenswert?

Hallo zusammen,

es würde mich freuen, wenn mir jemand bei folgender Sache helfen könnte:

Ich würde gerne die Bits an einem Ausgabeport mit einer Variable 
ansteuern. Was ich damit meine ist Folgendes:
So sieht es ja normalerweise aus, wenn ich einen Pin high setze:
PORTC |=  _BV(PC4);

Nun würde ich gerne das bit durch eine Variable ersetzen:

if (irgendwas) gate =PC4;
if (was anderes) gate =PC5;
PORTC |=  _BV(gate);
...

Wie mache ich das am einfachsten? Mit #define mitten im Code geht es 
nicht, zumindest wüsste ich nicht wie.

Danke im Voraus und einen schönen Tag

Nicola

von Berry (Gast)


Lesenswert?

mhm, das sollte doch funktionieren, der Pre-Compiler ersetzt doch auch 
PC4 durch eine Zahl, glaube vom Typ uint_8, bin mir da aber nicht 
sicher. Also muss deine gate Variable nur auch vom gleichem Typ sein wie 
deine PC4.

Steht hier auch:
https://www.mikrocontroller.net/articles/Kategorie:AVR-GCC-Tutorial#Vordefinierte_Bitnummern_f.C3.BCr_I.2FO-Register

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nicola R. schrieb:
1
 if (irgendwas) gate =PC4;
2
 if (was anderes) gate =PC5;
Und wenn weder "irgendwas" noch "was anderes"?
1
 PORTC |=  _BV(gate);
Ja passt doch, wenn du vorher natürlich erst mal beide möglichen Bits 
PC4 und PC5 zurückgesetzt hast. Woran klemmts?

von Nicola R. (pastulla)


Lesenswert?

Hallo,

ja, das geht tatsächlich mit uint_8.
Ich dachte das geht eh nicht, deshalb habe ich es gar nicht erst 
versucht. Manchmal ist es eben einfach einfach.
Danke!

Lothar M. schrieb:
> Und wenn weder "irgendwas" noch "was anderes"?

if (weder "irgendwas" noch "was anderes") gate =PC6;  :)

Danke nochmal und einen schönen Tag

Nicola

von Nicola R. (pastulla)


Lesenswert?

Kann ich den Thread eigentlich irgendwie als erledigt markieren?

von fop (Gast)


Lesenswert?

Sowas geht, aber nicht besonders portabel. Die Lösung versteckt sich bei 
Structs. Deren Mitglieder können bis auf 1 Bit geschrumpft werden. 
Problem ist, der Compiler läßt sich nicht vorschreiben, in welcher 
Reihenfolge mit wieviel Abstand dazwischen er die Mitglieder eines 
Structs im Speicher aufbewahrt. Bei den PICs (und auch anderen) gab's 
schon solche Structs in den mitgelieferten .h - Dateien. Da hieß dann 
eine solche "Variable" z.B.
1
PORTBbits.PB4
 .
Die kann man dann per Define auf einen möglichst unsinnigen Namen mappen 
:
1
#define irgendwasgate (PINCbits.PINC4)

von Jim M. (turboj)


Lesenswert?

Vorsicht: Bei Port |= Bit_konstante erzeugt der Compiler einen nicht 
unterbrechbaren sbi Befehl;

Bei Port |= Variable erzeugt er einen read-modify-write Zyklus. Wenn da 
Interrupts am selben Port dazwischen funken kann es Probleme geben.

von A. S. (Gast)


Lesenswert?

fop schrieb:
> Problem ist, der Compiler läßt sich nicht vorschreiben, in welcher
> Reihenfolge mit wieviel Abstand dazwischen er die Mitglieder eines
> Structs im Speicher aufbewahrt.

Das ist dann aber ein komischer Compiler. Dürfte im embedded-Bereich 
eher selten sein.

von Nicola (Gast)


Lesenswert?

Danke für die ergänzenden Hinweise, bisher klappt alles wie geplant. Es 
gibt zwar Interrupts, aber nicht an diesem Port.
Grüße und einen schönen Abend
Nicola

von fop (Gast)


Lesenswert?

A. S. schrieb:
> Das ist dann aber ein komischer Compiler. Dürfte im embedded-Bereich
> eher selten sein.

Ich schrieb von portabel. Da ist dann meist mehr als ein Compiler im 
Spiel. Ja, meist läßt sich das Padding einstellen, aber fast immer 
irgendwie anders. Die Reihenfolge der Bits ist dagegen oft nicht 
einstellbar. Man muss also die Reihenfolge im Code anpassen.
Und wenn man es einstellen kann, bindet man anderer Leute Header ein, 
die auch auf ihre Reihenfolge bestehen.

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.