Bit in Ausgaberegister als Variable definieren

OP #6439889
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
Gast #6440391
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)
Gast #6440642
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.
Gast #6442317
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren