Forum: Mikrocontroller und Digitale Elektronik Interrupt nachbasteln


von knilch (Gast)


Lesenswert?

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?

von Stefan S. (chiefeinherjar)


Lesenswert?

https://www.mikrocontroller.net/articles/Entprellung

Da steht alles beschrieben. Lesen. Verstehen. Umsetzen/Einsetzen.

von Stefan S. (chiefeinherjar)


Lesenswert?

Nachtrag: Um welchen uC soll es überhaupt gehen?
Und was heißt, dass du nicht mehr viele Interrupts übrig hast???

von knilch (Gast)


Lesenswert?

Danke.
Leider keine Antwort auf meine Frage :)

Atmega 8, ein Interrupt für 4 Taster, keine Parallelbetatigung.

von Hubert G. (hubertg)


Lesenswert?

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.

von Günter (Gast)


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von H-G S. (haenschen)


Lesenswert?

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 :-)

von Jakob (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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.

von Sebastian S. (amateur)


Lesenswert?

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
Noch kein Account? Hier anmelden.