Hallo, ich möchte mehrere Taster abfragen. Dazu habe ich für aufwendige HW-Entprellung via Flipflop keinen Platz und keinen Nerv. Da die Taster in einer Schleife abgefragt werden, die recht flott läuft (10-20x pro Sekunde), kann es passieren, dass ein Taster gedrückt bleibt. Leider habe ich nur wenige Interrupts zur Verfügung (die ich noch dazu anderweitig brauche). Als Idee habe ich mir eine Fangschleife ausgedacht: (Pseudocode) Wenn Taster = 1 warte 20 ms Do Wenn Taster = 0 warte 20 ms Exit do Ende wenn loop Irgendeine Handlung Ende wenn Funktioniert das so?
https://www.mikrocontroller.net/articles/Entprellung Da steht alles beschrieben. Lesen. Verstehen. Umsetzen/Einsetzen.
Nachtrag: Um welchen uC soll es überhaupt gehen? Und was heißt, dass du nicht mehr viele Interrupts übrig hast???
Danke. Leider keine Antwort auf meine Frage :) Atmega 8, ein Interrupt für 4 Taster, keine Parallelbetatigung.
knilch schrieb: > Leider keine Antwort auf meine Frage :) Doch, in dem Artikel steht es im Prinzip so drinnen wie du es in deinem Pseudocode geschrieben hast. Das Warten darf nur nicht in einem delay erfolgen, sondern mit einem Timer.
knilch schrieb: > Wenn Taster = 1 > warte 20 ms > Do > Wenn Taster = 0 > warte 20 ms > Exit do > Ende wenn > loop > Irgendeine Handlung > Ende wenn > > Funktioniert das so? Ja. "Irgendeine Handlung" wird immer ausgeführt, wenn Taster einmal als = 1 erkannt wurde.
knilch schrieb: > ein Interrupt für 4 Taster Willst Du etwa mit den Tastern Interrupts auslösen? Das wäre in den meisten Fällen eine ganz, ganz schlechte Lösung... Richtig ist es jedoch, die Taster in einem Timer-Interrupt periodisch abzufragen und dort die Entprellung durchzuführen. Wenn man jedoch Energie sparen muss, indem man den Microcontroller in einen Tiefschlafmodus versetzt, kann man den Microcontroller per Interrupt aufwecken, dann den Timer-Interrupt anwerfen, die Tastendrücke auswerten und ggf. nach einiger Zeit den Prozessor wieder schlafenlegen.
Du brauchst einen Zähler der mitzählt wieviele Abfragen lang die Taste ununterbrochen nicht gedrückt war. Damit stellst du sicher dass die Taste sicher losgelassen wurde, wenn du nichts tust solange dieser Zähler zB. kleiner als 50 ist. Auch ein Zähler für Anzahl gedrückt erkannter Abfragen hintereinander bräuchtest du. Wenn dieser zB. 5 ist dann lässt du die Taste als gedrückt durchgehen. Sollte zwischendurch ein "nicht gedrückt" mit reingeraten setzt du den Zähler wieder zurück (in dieser Zeit prellt der Taster noch). Die beiden Zähler setzen sich gegenseitig zurück in ihren Ablaufzweigen - ist ziemlich heftig und hat mich wochenlang zu Tode gebuggt :-)
Gute Nachricht: Du musst keinen Interrupt nachbasteln! Schlechte Nachricht: EIN passender Interrupt, der deinem Programm ein Zeitgerüst vorgibt ist erforderlich! Der schlägt am Besten alle 1...12 ms zu! - Tastatur-Abfrage -Entprellung -Auswertung wäre nur EINE Aufgabe dafür. - Dem gesamten Ablauf kann man damit eine überschaubare Ordnung vorgeben! - Eine Abfrage / ein Unterprogramm kommt nicht zurück? Verwirf den Versuch nach x * 1...12 ms.... Macht alles viel einfacher!
Ich würde nicht das Fahrrad neu erfinden wollen, sondern einfach eine bereits bewährte Lösung nehmen, z.B.: Beitrag "Universelle Tastenabfrage" Entprellen sieht nur auf den ersten Blick so aus, als könne man es schnell mal so hinschludern.
In gefühlt 100 Beiträgen wurde das Thema Tastenabfrage, wahrscheinlich ausgiebig behandelt. Ob mit oder ohne Unterbrechung. Hast Dich wohl gründlich vorinformiert;-)
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.