sbi und cbi fkt. umschreiben

Gast #366559
Lesenswert?
• ▲
▼
@ johnny.m
seh ich genau so.

Ich hab meist folgendes Makro zum Bit-Löschen definiert, um mir die
Schreibarbeit bissel zu vereinfachen:
#define DEL(X)  &= ~(X)

Im Code:
  PORTD DEL(1<<PD2)

Ciao Thomas.
Gast #366564
Lesenswert?
• ▲
▼
hallo, das stimmt das Prinzip ist das Wichtigste...
Aber ich verstehe es nicht, vielleicht fehlen mir einfach die nötigen
Grunkenntnissse, könnt mir jemand vielleicht erklären warum

PORTD |= 1 << PD3;
PORTD &= ~(1 << PD3);

das mach was es macht?


Dankeschön Andre
#366565
Lesenswert?
• ▲
▼
PD3  kommt von einem ordinären
#define PD3  3

überall wo also PD3 steht, ersetzt der Präprozessor
diesen Text 'PD3' mit '3'

damit wird   1 << PD3
zu           1 << 3

und das macht: nimm eine 1 und schieb diese 1 binär dreimal
nach links. Aus  0b00000001  wird also  0b00001000

A |= B
ist die Kurzform für   A = A | B

wobei | eine ODER Verknüpfung darstellt. Im Gegensatz zu
|| wird diese aber auf Bitebene durchgeführt, dh. die
gleichwertigen Bits der beiden Partner werden miteinander
ODER-Verknüpft.
Du weist schon:

    A    B   |   A | B
  -----------+---------
    0    0   |     0
    1    0   |     1
    0    1   |     1
    1    1   |     1

In dieser Tabelle ist im Ergebnis genau dann eine 1, wenn
entweder A ODER B ODER Beide 1 waren. Und genau das will
man hier.

Wenn ich

   PORTD = PORTD | 0b00001000;

mache, dann wird an die Bitposition 3 auf jeden Fall eine 1
gesetzt, gleichgültig was vorher in PORTD stand. (Die anderen
Bits bleiben so wie sie sind. Schau in die Tabelle: Wenn B 0
ist, dann ist das Ergebnis identisch mit dem Zustand von A)

---------------------------------

PORTD &= ~( 1 << PD3 );

~ macht eine binäre Negation. D.h. alle Bits werden umgedreht.
aus  0b00001000  wird also  0b11110111
A &= B ist wieder eine Kurzform. Diesmal für A = A & B

und das & steht für binäres UND

    A    B   |  A&B
   ----------+------
    0    0   |   0
    1    0   |   0
    0    1   |   0
    1    1   |   1

Das Ergebnis ist genau dann 1, wenn A UND B 1 waren.
Schau dir die Tabelle genauer an. In den Zeilen in
denen B 0 ist, ist das Ergebnis auf jeden Fall 0.
In den Zeilen in denen B einen Wert von 1 hat, ist
der Ergebnis identisch mit dem Zustand von A.

Jetzt sollte schon klar sein, was

   PORTD = PORTD & 0b11110111

macht. Überall dort wo in der Maske 0b11110111 eine 1
steht, ist das Ergebnis identisch mit PORTD an dieser
Bitposition. Überall dort wo in der Maske eine 0 steht,
wird das betreffende Bit im Ergebnis auf jeden Fall auf
0 gesetzt.
Gast #366566
Lesenswert?
• ▲
▼
@Karl Heinz:
Wann kommt eigentlich Dein Buch raus??? Hast Du irgendwo ne Datenbank,
in der für jede Frage so ne schön erklärte Antwort steht? Und dann
immer diese schönen Beispiele aus dem täglichen Leben...

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.