Verständnisfrage: Unterschied | und & beim Schalten von GPIOs in C

OP #4198437
Lesenswert?
• ▲
▼
Hallo liebe Community,
ich habe, vor ein paar Tagen, angefangen mit C Mikrocontroller zu 
programmieren. Dabei ist mir aufgefallen, dass manche Leute in ihrem 
Code "|" oder "&" vor dem = verwenden, wenn sie den Status eines Outputs 
verändern.
Beispielsweise diese Zeile:
1
 PORTB |= (1<<5);
Oder diese Zeile:
1
 PORTB &= ~(1<<5);
Doch wozu dienen diese beiden Zeichen an dieser Stelle und wann 
verwendet man | und wann &.
Vielen Dank für eure Antworten
Gustav
Gast #4198447
Lesenswert?
• ▲
▼
auf gut Deutsch:

Wenn du auf einen Portwert eine logische 1 verundest, löscht u.U. alle 
alten Stellen
bei einem oder(|) bleiben mit sicherheit die alten Werte enthalten und 
an der Stelle an der du die 1 haben willst steht auf alle Fälle eine 1
#4198450
Lesenswert?
• ▲
▼
Die Schreibweise
1
  a op= b;

ist nichts anderes als eine Abkürzung für
1
  a = a op b;
2

3

4
(wobei op ein Operator ist, wie zb + oder - oder * oder &, aber auch die bit-Operationen 'Und' & bzw. 'Oder' | lassen sich dafür verwenden)
1
  PORTB |= (1<<5);
ist also nichts anderes als die C-Kurzschreibweise für
1
  PORTB = PORTB | (1<<5);


Näheres zu diesen Kurzformen weiss dein C-Buch.
Gast #4198452
Lesenswert?
• ▲
▼
Gustav M. schrieb:
> Beispielsweise diese Zeile: PORTB |= (1<<5);
Die ausführliche Schreibweise heißt:
PORTB = PORTB | 0b00100000.
Es wird also eine 1 um 5 Stellen nach links geschoben. Die Klammer 
ergibt dann den binären Wert 0b00100000.
Anschließend kommt eine Oder-Verknüpfung mit dem Inhalt von PORTB, was 
letztlich das 5.Bit in PORTB setzt ohne irgendwelche anderen zu 
verändern.

> Oder diese Zeile: PORTB &= ~(1<<5);
Hier soll das 5.Bit auf 0 gesetzt werden.
Zunächst wird in der Klammer wieder 0b00100000 erzeugt, dann durch die 
Tilde (~) aber invertiert und mit dem Inhalt des PORTB UND-Verknüpft. 
Vollständig lautet dies dann:
PORTB = PORTB & 11011111
Letztlich wird also Bit 5 gelöscht, alle anderen bleiben unverändert.
Gast #4198455
Lesenswert?
• ▲
▼
Wann verwendet man es? Wenn man zeigen möchte, dass man noch den alter 
C-Hacker Stiel beherrscht.

Heutzutage unterstützen alle Compiler Bitfelder. Da kann man einfach 
schreiben: PORTB.BIT5 = ON;
Gast #4198463
Lesenswert?
• ▲
▼
Noch einer schrieb:
> Wann verwendet man es? Wenn man zeigen möchte, dass man noch den
> alter
> C-Hacker Stiel beherrscht.
>
> Heutzutage unterstützen alle Compiler Bitfelder. Da kann man einfach
> schreiben: PORTB.BIT5 = ON;

Das hat nix mim Compiler zu tun. Die Struktur kann man sich innerhalb 
von 2 Minuten mit nem struct + define zusammendödeln.
Ändert nix daran das das die Antwort nicht beantwortet.

Leserlichers wärs mit Sicherheit besser(ich bin kein AVR-"Experte", weiß 
deswegen nicht was die AVR lib dazu so anbietet)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.