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
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
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?
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
Kann ich den Thread eigentlich irgendwie als erledigt markieren?
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)
|
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.