NEIN! Damit weist du keine Null zu! Eine sehr beliebte Falle im C: das << heißt nicht, dass das Bit PORTB0 auf eine bestimmten wert gesetzt wird.Zitat von humus
Es ist der Verscheibe- oder Shift-Operator. Er nimmt das Byte, in dem die 1 steht, und verscheibt darin die Bits nach links, und zwar um so viele Stellen, wie es durch den Wert rechts von << bestimmt wird. Und PORTB0 ist als 0 definiert. Somit ergibt sich dann in der Klammer ein Wert von 00000001, der dann mit dem alten Portwert verODERt wird. Somit wird das Bit an der Stelle 0 gesetzt.
Damits deutlicher wird das ganze mal mit PORTB5, was intern als 5 definiert ist.
(1<<PORTB5)
wird übersetzt zu
(1<<5)
Das heißt, wir nehmen das Byte mit der eins darin
00000001
und schieben es fünfmal nach links:
00100000
Damit haben wir nen ein Byte erzeugt, in dem das fünfte Bit gesetzt ist. Und wenn wir das jetzt mit dem Port-Register verodern, in dem z.B. gerade nen 10000110 steh, ergibt sich:
10100110
Wir haben also das fünfte Bit des Ports gesetzt und den Rest in Ruhe gelassen.
Wenn man ein Bit im Port wieder löschen will, macht man es ja mit
PORTB &= ~(1 << PORTB5);
Dabei wird erst wieder über die Verscheibung das Byte mit der
00100000
erzeugt. Dann wird es mit dem ~ Bitweise invertiert:
11011111
und schließlich per & (AND) mit dem Portregister verknüpft:
10100110 alter Wert im Port
11011111 Byte mit ausgewähltem Bit, das wir löschen wollen
------------
10000110 Ergebnis
Lesezeichen