Forum: Mikrocontroller und Digitale Elektronik XOR Bitmanipulation


von ralf (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter II (Gast)


Lesenswert?

warum als bild?
1
PORTX = PORTX ^ 4;

ist es so verständlicher? ( die 4 ist nur als Beispiel, kommt auf Pxy 
an)

von ralf (Gast)


Lesenswert?

naja ich wollt eigentlich wissen wie durch diese if bedingung und dieser 
XOR verknüpfung die led blinkt? ich verstehs irgendwie nicht...

von Peter II (Gast)


Lesenswert?

ralf schrieb:
> ich verstehs irgendwie nicht...

zähle bis 500, wenn 500 erreicht sind fange wieder bei 0 an und schalte 
die LED um.

von Karl H. (kbuchegg)


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

von Ingo (Gast)


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.

von ralf (Gast)


Lesenswert?

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...aber wann 
wird sie wieder rückgesetzt??

von Ingo (Gast)


Lesenswert?

ralf schrieb:
> dann ist die led z.b. auf 1
> geschaltet und im nächsten durchgang dann wieder auf eins
eben nicht, wenn du dir die Wahrheitstabelle von Karl-Heinz mal angucken 
würdest.

von Achim S. (Gast)


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.

von Ingo (Gast)


Lesenswert?

1 XOR 1 = 0
0 XOR 1 = 1
1 XOR 1 = 0
...

von ralf (Gast)


Lesenswert?

dankeschön...verstanden

von Ingo (Gast)


Lesenswert?

Aber denk dran, es gibt keine ISR die "1kHz" heisst ;), es dient nur der 
Veranschaulichung.

von ralf (Gast)


Lesenswert?

ich weiß das müsste man dann über den prescaler einstellen oder?

von ralf (Gast)


Lesenswert?

static uint16_t count = 0;

eine frage hätt ich noch warum muss dieser datentyp gewählt werden?

von Peter II (Gast)


Lesenswert?

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

wer sagt das du das must?

man kann auch int nehmen.

von Max H. (hartl192)


Lesenswert?

ralf schrieb:
> eine frage hätt ich noch warum muss dieser datentyp gewählt werden?
500 hat in einer uint8_t nicht mehr Platz und der nächstgrößere ist 
uint16_t, ein noch größerer wäre Verschwendung.

von Karl H. (kbuchegg)


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.

von Ingo (Gast)


Lesenswert?

Und "static", damit die Variable zwischen den ISR-Aufrufen erhalten 
bleibt.

von ralf (Gast)


Lesenswert?

ok sehr gute erklärung...aber ich hätte doch genauso

static int count = 0;

schreiben können oder?

von (prx) A. K. (prx)


Lesenswert?

Ja. Gewohnheitssache. Auf den 8-Bittern gewöhnt man sich an, die Typen 
explizit mit Grösse zu versehen. Auf 32-Bittern gewöhnt man sich das 
dann manchmal wieder ab. ;-)

von ralf (Gast)


Lesenswert?

ach so weil wenn ich nur "int" schreibe gehts nur bis 8bit also 255?

von Ingo (Gast)


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.

von Peter II (Gast)


Lesenswert?

ralf schrieb:
> ach so weil wenn ich nur "int" schreibe gehts nur bis 8bit also 255?

nein, int ist mindestens 16bit.

von ralf (Gast)


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??

von Peter II (Gast)


Lesenswert?

ralf schrieb:
> was ich aber noch nicht verstehe wie kann ein 8 bit
> ter
> über 255 hinaus zählen

der Mensch hat auch nur 10 Finger und kann bis 100 zählen.

von Ingo (Gast)


Lesenswert?

Wie wäre es denn, wenn du dir endlich mal das Tutourial anguckst???
http://www.mikrocontroller.net/articles/AVR-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Karl H. (kbuchegg)


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.

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.