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
warum als bild?
1 | PORTX = PORTX ^ 4; |
ist es so verständlicher? ( die 4 ist nur als Beispiel, kommt auf Pxy an)
naja ich wollt eigentlich wissen wie durch diese if bedingung und dieser XOR verknüpfung die led blinkt? ich verstehs irgendwie nicht...
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
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
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.
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??
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.
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.
Aber denk dran, es gibt keine ISR die "1kHz" heisst ;), es dient nur der Veranschaulichung.
static uint16_t count = 0; eine frage hätt ich noch warum muss dieser datentyp gewählt werden?
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.
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. ;-)
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.
ralf schrieb: > ach so weil wenn ich nur "int" schreibe gehts nur bis 8bit also 255? nein, int ist mindestens 16bit.
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??
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
