Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage: Unterschied | und & beim Schalten von GPIOs in C


von Gustav M. (gustav_mueller)


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

von ffff (Gast)


Lesenswert?

& => bitweises und
| => bitweises oder


10101&
11111
-----
10101

10101|
11111
-----
11111

von ffff (Gast)


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

von Karl H. (kbuchegg)


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.

von HildeK (Gast)


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.

von Noch einer (Gast)


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;

von Karl H. (kbuchegg)


Lesenswert?

Noch einer schrieb:

> Heutzutage unterstützen alle Compiler Bitfelder.

Vorausgesetzt natürlich, der Hersteller hat sich die Mühe gemacht 
entsprechende STrukturen bereitzustellen.

Davon abgesehen: wie schaltest du 2 Bits gleichzeitig und nicht 
nacheinander?

von ffff (Gast)


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)

von Gustav M. (gustav_mueller)


Lesenswert?

Vielen Dank für die schnellen und unkomplizierten Erklärungen

von Paul B. (paul_baumann)


Lesenswert?

Noch einer schrieb:
> Wenn man zeigen möchte, dass man noch den alter
> C-Hacker Stiel beherrscht.

Meinst Du einen Hackenstiel?
http://sanzofix-shop.de/Garten/holzstiel-kreuzhacke-holzstiel-spitzhacke-holzstiel-birkenholz-stiel-fuer-spitzhacke-stiel-fuer-hacke-.html

MfG Paul

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.