Hallo, ich habe 5 Taster an meinem f149 angeschlossen, über Interrupt. Die Tasterabfrage per Interrupt funktioniert prima. Nun wollte ich folgenedes realisieren, bleibe da aber irgendwie stecken. Die Eingänge liegen auf 3,3V und die Taster ziehen die auf GND. Ich will nun eine Taste (1) drücken. Wenn ich dieses Taste drücke und gedrückt halte und eine weitere Taste (2) drücke, soll als Test eine LED toggeln. Ich bin nun soweit,dass wenn ich die erste Taste drücke und gedrückt halte und dann die zweite Taste immer wieder drücke, die LED toggelt. Also Taste 1 drücken und festhalten und Taste 2 immer wieder drücken, damit die LED toggelt. Das geht. Nun habe ich das Problem, dass ich auch abfragen möchte, wann die Taste 1 losgelassen wird, damit ich das IFG für die erste Taste zurücksetzen kann. Gibt es da eine Möglichkeit oder kann man das irgendwie eleganter oder anders lösen? Gruß Frank
dann lösch doch einfach in der ISR für Taster1 das IFG und ändere die Richtung der Flankenerkennung und verlasse die ISR. Beim loslassen erzeugt das dann halt wieder ein Interrupt. Je nachdem wie dein Taster prellt kann es sein dass du dich dann im Kreis drehst.
Also ich würde die Tastendrücke gar nicht direkt mit Interrupts abfragen, sondern einen Timerinterrupt (z.B. mit 1kHz) aufsetzen, der dann den Zustand der Tasten auswertet. Das Prellen ist so auch schon automatisch weg und man kann viel leichter messen wie lange eine Taste gedrückt ist oder komplexe Kombinationen auswerten. Für Dein Problem könntest Du vielleicht eine kleine State Machine (im Timerinterrupt oder Main) programmieren, welche je nach Reihenfolge der gedrückten oder losgelassenen Tasten den gewünschten Vorgang ausführt.
Da werde ich mal schauen wie ich das löse. Bin ein blutiger Anfänger und werde mich da dann mal mt beschäftigen. Einen Timer nutze ich als Real-Time-Clock. Werde mir dann man den Timer B heranziehen und sehen, was ich da so hinbekomme. Gruß Frank
Du kannst auch denselben Timer wie für die RTC benutzen, einfach den Takt in der Software für die Tastenabfrage runterteilen. Falls Du Dich noch nicht mit State Machines auskennst, würde ich mir das mal angucken. So auf die schnelle habe ich das gefunden: http://de.wikipedia.org/wiki/Endlicher_Automat Im Code kannst Du das dann z.B. in einem grossen Switch / Case verpacken, welches vom Timerinterrupt her bzw. durch ein im Timerinterrupt gesetztes Flag immer wieder im Main aufgerufen wird. Das nachfolgende Beispiel macht nicht so viel gescheites, aber so kann man das Beispielsweise umsetzen... Bsp.: switch (zustand) { case 1: if (taste_1_gedrück) { zustand = 2; } if (taste_2_gedrückt) { zustand = 3; } if (taste_1_gedrückt && taste_2_gedrückt) { zustand = 4; } break; case 2: // code der ausgeführt wird, wenn Taste 1 gedrückt wurde... ... zustand = 1; break; case 3: // code der ausgeführt wird, wenn Taste 2 gedrückt wurde... ... zustand = 1; break; case 4: // code der ausgeführt wird, wenn Taste 1 und 2 gedrückt wurden... ... zustand = 1; break; }
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.