Tasterabfrage per Interrupt

OP #7815529
Lesenswert?

Hallo Forum,

ich habe eine Frage zum Thema Tasterabfrage während der Laufzeit in der Endlosschleife. Dazu habe ich an einen Interrupt gedacht, der ausgelöst wird, wenn einer der unterschiedlichen Taster betätigt wird.

Ziel: Wird ein an den Input des Controllers angeschlossener Taster parallel mit dem Interrupt-Eingang des Controllers verbunden, wird eine Interrupt-Routine aufgerufen, die dann den Zustand der jeweiligen Inputs abfragt. Somit könnte doch innerhalb dieser Routine erkannt werden, welcher Taster gedrückt wurde.

Pseudocode:

1
ISR(INT0)
2
{
3
   if(PIN0 == HIGH)
4
   {  // mach etwas, was bei Taster-1 geschehen soll 
5
   }
6

7
  if(PIN1 == HIGH)
8
  { //mach was anderes, was bei Taster-2 geschehen soll
9
  }
10
}

Würde das so funktionieren?

Vielen Dank

Angehängte Dateien:
#7815537
Lesenswert?

Dein Schaltplan ist Nonsens. Du zeigst 3 Eingänge miteinander kurzgeschlossen.

Man kann an den Tasteneingängen die Pin-Change-Interrupts freigeben und damit den µC aus dem Stromsparen aufwachen lassen. Das Entprellen und Auswerten macht man danach in bewährter Weise mittels Timerinterrupt.

Moderator (Firma: Titel) Persönliche Seite #7815551
Lesenswert?

J. K. schrieb:

Aber ich meine ob man so innerhalb eines Interrupts theoretisch den jeweiligen Taster "abrufen" kann, der an einen der Eingänge angeschlossen ist

Theoretisch geht das.

Die Entprellung müsste man dann entsprechend machen, wie du sagst.

Und weil man die dann sowieso "extra" noch mit einem Timer/Zähler/... machen muss, ist es sinnvoll das gleich im Timerinterrupt zu tun.

J. K. schrieb:

ich habe eine Frage zum Thema Tasterabfrage während der Laufzeit in der Endlosschleife.

Warum fragst du die Taster dann nicht gleich genau dort in der Endlosschleife ab? So ein Taster ist ja ein kreuzlangsames Bauteil, auf den muss nicht mit einer Programmunterbrechung innerhalb von Bruchteilen von µs reagiert werden.

Obelix X. schrieb:

Zum Thema Tasterabfrage gibt es zig Beiträge hier im Forum und im Internet.

In der Tat:

Moderator (Firma: Titel) Persönliche Seite #7815598
Lesenswert?

Bauform B. schrieb:

Man spendiert pro Taster einen Interrupt-Eingang und macht die Entprellung in Hardware mit einem RS-Flip-Flop.

Jetzt wirds langsam, naja, sagen wir mal "krude".

Warum nicht gleich einen Coprozessor pro Taster, der die Entprellung und die Entstörung erledigt, die Anzahl der Tastendrücke mitzählt sowie irgendwelche Repeatfunktionen beinhaltet und den man per Ethernet auslesen kann?

#7815654
Lesenswert?

Lothar M. schrieb:

und den man per Ethernet auslesen kann?

Das ist unter der Latte durchgesprungen. Wenn schon Programmieren im Jahr 2025, dann mindestens mit irgendeinem Cloud-Service, bei dem man via MQTT/Thread/suchdireinanderestollesprotokollaus die Tasten abfragen kann.

Und eine auf AWS laufende KI-Anwendung übernimmt das Entprellen, die kann sich dann auch an das Alterungsverhalten der Taster anpassen, durch ML.

(Firma: Chipwerkstatt) #7815767
Lesenswert?

Andras H. schrieb:

Nein. Man kann den uC durch den Interrupt praktisch larmlegen. Tasten prellen, dann hast du da auch unmengen an interrupt.

Mach doch taster pollen. Das muss reichen.

Ein kleines C mit ca. 47nF über den Kontakt, bzw nach Gnd, und gut ist es.

Pollen wäre auch mein Weg. In der der Routine kann man ja festlegen, dass der Kontakt mindestens 50 ms anliegen mus um 'gültig' zu sein. In Verbindung mit dem kleinen C ist das perfekt.

#7815793
Lesenswert?

Lothar M. schrieb:

Die Entprellung müsste man dann entsprechend machen, wie du sagst.

Und weil man die dann sowieso "extra" noch mit einem Timer/Zähler/... machen muss, ist es sinnvoll das gleich im Timerinterrupt zu tun.

Es gibt Anwendungen, wo der Prozessor schläft und kein regelmäßiger Timerinterrupt aufläuft. Dann wird der Prozessor erst durch den Tastendruck geweckt.

Gast #7815861
Lesenswert?

Dieter W. schrieb:

Thomas S. schrieb:

Ein kleines C mit ca. 47nF über den Kontakt, bzw nach Gnd, und gut ist es.

Dann aber bitte einen Widerstand in Reihe zum Taster sonst ruiniert der beim Schließen entstehende Funke den Kontakt.

Full ACK! Dieses Schaltungsdetail, bei dem ein Taster einen Kondensator kurzschließt oder ohne R auflädt, habe ich schon 100te Male gesehen. Ich würde das auch nicht so machen.

ciao

Marci

#7815923
Lesenswert?

Marci W. schrieb:

Full ACK! Dieses Schaltungsdetail, bei dem ein Taster einen Kondensator kurzschließt oder ohne R auflädt, habe ich schon 100te Male gesehen. Ich würde das auch nicht so machen.

Berühmt dafür wurde das Pollin-Board. Da erzeugt der Tastendruck einen schönen Einbruch der VCC:

Beitrag "Pollin AVR Board Fehler beim drücken der Taster / Qualität der Bauteile"

#7815956
Lesenswert?

J. K. schrieb:

Die Entprellung müsste man dann entsprechend machen, wie du sagst.

Das Problem: Dann kann man es auch direkt nur so machen, ist deutlich einfacher. Eventbasierte Systeme haben den Nachteil, dass "nur" bei Events die Rechenleistung hoch geht, so dass Fehler schwer zu finden sind.

Es gibt 2 Sonderfälle

a) Aufwachen aus Sleep --> ja, dafür ist ein Interrupt gut. Ggf. mehrere Taster über Dioden (oder Gatter) auf einen Int-Pin geben. Aber nur zum Starten, nicht um im Interrupt auszuwerten.

B) Ein-Ausschalten des Gerätes --> Da gibt es Schaltungen, wo mit einer (oder mehreren) Tasten ein Fet geschaltet wird (oft über einen speziellen FET-Treiber) der das Gerät erst einschaltet.

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms auszulesen. Schnelle Tastendrücke (5/s) sind dann zwar nicht mehr möglich, aber das stört am Anfang nicht. Du kannst es einfach später besser machen, wenn das, was Du eigentlich machen möchtest, rund läuft.

Moderator (Firma: Titel) Persönliche Seite #7815974
Lesenswert?

Bruno V. schrieb:

B) Ein-Ausschalten des Gerätes --> Da gibt es Schaltungen, wo mit einer (oder mehreren) Tasten ein Fet geschaltet wird (oft über einen speziellen FET-Treiber) der das Gerät erst einschaltet.

Gerade da ist ein Entprellen nicht nötig, weil so eine Schaltung üblicherweise erst dann in Selbsthaltung geht, wenn der µC angelaufen ist.

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms auszulesen.

Das "seltene" Abfragen allein hilft aber nicht gegen Störungen. Denn wenn grade mal zum Einlesezeitpunkt irgendwie eine Störung drauffunkt, dann wird prompt ein Tastendruck erkannt.

Die sicherste Art (und das sollte eigentlich das Ziel bei der SW-Entwicklung sein) des Entprellens samt Störungsunterdrückung ist also das mehrfache Einlesen des Tasters mit ein paar ms Abstand und erst dann den Tastendruck als "gültig" anzusehen, wenn der Pegel mehrere Abfragen nacheinander stabil auf "betätigt" ist.

#7815976
Lesenswert?

Bruno V. schrieb:

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms

Das is aber schon ziemlich lang. Kürzer "warten" 10-20ms und ab da mehrfach (3-5x) bestätigen lassen, bzw. einen stabilen Zustand erfassen. Da is man dann so bei knapp 30ms und da merkt eh keiner mehr, wenn da ein Tastendruck fehlgeht. Wenn's dann noch hapert, würde ich mir mal "Sorgen" um den min. Strom machen.

#7816048
Lesenswert?

Bruno V. schrieb:

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms auszulesen.

Nein. Das ist gar kein Entprellen. Denn wenn die Störung genau dann passiert, wenn man abfragt, wird es trotzdem Murks. Eine zuverlässige Entprellung in Software geht so, daß man den Taster mehrfach abfragt und erst dann "gedrückt" signalisiert, wenn der Zustand zwei oder mehrere Male gleich war.

Mit Abtastfrequenz und der Anzahl der geforderten gleichen Zustände kann man dabei spielen. Wenn Anzahl × Abtastintervall > Prellzeit ist, dann passt es.

#7816100
Lesenswert?

J. K. schrieb:

Würde das so funktionieren?

Nein.

Wenn egal welcher Taster gedrückt wird, werden alle 3 miteinander verbundenen Eingänge auf high gezogen.

Ausserdem gibt es niemanden der die Eingänge auf low zieht, dein Widerstand ist falsch.

Man kann die Taster mit (z.B. 1N4148) Dioden voneinander entkoppeln bevor man sie auf den Interrupteingang legt

1
    +5V             +5V
2
     |               |
3
  Taster1  InInt  Taster2
4
     |       |       |
5
In1--+--|>|--+--|<|--+--In2
6
     |       |       |
7
     R       R       R
8
     |       |       |
9
    GND     GND     GND

aber du musst einen uralten uC benutzen wenn der nicht auch bei In1 und In2 Interrupts auf PinChange auslösen kann.

Doch wie geschildert prellen Taster und lösen teils hunderte von Interrupts aus beim Drücken, manche nur Mikrosekunden lang.

Selbst wenn nach dem ersten Interrupt der uC innerhalb der Interruptroutine erstmal nicht auf weitere Interrupts reagiert weil gesperrt, und selbst wenn man innerhalb der Interruptroutine den Eingang für weitere 5ms sperren würde (was deine Programmierfähigkeiten wahrscheinlich übersteigt), gibt es eben das Problem das bei Abfrage auf PIN0 oder PIN1 in sagen wir 5 Mikrosekunden nach dem Interruptbeginn der Eingang schon wieder low ist.

Man könnte den Taster in Hardware entprellen mit zusätzlichem Kondensator und Widerstand, braucht aber weil man ihn ja auf 2 Eingänge verteilt noch extern Schmitt-Trigger wie 74LV2G14.

1
 VCC
2
  |
3
Taster
4
  |        74HC14/CD40106 
5
  +-100k-+--|>o-- low wenn Taster gedrückt
6
  |      |
7
 4k7   100nF
8
  |      |
9
 GND    GND

Das ist ein unsinniger Aufwand, wo es doch so einfach in Software geht und sogar einen Pin und die ganze Hardware spart:

Starte einen Timer der alle 10ms einen Timerinterrupt auslöst und frage die Taster darin ab. Waren sie beim letzten Durchlauf nicht gedrückt und sind sie in diesem Durchlauf gedrückt wurden sie wohl gerade runtergedrückt. Das entsprellt auch gleich.

1
char taster1, taster2, taster1alt, taster2alt;
2
void timerinterrupt(void)
3
{
4
   taster1=PIN0;
5
   if(taster1&&!taster1alt) taster1gedrueckt();
6
   taster1alt=taster1;
7
   taster2=PIN1;
8
   if(taster2&&!taster2alt) taster2gedrueckt();
9
   taster2alt=taster2;
10
}

Axel S. schrieb:

Bruno V. schrieb:

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms auszulesen.

Nein. Das ist gar kein Entprellen

Bitte Axel, wenn man noch nie uC Tastenabfragen programmiert hat, sollte man hier nicht so einen Unsinn schreiben. Wobei 100ms störend langsam ist.

Lothar M. schrieb:

Das "seltene" Abfragen allein hilft aber nicht gegen Störungen

Prellen sind keine Störungen, sondern da hat wirklich jemand den Finger auf dem Taster. Störungen streuen in lange Leitungen bei unzureichendem pull down Widerstand ein oder wenn die Stromversorgung des uC schlecht abgeblockt ist. Vor allen wenn der Schalter durch Analogtechnik mit Kondensator und Widerstand und womöglich ohne Schmitt-Trigger Eingang versucht wurde zu entprellen so dass Signale teils nah an Schaltschwellen liegen statt sauber digital sind. Da hat man also ein Hardwareproblem das mit Software nur unzureichend behandelbar ist.

#7816127
Lesenswert?

Michael B. schrieb:

Prellen sind keine Störungen, sondern da hat wirklich jemand den Finger auf dem Taster.

Prellen kann sein: 1.) Taster lange gedrückt oder auch 2.) Tasterkontakt öffnet und schließt sehr schnell hintereinander obwohl nur einmal gedrückt wird.

Und natürlich bekämpft man letzteres über die ZEIT. Man akzeptiert keine Tastflanken die mit weniger Zeitabstand als X ankommen. Ganz einfach. Ersteres bekämpft man in dem man nur auf Flanken und nicht auf Zustände reagiert. Das sollte man immer so machen und dann ist 1. automatisch gelöst.

Und wenn wirklich ein Taster 100ms prellen sollte, ja dann kann man den nur sehr langsam bedienen. Liegt dann am Taster. Nicht am System des Entprellens. Aber das ist wohl eher unrealistisch.

Moderator (Firma: Titel) Persönliche Seite #7816148
Lesenswert?

Peter D. schrieb:

Dein Schaltplan ist Nonsens.

Besonders auch, weil der Widerstand dort nur zum dauerhaften Heizen über die 5V Versorgung dient und nicht als Pulldown. Der µC dort müsste also schaltbare Pulldowns haben, damit das überhaupt funktioniert. Das können nur wenige µC.

Michael B. schrieb:

Lothar M. schrieb:

Das "seltene" Abfragen allein hilft aber nicht gegen Störungen

Prellen sind keine Störungen

Ganz meine Worte. Allerdings kann es zusätzlich zum Prellen eben auch noch eingekoppelte Störungen geben.

Störungen streuen in lange Leitungen bei unzureichendem pull down Widerstand ein

So ist es. Und ein Pullwiderstand im µC ist üblicherweise im Bereich um 30k..50k. Das ist aus EMV-Sicht viel zu hochohmig, 20cm Leitung bis zum Taster reichen da locker zum Einfangen von Störungen. Und wenn man durch eine brauchbare Entprellroutine solche Störungen auch gleich noch ausfiltern kann, dann ist das ein klassischer Win-Win.

Michael B. schrieb:

Axel S. schrieb:

Bruno V. schrieb:

Das einfachste Entprellen ist übrigens, den Taster nur alle ~60-100ms auszulesen.

Nein. Das ist gar kein Entprellen

sollte man hier nicht so einen Unsinn schreiben.

Axel hat Recht, denn natürlich hat keine einzelne Abfrage (und sei sie noch so verzögert) irgendeine Wirkung, die tatsächlich entprellt. Die gefühlte "Entprellfunktion" geschieht dabei nur durch die künstliche Verzögerung der Abfrage. Wenn in der Zwischenzeit der Taster wieder losgelassen und neu gedrückt wurde, wird kein erneuter Tastendruck erkannt.

Fazit: es gibt ganz viele Geräte mit schlechter Software, die mit (im Laufe der Lebensdauer zunehmend stärker/länger) prellenden Tastern nicht zurechtkommt. Und dabei wäre es doch ganz einfach, das gleich von vorn herein richtig zu machen.

#7816191
Lesenswert?

Lothar M. schrieb:

Axel hat Recht, denn natürlich hat keine einzelne Abfrage (und sei sie noch so verzögert) irgendeine Wirkung, die tatsächlich entprellt.

Doch. Prellen bedeutet mehrere Tastendrücke statt einem. Das ist ausgeschlossen, wenn die Prellzeit <= der Abtastzeit ist.

Die gefühlte "Entprellfunktion" geschieht dabei nur durch die künstliche Verzögerung der Abfrage. Wenn in der Zwischenzeit der Taster wieder losgelassen und neu gedrückt wurde, wird kein erneuter Tastendruck erkannt.

Das habe ich nicht nur dabei geschrieben, sondern auch warum das egal ist:

Bruno V. schrieb:

Schnelle Tastendrücke (5/s) sind dann zwar nicht mehr möglich, aber das stört am Anfang nicht. Du kannst es einfach später besser machen, wenn das, was Du eigentlich machen möchtest, rund läuft.

Dass ein Anfänger alles perfekt oder gar nicht machen soll, ist abschreckend.

#7816651
Lesenswert?

Bruno V. schrieb:

Dass ein Anfänger alles perfekt oder gar nicht machen soll, ist abschreckend.

Für den privaten Gebrauch oder als Lernschritt sind halbgare Lösungen voll o.k. Leider sieht man in der Praxis aber auch haufenweise kommerzielle Bedienungen, die entweder von Ignoranten oder Anfängern programmiert wurden. Taster schalten mehrfach oder verlieren Betätigungen, Drehgeber zählen wirr vor und zurück. Aber auch hohe elektrostatische Empfindlichkeit (übern Teppich schlurfen, Pullover ausziehen, Gerät in der Nähe einschalten) ist die Folge.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren