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.
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.
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.
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
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
>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.
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.
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!
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.
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,
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.