Forum: Compiler & IDEs Anfängerfrage Operatoren


von Thomas (Gast)


Lesenswert?

hi,

ich lede gerade das GCC Tutorial. Nur verstehe ich nicht was das konkret 
macht:


PORTB |= (1<<PB2);


es setzt Bit3 an Port B. Aber wieso 1<<PB2? und |= ist or oder? Wäre 
jemand so freundlich mir das mit Zahlen herzuleiten?

Mfg. Thomas R.

von Andreas K. (a-k)


Lesenswert?

Wie kommst du auf Bit 3? Der Befehl setzt zwar das dritte Bit von 
rechts, aber das ist Bit 2.

von Thomas (Gast)


Lesenswert?

sorry das mein ich.

von Johannes M. (johnny-m)


Lesenswert?

Thomas wrote:
> ich lede gerade das GCC Tutorial. Nur verstehe ich nicht was das konkret
> macht:
>
> PORTB |= (1<<PB2);
Das ist äquivalent zu
1
PORTB = PORTB | (1 << PB2);
und macht eine bitweise ODER-Verknüpfung von PORTB mit der Bitmaske 1 << 
PB2.

> es setzt Bit3 an Port B. Aber wieso 1<<PB2? und |= ist or oder? Wäre
> jemand so freundlich mir das mit Zahlen herzuleiten?
Nein, es setzt Bit 2 an Port B! Merke: Die Zählung fängt grundsätzlich 
bei 0 an. Es ist das dritte Bit, das hat aber die Nummer 2...

1 << PB2 ist in Binärschreibweise eine 1, die um PB2 Stellen nach links 
verschoben ist. PB2 hat den Wert 2, also ergibt sich die Bitmaske 
0b00000100. Mit dieser Bitmaske wird das Portregister bitweise 
ODER-verknüpft, was dazu führt, dass das Bit Nummer 2 gesetzt wird und 
alle anderen Bits unverändert bleiben.

Das ganze Prozedere steht im AVR-GCC-Tutorial eigentlich ganz gut 
beschrieben.

von Flo S. (tuxianer)


Lesenswert?

ich versuchs mal:


also PortB ist binär: 0b101000001
jetzt wird 0b000000001 2x nach links verschoben

0b000000001
0b000000010
0b000000100

jetzt kommt das or:

0b10100001 or 0b00000100 --> 0b10100101


ich hoffe das war richtig so...

€dit: uups da hat wohl jemand schneller getippt als ich...

von Johannes M. (johnny-m)


Lesenswert?

Florentin Schirmer wrote:
> 00000000 und 00000100 --> 00000100
Wohl eher ODER statt UND...

> ich hoffe das war richtig so...
Naja, Deine Annahme, dass PORTB vorher null ist, macht das ganze ein 
bisschen sinnlos. Der Witz der Verknüpfung ist doch gerade, dass es 
pupsegal ist, was vorher in dem Register steht, weil nur das gewählte 
Bit gesetzt wird, alle anderen aber unverändert bleiben.

von Flo S. (tuxianer)


Lesenswert?

sorry mein ich doch steht ja auch drber... ich änders mal um...

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.