www.mikrocontroller.net

Forum: Compiler & IDEs Anfängerfrage Operatoren


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry das mein ich.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:
> ich lede gerade das GCC Tutorial. Nur verstehe ich nicht was das konkret
> macht:
>
> PORTB |= (1<<PB2);
Das ist äquivalent zu
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.

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry mein ich doch steht ja auch drber... ich änders mal um...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.