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
Gast #4026378
Lesenswert?
• ▲
▼
Das Bit y wird an Port x mit 1 ver-exklusiv-odert. Folglich ändert es 
seinen Zustand immer (toggelt). Das Aufrufinterval (if count == 500) 
hierfür beträgt 500ms, da die Interruptroutine mit 1kHz (1ms) aufgerufen 
wird.

Und es muss natürlich
1
static uint16_t count = 0;
heissen, hatte mich da vertippt.
Gast #4026392
Lesenswert?
• ▲
▼
ralf schrieb:
> genau soweit begreif ich das ja auch... dann ist die led z.b. auf 1
> geschaltet und im nächsten durchgang dann wieder auf eins

Nu, tust du nicht ;-)

Lies noch mal nach, was die Kollegen zum XOR geschrieben haben. Wenn du 
den Logik-Zustand mit 1 "ver-xoderst", dann ändert er jedesmal seinen 
Wert.
#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.
Gast #4026514
Lesenswert?
• ▲
▼
ralf schrieb:
> static int count = 0;
Es ist immer das Problem, dass solche Definitionen plattformabhängig 
sind.
Ein int auf nem 32-Bitter ist 32 Bit breit. Ein int auf nem 8-Bitter ist 
16 Bit breit. Um diese Stolperfallen zu umgehen lieber die anderen 
Definitionen wie uint8_t etc. benutzen. Da ist es dann weitestgehend 
plattformunabhängig.
Gast #4026523
Lesenswert?
• ▲
▼
aha verstanden... was ich aber noch nicht verstehe wie kann ein 8 bit 
ter

über 255 hinaus zählen--> also wie macht das der controller? das heißt 
im datenblatt ist angegeben 8 bit controller...so...das würde für mich 
bedeuten das der generell nicht über 255 hinaus kommt??
#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

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.