XOR Bitmanipulation

#4026375
Lesenswert?

ralf schrieb:
> kann mir bitte jemand erklären wie dieser programmcode abläuft damit am
> port die led blinkt...ich versteh diese XOR Bitmanipulation nicht
> richtig...danke schonmal

Die Logiktabelle eines XOR
1
   A      B     |  Ergebnis
2
 ---------------------------
3
   0      0     |    0
4
   0      1     |    1
5
   1      0     |    1
6
   1      1     |    0

Das Ergebnis ist dann 1, wenn entweder A oder B 1 sind, aber nicht 
beide.

B, das ist in deinem Fall die Maske in
1
    PORTx ^= Maske

Dieses Maskenbit ist logischerweise immer 1. D.h. aus der Logiktabelle 
interessieren nur die Zeilen, in denen B eine 1 aufweist. Das sind diese 
beiden hier
1
   A      B     |  Ergebnis
2
 ---------------------------
3
   0      1     |    1
4
   1      1     |    0
und was sehen wir?
Das Ergebnis hat immer genau den gegenteiligen Wert von A.

Für alle anderen Bits deiner Maske, die 0 sind, sind die Zeilen 
interessant, in denen B eine 0 aufweist:
1
   A      B     |  Ergebnis
2
 ---------------------------
3
   0      0     |    0
4
   1      0     |    1

Was sehen wir hier: Das Ergebnis ist identisch zu A.

D.h. zusammengefasst:
Dort wo in der Maske ein 1 Bit steht, dreht sich der Zustand von A um. 
Dort wo in der Maske ein 0 Bit steht, ändert sich nichts.



Nachtrag:
Die Logiktabellen der Bitoperationen sollte man schon auswendig können. 
Sind sie doch der Schlüssel zu all den Bitanweisungen, die in Programmen 
vorkommen. In C werden diese Bitoperationen auf die einzelnen Bits eines 
Bytes unabhängig voneinander angewendet.

UND
1
   A      B    Ergebnis
2
  -----------------------
3
   0      0       0
4
   0      1       0
5
   1      0       0
6
   1      1       1
Das Ergebnis ist dann 1, wenn sowohl A als auch B 1 sind

OR
1
   A      B    Ergebnis
2
  -----------------------
3
   0      0       0
4
   0      1       1
5
   1      0       1
6
   1      1       1
Das Ergebnis ist dann 1, wenn entweder A oder B 1 sind

XOR
1
   A      B    Ergebnis
2
  -----------------------
3
   0      0       0
4
   0      1       1
5
   1      0       1
6
   1      1       0
Das Ergebnis ist dann 1, wenn entweder A oder B, aber nicht beide 1 sind

NOT
1
   A      Ergebnis
2
  -----------------------
3
   0         1
4
   1         0
Das Ergebnis ist dann 1, wenn A 0 ist
#4026449
Lesenswert?

ralf schrieb:
> static uint16_t count = 0;
>
> eine frage hätt ich noch warum muss dieser datentyp gewählt werden?

Denk ein bischen selbst nach und lass dir nicht alles vorkauen!
Sonst wird das nichts mit dem Programmieren.

Was heisst den uint16_t?
u  wie unsigned. Also ohne VOrzeichen. Kann so ein Zähler negativ sein? 
Nein, kann er nicht. Also braucht er kein Vorzeichen und alle 16 Bit 
stehen zum zählen zur Verfügung. Sonst wären es nur 15 Bit.

int   wie ganzzahlig. Logisch. Wenn man etwas zählt, dann ist das immer 
eine ganze Zahl

16    wie 16. Welche Alternative hättest du? 8 Bit. Wie weit kann man 
mit 8 Bit zählen? Bis 255. Reicht das? Nein. Denn du willst bis 500 
zählen können.


Alles ganz logisch.
#4026549
Lesenswert?

ralf schrieb:

> über 255 hinaus zählen--> also wie macht das der controller?

Genauso wie du auch.
Du hast in der Grundschule das kleine Einmal-Eins gelernt und kannst 
trotzdem weit darüber hinaus addieren und multiplizieren. Rechnest eben 
nicht alles in einem Rutsch sondern auf mehrmals, merkst dir die 
Zwischenergebnisse und produzierst dann das Ergebnis aus den 
Zwischenergebnissen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren