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
:
Bearbeitet durch User
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..
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.