Hallo, ich habe irgend wie im Hinterkopf das man mit einer einfachen if abfrage und einem exklusivoder einen Flankenwächsel erkennen kann! Mein Problem ist aber das ich es einfach nicht hinkriege!! Wäre sehr nett wenn mir jemand auf die Sprünge helfen könnte!!! Vielen Dank programmier_würstchen
programmier_würstchen schrieb: > Hallo, > ich habe irgend wie im Hinterkopf das man mit einer einfachen if abfrage > und einem exklusivoder einen Flankenwächsel erkennen kann! Stimmt ... fast. Man muss sich auch den neuen Zustand bis zur nächsten Abfrage retten. Also immer: neuen Zustand mit Zustand unmittelbar davor vergleichen und danach den neuen Zustand als alten Zustand für die nächste Vergleichsrunde wegspeichern. > Mein Problem ist aber das ich es einfach nicht hinkriege!! Wäre sehr > nett wenn mir jemand auf die Sprünge helfen könnte!!! Zeig doch einfach was du hast und jemand von hier zeigt dir wo dein Fehler liegt. An dem 3 Zeiler kann man eigentlich nicht allzuviel falsch machen, sodass dein Problem möglicherweise ganz woanders liegt
1 | uint8_t PortAlt; |
2 | |
3 | int main() |
4 | {
|
5 | uint8_t PortNeu; |
6 | |
7 | ...
|
8 | |
9 | PortAlt = ....; |
10 | |
11 | while( 1 ) { |
12 | |
13 | PortNeu = ....; |
14 | if( PortNeu ^ PortAlt ) { |
15 | // irgendein Pin hat gewechselt
|
16 | }
|
17 | PortAlt = PortNeu; |
18 | }
|
19 | }
|
Also ich habe es so versucht
1 | uint8_t mask = (1<<PC); |
2 | if (PORTC &^mask) |
3 | {
|
4 | tick++; |
5 | mask ^= 0xff; |
6 | }
|
aber es reagiert nich nur auf änderung des PinC3 irgend wie sitz ich total auf der Leitung Vielendank für Eure Hilfe
programmier_würstchen schrieb: > Also ich habe es so versucht >
1 | > uint8_t mask = (1<<PC); |
2 | > if (PORTC &^mask) |
3 | > { |
4 | > tick++; |
5 | > mask ^= 0xff; |
6 | > } |
7 | >
|
was soll das & da drinnen? Du brauchst eine XOR-Verknüpfung, keine UND-Verknüpfung. Und ausserdem kannst du eine 'Änderung' nur dann detektieren, wenn du den aktuellen Zustand mit einem Zustand von Früher vergleichst. Das impliziert schon das Wörtchen 'Änderung'. Und im Übrigen wird ein Port ausgelesen, in dem man das PIN Register ausliest, nicht das PORT Register. PORT Ausgänge (oder Steuerung der Pullup) PIN Eingänge
Das mit dem PORT und PIn ist mir klar aber zum testen hat sich das RunLed angeboten Jetzt habe ich es so versucht
1 | uint8_t old,tick; |
2 | |
3 | int main(void) |
4 | {
|
5 | while(1) |
6 | {
|
7 | if (old^PORTC) |
8 | {
|
9 | tick++; |
10 | old = PORTC; |
11 | }
|
12 | }
|
13 | |
14 | }
|
aber ich möchte das ich nur bei änderung des Portc3 tick incrementiert wirt! Endschuldige mich für meine Dummen Fragen !!! Danke
programmier_würstchen schrieb: > Das mit dem PORT und PIn ist mir klar anscheinend nicht. Du machst das immer noch falsch. > aber ich möchte das ich nur bei änderung des Portc3 tick incrementiert > wirt! Wie soll sich denn in deinem Programm am PORTC irgendeine Änderung ergeben? PORTx ist die Bezeichnung für die Ausgänge. Die Eingänge fragt man mit PINx ab!
1 | #include <avr/io.h> |
2 | |
3 | uint8_t old; |
4 | uint8_t tick; |
5 | uint8_t new; |
6 | |
7 | int main(void) |
8 | {
|
9 | old = PINC; |
10 | |
11 | while(1) |
12 | {
|
13 | new = PINC; |
14 | |
15 | if ( ( old ^ new ) & ( 1 << PC3) ) // Nur bei Änderung |
16 | // aber die Änderung darf auch nicht
|
17 | // irgendwo sein. Sie muss am PIN C3 sein
|
18 | {
|
19 | tick++; |
20 | }
|
21 | |
22 | old = new; |
23 | }
|
24 | }
|
Ich ändere in einem Timerinterrupt Portc3 nur zur simulation!!!! (Nachher werde ich das über einen externen Eingang machen und endsprechend auf Pin umschreiben ) Nochmal zu meiner Frage wie ich nur auf änderung des einen Bit (PORTC3)reagieren kann??? Danke für deine nette Hilfe
Endschuldige habe if ( ( old ^ new ) & ( 1 << PC3) ) // Nur bei Änderung übersehen Danke
programmier_würstchen schrieb: > Ich ändere in einem Timerinterrupt Portc3 > > nur zur simulation!!!! > > (Nachher werde ich das über einen externen Eingang machen und > endsprechend auf Pin umschreiben ) AH ja. Immer erst die möglichst komplizierte und fehlerträchtigste Variante benutzen und anderen auch nichts davon erzählen. Wär ja auch zu einfach :-)
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.