Gast
#4026352
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
|
Anzeige
|
XOR Bitmanipulation
Gast
#4026352
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
Gast
#4026356
warum als bild?
ist es so verständlicher? ( die 4 ist nur als Beispiel, kommt auf Pxy an)
Gast
#4026371
naja ich wollt eigentlich wissen wie durch diese if bedingung und dieser XOR verknüpfung die led blinkt? ich verstehs irgendwie nicht...
Gast
#4026373
ralf schrieb: > ich verstehs irgendwie nicht... zähle bis 500, wenn 500 erreicht sind fange wieder bei 0 an und schalte die LED um. 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
Das Ergebnis ist dann 1, wenn entweder A oder B 1 sind, aber nicht beide. B, das ist in deinem Fall die Maske in
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
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:
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
Das Ergebnis ist dann 1, wenn sowohl A als auch B 1 sind OR
Das Ergebnis ist dann 1, wenn entweder A oder B 1 sind XOR
Das Ergebnis ist dann 1, wenn entweder A oder B, aber nicht beide 1 sind NOT
Das Ergebnis ist dann 1, wenn A 0 ist
Gast
#4026378
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
heissen, hatte mich da vertippt.
Gast
#4026387
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??
Gast
#4026390
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.
Gast
#4026392
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.
Gast
#4026394
1 XOR 1 = 0 0 XOR 1 = 1 1 XOR 1 = 0 ...
Gast
#4026395
dankeschön...verstanden
Gast
#4026398
Aber denk dran, es gibt keine ISR die "1kHz" heisst ;), es dient nur der Veranschaulichung.
Gast
#4026435
ich weiß das müsste man dann über den prescaler einstellen oder?
Gast
#4026439
static uint16_t count = 0; eine frage hätt ich noch warum muss dieser datentyp gewählt werden?
Gast
#4026441
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. 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. 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
#4026456
Und "static", damit die Variable zwischen den ISR-Aufrufen erhalten bleibt.
Gast
#4026500
ok sehr gute erklärung...aber ich hätte doch genauso static int count = 0; schreiben können oder? 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. ;-)
Gast
#4026511
ach so weil wenn ich nur "int" schreibe gehts nur bis 8bit also 255?
Gast
#4026514
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
#4026517
ralf schrieb: > ach so weil wenn ich nur "int" schreibe gehts nur bis 8bit also 255? nein, int ist mindestens 16bit.
Gast
#4026523
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??
Gast
#4026526
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.
Gast
#4026528
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 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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|