Hallo,
ich habe in einem Tutorial zum LED-Blinken folgende Code-Zeile nicht
verstanden:
1
LED_PORT|=(1<<LED_PORTPIN);
Ich habe gleich mehrere Probleme:
- Bedeutet die Schreibweise "|=" nicht letztlich, dass alle Bits der
"rechten" Seite nach einer Links-verschiebung in die Variable LED_PORT
übertragen werden, da "|" kein exklusives oder ist?
- Warum verwendet man überhaupt das bitweise oder und die
Linksverschiebung, anstatt beiden Variablen gleich die Werte zuzuweisen
sodass der Portpin high ist?
Gruß
Karima
LED_PORTPIN steht nur für eine Zahl.
| ist ein logisches ODER, damit kann bestimmte Bits gezielt setzen, ohne die
anderen zu beeinflussen. Es geht theoretisch auch mit den ganzen PORT einen Wert
zuweisen, allerdings muss man dann den vorigen PORT-wert wissen, da man sonst
unabsichtlich Bits ändern tut, die vlt gleich bleiben sollen.
Rechne einfach mal ein paar Beispiele durch auf nem Zettel, dann wird
das einem klar.
Karima L. schrieb:> - Bedeutet die Schreibweise "|=" nicht letztlich, dass alle Bits der> "rechten" Seite nach einer Links-verschiebung in die Variable LED_PORT> übertragen werden, da "|" kein exklusives oder ist?
Da wird 1 um LED_PORTPIN Stellen geschoben. Es gibt nur genau ein Bit,
das 1 ist und nur dieses wird gesetzt. Mal Dir mal eine Wahrheitstabelle
für | und ^ auf, dann siehst Du klarer.
> - Warum verwendet man überhaupt das bitweise oder und die> Linksverschiebung, anstatt beiden Variablen gleich die Werte zuzuweisen> sodass der Portpin high ist?
Weil man die restlichen 7 Bits nicht verändern will, sondern nur das
eine Bit auf 1 setzen will.
@ Joe. B
Logisches Oder würde ich hier lieber nicht schreiben, besser bitweises.
Logisches Oder ist in C nämlich ||.
Servus
Michael
Michael M. schrieb:> @ Joe. B> Logisches Oder würde ich hier lieber nicht schreiben, besser bitweises.> Logisches Oder ist in C nämlich ||.
Hast natürlich Recht!
Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch
nicht klar ist, wozu man das oder braucht. Es überprüft doch, ob an der
betroffenen Stelle von LED_PORT das Bit schon eins ist, und wenn nicht,
setzt der Operator das Bit auf eins. (?)
Warum kann man diesem Bit dann nicht den Wert 1 zuweisen? Oder habe ich
das Ganze doch falsch verstanden?
Gruß
Karima
Karima L. schrieb:> Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch> nicht klar ist, wozu man das oder braucht. Es überprüft doch, ob an der> betroffenen Stelle von LED_PORT das Bit schon eins ist, und wenn nicht,> setzt der Operator das Bit auf eins. (?)
Das ist nicht der Punkt. Wenn man das Bit sowieso auf 1 setzten will,
braucht man nicht überprüfen, was es vorher für einen Wert hat. ;)
Wichtig dabei ist das "oder 0" bei den anderen Stellen. Damit bleiben
die anderen Bits so wie waren: "1 oder 0" bleibt 1, "0 oder 0" bleibt 0.
Karima L. schrieb:> Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch> nicht klar ist, wozu man das oder braucht.
Wie schon gesagt:
Um ein einzlenes Bit zb an einem Port auf 1 zu setzen OHNE die anderen
Bits zu beeinflussen oder auch nur wissen zu müssen, wie die gerade
stehen.
> Es überprüft doch,
da wird überhaupt nichts überprüft.
> Warum kann man diesem Bit dann nicht den Wert 1 zuweisen?
Das ist dann das Gegenteil: Das bit auf 0 setzen.
Und das geht mit einer & OPeration
PORT &= ~( 1 << Bit );
Hallo!
Karl Heinz Buchegger schrieb:> PORT &= ~( 1 << Bit );
Und was bedeutet eigentlich das "~" vor der Bit verschiebung? Invertiert
es das ganze Konstrukt der Bitverschiebung? Und wenn ich mehrere Bits
löschen will, wie sieht das dann aus?
PORT &= ~(1<<Bit1) | (1<<Bit2)
PORT &= ~(1<<Bit1) | ~(1<<Bit2)
PORT &= ~(1<<Bit1) & (1<<Bit2)
PORT &= ~(1<<Bit1) & ~(1<<Bit2)
Ich denke, die erste Variante, bin mir aber nicht sicher.
MfG Dennis
Dennis H. schrieb:> Und was bedeutet eigentlich das "~" vor der Bit verschiebung? Invertiert> es das ganze Konstrukt der Bitverschiebung?
Ja.
Dennis H. schrieb:> PORT &= ~(1<<Bit1) & ~(1<<Bit2)
Damit geht es. Oder auch mit:
PORT &= ~((1<<Bit1) | (1<<Bit2))
Rechne es am besten auf dem Papier mal nach.
>Ich denke, die erste Variante, bin mir aber nicht sicher.
Sicherheit bekommst Du wenn Du solche Aufgaben einmal selbst löst.
Das ist wirklich recht einfach.
Mach Dir eine Wahrheitstabelle (natürlich nur für die möglichen resp.
relevanten Kombinationen und nicht für alle 8 Bits).
Falls das nicht klappt, helfen wir Dir weiter. Aber zeige uns hier was
Du gemacht hast.
Hmm schrieb:> Mach Dir eine Wahrheitstabelle
Das wäre kein Problem, nur wusste ich einfach nicht, inwieweit sich
dieses "~" auf alles, was danach steht, auswirkt. Ich verstehe durchaus,
was ich damit mache, ich habe auch eine Weile in Assembler programmiert,
ich verstehe also, was ich machen will, nur die Umsetzung in C war mir
nicht zu 100% klar.
xfr schrieb:> Dennis H. schrieb:>> PORT &= ~(1<<Bit1) & ~(1<<Bit2)>> Damit geht es. Oder auch mit:> PORT &= ~((1<<Bit1) | (1<<Bit2))
Jetzt habe ich direkt mal eine kleine Weile gebraucht, um die zweiten
Klammern um das zweite Beispiel zu sehen. Okay, damit wäre also auch das
klar, danke euch für eure Antworten
MfG Dennis