Forum: Mikrocontroller und Digitale Elektronik Frage zu Interrupts


von umut (Gast)


Lesenswert?

Hallo liebe Leute,

ich habe ein Arduino Due mit mehreren Interruptpins und habe eine 
generelle Frage zu Interrupts & Polling von das meine ganze Anwendung 
abhängt....

Die Anwendung soll so aussehen:
-Ich habe mehrere Knöpfe
-Ich überprüfe mit dem Mikrokontroller,welcher dieser Knöpfe zu einer 
bestimmten Zeit, gedrückt wurden.
-Die Zustände der Knöpfe sollen in ein Array gespeichert werden
(Zeit x Anzahl_Buttons).
-Dabei entspricht die Zeile des Arrays der Zeit. Eine Zählervariable für 
die Zeile zählt alle 1/100 Sekunden mithilfe des internen Timer hoch, so 
dass alle 1/100 Sek, die Button-Zustände in der nächste Zeile 
gespeichert werden.

Die Bedingungen:
-Die Knopfdrücke müssen möglichst SOFORT erfasst werden!
-Es müssen mehrere Knöpfe, die gleichzeitig gedrückt werden, erfasst 
werden und im Array, entsprechend der Zeit, abgespeichert werden.
-Solange mehrere Knöpfe gedrückt gehalten werden, muss die Erfassung 
auch funktionieren.

Die Frage die sich mir stellt ist, was benutzte ich dafür am besten?
Ich dachte zunächst an Interrupts um zu gewährleisten, dass ich die 
Knopfdrücke sofort sehe. Die Interruptroutine zum jeweiligen Button soll 
die momentane Zählervariable bekommen und dann an dieser Stelle den 
Array beschreiben.

Problem: Wenn ich den Button gedrückt halte, stecke ich in der 
Interruptroutine fest, so dass andere Buttons nicht mehr gemessen 
werden.

Nun denke ich mir, dass ich alle Knöpfe (sind etwa 10) im Polling ziehe. 
Ich Multiplexe quasi die Buttons. Da mein Mikrokontroller deutlich 
schneller als 1/100 Sekunden ist, dürfte ich doch keinen einzigen 
Knopfdruck verpassen zu messen oder?

Was niemals geschehen darf ist nämlich: Ich drücke zum Zeitpunkt X den 
Knopf A. Das Programm ist jedoch bereits hinter der Zeile für diesen 
Knopf. Sobald die Zeile für die Erfassung A wieder dran kommt, ist es 
aber bereits der Zeitpunkt X+1 (Delay von 1/100 Sekunden entsprechend 
meiner Applikation)

Mache ich mir da unnötig sorgen, oder gibt es paar Tricks und Tipps wie 
ich die Messung optimieren kann? Vielleicht eine Kombination aus Polling 
und Interrupts?

Würde mich auf eine Antwort sehr freuen.

von Günter N. (turtle64)


Lesenswert?

Du kannst doch den Interrupt z.B. durch eine steigende Flanke am Eingang 
triggern. Dann speicherst Du etwas und gehst sofort aus dem Interrupt 
raus. Da bleibst Du nicht drin stecken.

Knöpfe gleichzeitig zu drücken wird bei einer Auflösung von 1/100s nicht 
klappen. Da wirst Du Dir schon eine Schwelle, z.B. 50ms, setzen müssen 
und Tastendrücke innerhalb dieses Zeitfensters als "gleichzeitig" 
bewerten.

von Sascha_ (Gast)


Lesenswert?

Die Wahrscheinlichkeit dass du 2 Knöpfe genau gleichzeitig gedrückt 
bekommst, ist bei deiner Abtastrate extrem gering.

Nichtsdestotrotz kannst du ja in der Interruptroutine trotzdem nochmal 
alle Ports abfragen.

Entprellung wäre noch so ne Sache die ich mir angucken würde.

von Oliver S. (oliverso)


Lesenswert?

umut schrieb:
> Da mein Mikrokontroller deutlich
> schneller als 1/100 Sekunden ist, dürfte ich doch keinen einzigen
> Knopfdruck verpassen zu messen oder?

Wenn du schnell genug wieder loslässt, schon ;)

Jeder real existierende Mikrocontroller arbeitet taktgebunden einzelne 
Befehle der Reihe nach ab, und kann daher weder sofort noch beliebig 
schnell irgend etwas tun, oder beliebig kurze Zeitdiffenzen auflösen.

Du Must dir daher schon etwas genauer überlegen, was Begriffe wie 
"sofort", "unbedingt" oder "auf keinen Fall" für deine Anwendung 
tatsächlich bedeuten, und wie groß die zulässigen Abweichungen von den 
damit beschriebenen Idealfällen, ohne die es nicht gehen wird, sein 
dürfen.

Oliver

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

wenn Du mit Köpfen wirklich Knöpfe also Taster meinst:
wie schnell kannst Du oder andere einen Taster drücken und loslassen?
Manche Taster prellen schon 50ms bis sie überhaupt stabil ein oder aus 
sind.

Wenn Du mit 1/100s, also 10ms im Polling abfragst, bekommst sehr 
wahrscheinlich mehrere ein/aus-Folgen gespeichert bis der Tasterwert 
dann stabil ist.

Gruß aus Berlin
Michael

von Amateur (Gast)


Lesenswert?

>Du kannst doch den Interrupt z.B. durch eine steigende Flanke am Eingang
>triggern.
Soll die Dauer erfasst werden, so kann es nicht schaden, die abfallende 
Flanke ebenfalls im Auge zu behalten.

Es gibt aber universelle Routinen (Stichwort: "entprellen" - hundertfach 
hier im Forum) die die Betätigung UND das Loslassen, von Tasten, 
erfassen.

von Volle (Gast)


Lesenswert?

die Begriffe "sofort" und "Gleichzeitig" haben hier nichts verloren.

Bei Tasten reicht es alle 10ms (durch Timerinterrupt) nach zuschauen wie 
der Eingang Steht.  Ist der aktuelle Zustand identisch zum letzten gilt 
dieser.
Bei mehreren Tasten erfasst man alle in dieser Funktion.

d.H die Tasten werden zeitdiskret, synchron erfasst.
Prellen und Störungen werden gefilltert.

von umut (Gast)


Lesenswert?

Danke für die Antworten.

Günter N. schrieb:
>
> Knöpfe gleichzeitig zu drücken wird bei einer Auflösung von 1/100s nicht
> klappen. Da wirst Du Dir schon eine Schwelle, z.B. 50ms, setzen müssen
> und Tastendrücke innerhalb dieses Zeitfensters als "gleichzeitig"
> bewerten.

Sascha_ schrieb:
> Die Wahrscheinlichkeit dass du 2 Knöpfe genau gleichzeitig
> gedrückt
> bekommst, ist bei deiner Abtastrate extrem gering.
>

Es wird definitiv Situation geben, wo die Knöpfe "gleichzeitig" gedrückt 
werden. Auch wenn "gleichzeitig" im Nanosekunden bereich liegen sollte, 
wird es bei soviele Buttonklicks wie bei meiner Anwendung sicherlich mal 
vorkommen^^

Oliver S. schrieb:
> umut schrieb:
>> Da mein Mikrokontroller deutlich
>> schneller als 1/100 Sekunden ist, dürfte ich doch keinen einzigen
>> Knopfdruck verpassen zu messen oder?
>
> Wenn du schnell genug wieder loslässt, schon ;)
>

Es kommen halt Situation vor, wo ich aber ein Knopf gedrückt halte und 
dabei ein weiterer Knopf hinzukommt.

Michael U. schrieb:
> Hallo,
>
> wenn Du mit Köpfen wirklich Knöpfe also Taster meinst:
> wie schnell kannst Du oder andere einen Taster drücken und loslassen?
> Manche Taster prellen schon 50ms bis sie überhaupt stabil ein oder aus
> sind.
>
> Wenn Du mit 1/100s, also 10ms im Polling abfragst, bekommst sehr
> wahrscheinlich mehrere ein/aus-Folgen gespeichert bis der Tasterwert
> dann stabil ist.
>
> Gruß aus Berlin
> Michael

Das Prellen habe ich schon im Griff. Nach dem ich die Taste loslasse 
sollte es nach 1/100 Sekunden den Wert 0 erreicht haben. Und falls 
nicht, kann ich meine Anwendung auf 1/60 Sekunden runterschrauben, da 
klappt es mit Sicherheit.

Volle schrieb:
> die Begriffe "sofort" und "Gleichzeitig" haben hier nichts
> verloren.
>
> Bei Tasten reicht es alle 10ms (durch Timerinterrupt) nach zuschauen wie
> der Eingang Steht.  Ist der aktuelle Zustand identisch zum letzten gilt
> dieser.
> Bei mehreren Tasten erfasst man alle in dieser Funktion.
>
> d.H die Tasten werden zeitdiskret, synchron erfasst.
> Prellen und Störungen werden gefilltert.

Timer-Interrupt. Ich glaube, dass ist das was ich brauche und gesucht 
habe.
Danke dir!

von Jona (Gast)


Angehängte Dateien:

Lesenswert?

ich frage mich, ob man einen Taster wie im Anhang gezeigt auch 
hardwaremäßig entprellen kann.

Der 1k-R soll verhindern, dass der C sich beim Tasten direkt über den 
Taster entlädt.

von dunno.. (Gast)


Lesenswert?

Volle schrieb:
> Bei Tasten reicht es alle 10ms (durch Timerinterrupt) nach zuschauen wie
> der Eingang Steht.  Ist der aktuelle Zustand identisch zum letzten gilt
> dieser.

Das ist zu wackelig. Taster prellen u.u viel viel länger, und mit 
welchem muster, kannst du nicht sagen..

Aber wieso das rad neu erfinden.. Peter Dannegger hat da schon alle 
Probleme gelöst, siehe codesammlung..

von dunno.. (Gast)


Lesenswert?

Jona schrieb:
> ich frage mich, ob man einen Taster wie im Anhang gezeigt auch
> hardwaremäßig entprellen kann.
>
> Der 1k-R soll verhindern, dass der C sich beim Tasten direkt über den
> Taster entlädt.

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

von umut (Gast)


Lesenswert?

Ich habe schon "fertige" Taster,

dunno.. schrieb:
> Volle schrieb:
>> Bei Tasten reicht es alle 10ms (durch Timerinterrupt) nach zuschauen wie
>> der Eingang Steht.  Ist der aktuelle Zustand identisch zum letzten gilt
>> dieser.
>
> Das ist zu wackelig. Taster prellen u.u viel viel länger, und mit
> welchem muster, kannst du nicht sagen..
>
> Aber wieso das rad neu erfinden.. Peter Dannegger hat da schon alle
> Probleme gelöst, siehe codesammlung..

Ich habe schon "fertige" Taster, bei dem die Prellung für meine 
Anwendung kein Problem darstellen sollte. Die sind nämlich dafür 
ausgelegt.

Ich werde mir aber Peter Dannegger trotzdem mal anschauen.Man weiß ja 
nie..
Danke dafür.

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.