Hallo Atmel-Fans.. vorweg ich habe alles gelesen über Tasten und Tastenabfrage was ich so finden konnte, sicher ohne Frage sehr gute Artikel dabei. Ich möchte dies noch einfacher haben, also ohne Warteschleifen oder Mehrfachabfragen.. Nun mal eine andere Idee ob auch so gehen könnt, bin gerade im Urlaub und habe kein Testboard dabei. Mal so zur Diskussion.... Wenn man die Tatenabfrage mit PCINT also Pinchange-Interrupt macht dann gleich nach eintreffen eines Ereignis über ein vorher eingerichteten Timer für ca. 20-100ms den betreffenden PCINT sperrt. Dadurch sollten doch auch alle Eingaben durch Prellen so zu sagen gar nicht erst durch kommen. Also auf Meinungen mal hier wartend...
Gerald Schlüter schrieb: > Wenn man die Tatenabfrage mit PCINT also Pinchange-Interrupt macht dann > gleich nach eintreffen eines Ereignis über ein vorher eingerichteten > Timer für ca. 20-100ms den betreffenden PCINT sperrt. > Ich möchte dies noch einfacher haben Und was ist daran jetzt einfacher? Überleg dir einfach mal, was da alles zu tun ist, wenn du 5 Tasten angeschlossen hast. Das wir massig Code, schon alleine deswegen weil du für 5 Tasten dann Buch führen musst, wie lange es her ist, dass der entpsrechende Interrupt gesperrt wurde. Die PeDa Tastenabfrage ist so simpel und so universell, dass es sich nicht lohnt da noch grossartig über was anderes nachzudenken.
> Dadurch sollten doch auch alle Eingaben durch Prellen > so zu sagen gar nicht erst durch kommen. Wegschauen und Ignorieren ist nicht gleich Entprellen. Entprellt ist ein Eingang, wenn nach dem letzten Preller eine Zeitlang Ruhe auf der Leitung ist. Was, wenn deine 20-100ms einfach zu kurz sind?
Hallo, sicherlich nicht sehr viel kürzer, ich wollte nur mal wissen weil ich zur Zeit nicht selber prüfen kann, obs prinzipiell geht. Jede Taste sperrt den PCINT gleich selber in der dafür zuständigen Int-Routine, kein Aufwand und genauso wenig Fehler um den Überblick zu verlieren, der Timerint gibt einfach dann alle wieder frei. Es sollen ja auch keine "gleichzeitigen" Abfragen der Tasten erfolgen. Warum nicht dennoch mal andere Ideen haben auch wenns gutes gibt...
Es soll eine Tastenabfrage werden zu Steuerung eines Menues. Also wenn Taste gedrückt wird nichts gezählt oder ähnliches sonden wird ein Menuepunkt über eine Sprungtabelle aufgerufen.
Was, wenn deine 20-100ms einfach zu kurz sind? Ja da ist was dran.... mal sehen obs dennoch was anderes zuverlässiges möglich ist mit der momentanen Idee..
Gerald Schlüter schrieb: > Hallo, sicherlich nicht sehr viel kürzer, ich wollte nur mal wissen weil > ich zur Zeit nicht selber prüfen kann, obs prinzipiell geht. Jede Taste > sperrt den PCINT gleich selber in der dafür zuständigen Int-Routine, > kein Aufwand und genauso wenig Fehler um den Überblick zu verlieren, der > Timerint gibt einfach dann alle wieder frei. Es sollen ja auch keine > "gleichzeitigen" Abfragen der Tasten erfolgen. > Warum nicht dennoch mal andere Ideen haben auch wenns gutes gibt... Weil es in Summe komplizierter wird ohne dass du etwas dabei gewinnst. Ausserdem kannst du deinem Benutzer schlecht vorschreiben, dass er nicht 2 Tasten gleichzeitig drücken darf. Eine Entprellung sollte schon damit klarkommen. Drückt er zb die Taste 'links' und gleich darauf (190ms später) die Taste 'rechts' und sein Cursor hoppelt daraufhin 8 mal nach rechts, dann wird ihn das nicht unbedingt von deiner Sorgfalt überzeugen :-) Ich verstehs immer noch nicht: Die PeDa Lösung ist eine richtige 'Copy and Forget' Lösung. In eine meist sowieso schon vorhandenen regelmässigen Millisekundentimer-ISR werden die 6 oder 7 Code zeilen einkopiert, ein paar #define angepasst (um Ports und Pins festzulegen) und ansonsten ist nichts zu tun. Tastenabfrage einzubauen ist damit eine Sache von 10 Minuten.
Hallo Gerald Deine Sorgen möchte ich haben. Du hast Urlaub. Hol Dir ein Bier, setz Dich an den Strand oder in den Biergarten und schau den Mädels auf den Popo. Diese Gedanken kannst Du Dir auch noch bei der Arbeit machen. Keine Angst, das Problem läuft nicht weg. Gruß Joachim Sehnsüchtig auf seinen Urlaub wartend!!!!!!
Der Charme der 8 Tasten parallel Entprellung liegt auch darin, daß sie die Flanke auswertet, d.h. den Wechsel von Losgelassen nach Gedrückt und das nur mit einer einzigen Zeile. Man muß also nicht umständlich für jede Taste eine extra Variable für den alten Zustand anlegen und auswerten. Peter
Hallo, wenn Du so gerne Neuigkeiten hast, probier mal "Matrixtastatur ADC abfragen" zu Googeln, es wird Dir sicher gefallen. Tastatur an einem Pin! Grüße
Das ist doch was zum beschäftigen... Vielen Dank. War übrigens hauptsächlich die Idee mit der andern Variante weil ich die Tasten auf zwei Ports habe, geht nicht anders weil ich schon einige Attiny861 habe und alles teilweise mehrfach belegt ist. LCD-Ausgabe, 4 LEDs und 5 Tasten und ein DCF Empfänger von Pollin mit Ein-Aus Schaltung. Die Uhr ist , wie solls auch anders sein, obwohls viele Varianten gibt, dennoch ne komplette Eigenentwicklung. Abtippen und Nachlernen warums so fuktioniert geht sicher auch aber selber dies Verstehen durch selber denken da liegt gerade sicher auch bei vielen hier der Reiz drin. (Es geht mir nicht ums Rad neu erfinden... nur ums lernen) (Schauen was die Mädels machen kann man in den nicht immer so kreativen Nachdenkpausen.....) Vielen Dank an alle...
Gerald Schlüter schrieb: > War übrigens hauptsächlich die Idee mit der andern Variante weil ich die > Tasten auf zwei Ports habe Da kann man alle Tastenvariablen auf uint16_t aufbohren und beide Ports zu einem 16Bit-Wert kombinieren. Oder sparsamer, die entsprechenden Bits mit AND/OR/SHIFT auf einen 8Bit-Wert kombinieren. Peter
DAs mit der ADC-Wertabrfage ist sogar genau richtig, brauche dann nicht die Ports für die LEDS jedesmal umkonfigurieren und zus. nach mit ein Transistor hochohmig schalten damit die Tastenabfrage dann korrekt funktioniert. Den Pin habe ich noch frei dafür. (Resetpin als Eingabe für ADC sollte doch ohne weiteres gehen oder?) Wie gesagt, vielen Dank!!!
> Da kann man alle Tastenvariablen auf uint16_t aufbohren und beide Ports > zu einem 16Bit-Wert kombinieren. > > Oder sparsamer, die entsprechenden Bits mit AND/OR/SHIFT auf einen > 8Bit-Wert kombinieren. > 4 Pins von einen Port und einer vom anderen, da ist der Vorschlag mit der ADC-Abfrage schom allein wegen des PIN-Mangel sicher optimaler. Aber dennoch gut auch sowas als Idee zu haben. (Ich programmiere nur Assembler mit AVR Studio)
Gerald Schlüter schrieb: >> Da kann man alle Tastenvariablen auf uint16_t aufbohren und beide Ports >> zu einem 16Bit-Wert kombinieren. >> >> Oder sparsamer, die entsprechenden Bits mit AND/OR/SHIFT auf einen >> 8Bit-Wert kombinieren. >> > > 4 Pins von einen Port und einer vom anderen, da ist der Vorschlag mit > der ADC-Abfrage schom allein wegen des PIN-Mangel sicher optimaler. Gut, wenn du Pin Mangel hast, ist das ok. Programmtechnisch ist auch das nicht 'optimaler'. Denk einfach nur an den Aufwand den du treiben musst um aus einem ADC-Wert wieder die Nummer der gedrückten Pins zu extrahieren. Und wie sich Tastenprellen im ADC Signal wiederspiegeln wird :-) Ganz abgesehen davon was alles passieren wird, wenn sich der Tastendruck ausgerechnet während eines ADC-Messzykluses ereignet :-)
Ja und nun.... also doch peda-Lösung und die Pins beim Aufruf des Eingabemenue umkonfigurieren und die angeschlossenen LEDs hochohmig schalten. Ist dann wohl doch die sicherer und bessere Eingabe für Daten. Klar woher will ich wissen wie lange mein Taster prellt und mal prellen wird, den Timer unnötig lang zu setzen zur INT-Blockade ist jedenfalls alles andere als optimal. ADC-Wert auslesen braucht ja recht grob zu sein bei 5 Tasten und somit in 1V-Schritten machbar. Aber eben nicht einfacher nur PIN-Sparender. Nun denn gut, werde mal beides auf Bedienbarkeit daheim dann testen. Vielen Dank für die Urlaubsanregungen...
Hallo, bisher habe meine Tastaturen immer so angeschlossen, funktioniert stabil, deshalb bin ich ein grosser Fan dieser Methode. Man muss nur sichere Spannungs-Abstände schaffen, die Limits experimentell bestimmen und eine Taste nur anerkennen wenn der ADC-Wert z.B. 3 mal im Abstand von 1 ms innerhalb von derselben Limits war. Ja, programmiertechnisch aufwendiger (Interrupts oder entsprechend lange Endlos-Schleife-Programm mit Zähler-Variable), aber die Pins gehen immer schneller aus als der Programmierspeicher, nicht wahr? Grüße Michal
@Karl heinz Buchegger >Ich verstehs immer noch nicht: Die PeDa Lösung ist eine richtige 'Copy >and Forget' Lösung. In eine meist sowieso schon vorhandenen >regelmässigen Millisekundentimer-ISR werden die 6 oder 7 Code zeilen >einkopiert, ein paar #define angepasst (um Ports und Pins festzulegen) >und ansonsten ist nichts zu tun. Tastenabfrage einzubauen ist damit eine >Sache von 10 Minuten. Du hast sicher Recht. Es ist eine tolle, einfache und sinvolle 'Copy and Forget' Lösung. Ich muss allerdings sagen, ich finde es schön und bereichernd wenn jemand nicht immer das schon Fertige nur benutzt, sondern aus Lust am Lernen und Nachdenken versucht neue Weg zu gehen. Klar - wenn es darum geht schnell, günstig und sicher eine einsatzreife Software zu erstellen, dann kann/soll man schon auf fertige getestete Module zurückgreifen. Aber vergesst nicht, dass hier auch viele Menschen das ganze aus Spass an der Technik machen und auch um Neues zu lernen und sich weiter zu entwickeln. Da ist es schomn legitim auch mal neue Wege zu versuchen - und sich ggf. auch mal zu "verrennen". Sicher wird so was zu vielen Fehlschlägen führen - aber ich glaube fest daran, dass durch solche "Spielereien" auch gute neue Ideen und Inovationen entstehen können. In diesem Fall hat er sein Ziel "noch Einfacher" nicht erreicht. Aber ist doch toll, wenn jemand sein Job/Hobby so begeistert, dass er im Urlaub noch drüber nachdenken will. Gruss NurEinGast
Michal schrieb: > Man muss nur sichere Spannungs-Abstände schaffen, die Limits > experimentell bestimmen Quarks, da wird nichts experimentell bestimmt. Der Compiler soll Konstanten gefälligst selber ausrechnen, man muß ihm nur die Spannungsteilerformel und Widerstandswerte geben: Beitrag "Tastenmatrix auslesen über nur 2 Leitungen" Ob Tasten direkt, mit LED an einem Pin oder über ADC, immer kommt dahinter dann die gleiche Entprell- und Flankenerkennungsroutine. Das ist der Charme von einzelnen kleinen Modulen, man kann sie kombinieren. Peter
Peter Dannegger schrieb: > Michal schrieb: >> Man muss nur sichere Spannungs-Abstände schaffen, die Limits >> experimentell bestimmen > > Quarks, da wird nichts experimentell bestimmt. > > Der Compiler soll Konstanten gefälligst selber ausrechnen, man muß ihm > nur die Spannungsteilerformel und Widerstandswerte geben: > > Beitrag "Tastenmatrix auslesen über nur 2 Leitungen" > > > Ob Tasten direkt, mit LED an einem Pin oder über ADC, immer kommt > dahinter dann die gleiche Entprell- und Flankenerkennungsroutine. > Das ist der Charme von einzelnen kleinen Modulen, man kann sie > kombinieren. > > > Peter Ich denk mal schon das ein Messen der Spannungspegel für der jeweiligen Taste durchaus sinnvoll sein kann wenn man nicht gerade hochgenaue Wiederstandswerte nimmt. Bei 5 Spannungswerte wie hier zB. kann man evtl. den Bereich enger fassen und die Werte stimmen dann immer noch. Im Prinzip erfolgt dann die "Entprellung" durch zB. 3 malige Abtastung des ADC-Wert doch auch oder? Gerald
Irgendwie geht die Entprellproblematik immer noch an mir vorbei. Ich frage einfach die Tasten im 1ms-Interrupt ab und was 2 mal gleich ist, gilt - habe ich da jetzt irgendwas verpasst?
bzw. den jeweiligen Spannungswert halt einfach übernehmen der dann zu Testzwecken zB. aufs LCD-Display ausgegeben werden kann. Gerald
Peter Stegemann schrieb: > Irgendwie geht die Entprellproblematik immer noch an mir vorbei. Ich > frage einfach die Tasten im 1ms-Interrupt ab und was 2 mal gleich ist, > gilt - habe ich da jetzt irgendwas verpasst? Wie lkmiller schrieb: Entprellt ist ein Eingang, wenn nach dem letzten Preller eine Zeitlang Ruhe auf der Leitung ist.
Preller sind doch eigentlich nur kurze Impulse währen die Prellzeit aber eben unterschiedlich viele Impulse haben kann, das heißt anstatt zB. 4x auf gleichen Wert zu prüfen und dann erst übernehmen, kann mann sicher auch mit jeden Prellimpuls den Timer zurücksetzen und wenn dann keiner mehr folgt direkt die Taste als gültig erkennen. Hat dieser Ansatz auch wieder tücken??? Gerald
Gerald Schlüter schrieb: > Entprellt ist ein Eingang, wenn nach dem letzten Preller eine Zeitlang > Ruhe auf der Leitung ist. Die Aussage ist richtig, beantwortet die Frage aber nicht.
Ich denke mal das dann in diesen Fall 2ms für nicht mehr so gute Tasten zu kurz sein werden.
Das heißt mit den Tastenint PCINT Timer starten, eingerichtet TOV auf vieleicht 50ms (jedenfalls etwas länger aus die Zeit zwischen den einz. Prellungen) und erst wenn dann der TOV kommt ist die Leitung auch ruhig... Das heißt es soll damit erreicht werden das nicht pauschal gewartet wird sondern unmittelbar nach Ruhe ausgewertet werden kann. Das heißt wenn der Taster nicht prellt (im Idealfall natürlich nur) dann gleich oder eben entsprechend der Prellzeit eben länger braucht zum Auswerten. Theoretisch mal durchspielen hier im Forum obs geht?
Gerald Schlüter schrieb: > Ich denk mal schon das ein Messen der Spannungspegel für der jeweiligen > Taste durchaus sinnvoll sein kann wenn man nicht gerade hochgenaue > Wiederstandswerte nimmt. Naja, 1% ist doch Standard und damit haben die vom Compiler berechneten Fenster auf Anhieb funktioniert. Dann sollte es bei nur 5 Tasten erst recht funktionieren, sogar mit alten 5% Widerständen. > Im Prinzip erfolgt dann die "Entprellung" durch zB. 3 malige Abtastung > des ADC-Wert doch auch oder? Kommt drauf an, wie Du die 3 Abtastungen auswertest. Mittelwertbildung ist z.B. völlig untauglich, die ergibt Phantomtasten. Meine Entprellroutine übernimmt einen Tastendruck erst dann, wenn viermal hintereinander das gleiche Spannungsfenster erkannt wurde. Peter
Gerald Schlüter schrieb: > Preller sind doch eigentlich nur kurze Impulse währen die Prellzeit aber > eben unterschiedlich viele Impulse haben kann, das heißt anstatt zB. 4x > auf gleichen Wert zu prüfen und dann erst übernehmen, kann mann sicher > auch mit jeden Prellimpuls den Timer zurücksetzen und wenn dann keiner > mehr folgt direkt die Taste als gültig erkennen. > Hat dieser Ansatz auch wieder tücken??? Die Tücke ist der deutlich höhere Aufwand. 5 Timer aufzusetzten wird erheblich mehr Code und SRAM benötigen als die Byte-parallele Entprellung. Probiers aus. Peter
Das mit den Spanungsfenster ist das so gemeint das für 3 Auswertungen dann eben 6 mal gemessen werden muß? Warum gibt Mittelwert messen und dann prüfen ob im Spanungsfenster Phantomtasten? Ja stimmt, das bei diesen großen Spannungfenster ne Berechnug per Software auch ausreicht. Sicher ist Ihre Routine Praxisbewährt, ohne Frage. Dennoch die Frage oben weiter geht das auch zu machen das die Tastenauswertungsdauer abhängig zu machen von der tatsächlichen Prellzeit durch eben zB. zurücksetzen der TOV? Gruß Gerald
> > Die Tücke ist der deutlich höhere Aufwand. > 5 Timer aufzusetzten wird erheblich mehr Code und SRAM benötigen als die > Byte-parallele Entprellung. > > Probiers aus. > > > Peter Ich dachte eher an nur ein Timer für alle Tasten gemeinsam zu verwenden
> Ich dachte eher an nur ein Timer für alle Tasten gemeinsam zu verwenden
Jeder Taster braucht aber sein eigenes Zeitfenster...
Bei ganz simplen Abfragen wird doch auch nur eine Warteroutine per rcall aufgerufen egal von welcher Taste aus. Ich werde dann mal versuchen in der Art das jede Taste per PCINT einen gemeinsamen Timer startet und dann bei TOV die Taste als gültig markiert. Werde mal versuchen ob es machbar ist alle Tasten gemeinsame Warteroutine zu verpassen. Gruß an alle die mir helfen und an alle die hier einfach nur lesen...
Gerald Schlüter schrieb: > Das mit den Spanungsfenster ist das so gemeint das für 3 Auswertungen > dann eben 6 mal gemessen werden muß? Um 5 Tasten und "nicht gedrückt" zu unterscheiden, brauchst Du 6 Fenster. Und dazu sind 5 Vergleiche nötig. Schau Dir mal mein Beispiel an. > Warum gibt Mittelwert messen und dann prüfen ob im Spanungsfenster > Phantomtasten? Wenn Du innerhalb der 3 Messungen drückst. Peter
Ich hatte mir vorgestellt in Form von loop-schleife mehrere Tasten abzufragen mittels sbis(c) pinb,pbx und dann per Timmerstart den Timer so lange zurückzusetzen wie Prellungen kommen und bei TOV die Tasteneingabe anzuerkennen. Werde mal noch ein Versuch starten und gründlich drüber nachdenken und evtl. testen daheim, im Simulator gehts ja leider nicht. Gerald
Hallo, die Entprellroutine von PeDa ist ja zweifelsohne ein tolles Ding. Dennoch steht und fällt doch deren Funktion mit dem Timerintervall ihres Aufrufs, welcher natürlich auf die zu entprellenden Taster, etc. abgestimmt sein muss. Meine Frage an die Praktiker unter euch: Ändert sich die Prellfrequenz im Laufe der Zeit? Gibt es große Unterschiede in der Prellfrequenz und -dauer unter den Betätigungselementen? Gibts da eventuell Erfahrungswerte? MfG Screwdriver
Eben auch deswegen, ist es möglich Entprellroutinen zu entwerfen die sich sozusagen selber auf die Qualität des Tasters einstellen, wie eben mit Timer zurückstzen bei jeder Prellung und das Ergebnis weiterreichen wenn keine Prellung mehr kommt. Damit sollte die Rückantwort der Tastenroutine unmittelbar erfolgen egal wie gut oder schlecht der Taster dann wäre. MfG
screwdriver schrieb: > Dennoch steht und fällt doch deren Funktion mit dem Timerintervall ihres > Aufrufs, welcher natürlich auf die zu entprellenden Taster, etc. > abgestimmt sein muss. Durch die 4-fach Abtastung ist irgendeine Abstimmung völlig unnötig. Um einen Preller zu bekommen, muß ein zusätzlicher 0-0-0-0-1-1-1-1 Impuls entstehen, d.h. bei 10ms Timerinterrupt muß eine Prellperiode >80ms sein. In der Praxis ist daher das Timerintervall völlig unkritisch, 2..50ms sind o.k. Wer will, kann ja mal versuchen, das Timerintervall soweit runter zu setzen, bis Preller auftreten. > Meine Frage an die Praktiker unter euch: > Ändert sich die Prellfrequenz im Laufe der Zeit? > Gibt es große Unterschiede in der Prellfrequenz und -dauer unter den > Betätigungselementen? Gibts da eventuell Erfahrungswerte? Lies dochmal hier: http://www.ganssle.com/debouncing.pdf Der Switch E ist besonders schlecht, er prellt mit 81ms/42ms, würde daher ab 20ms Timerinterrupt sicher entprellt. Also doch kein Grund für hohen Blutdruck, wie Jack Ganssle befürchtete. Peter
Nochmals kurz zum Verständnis an PeDe meinerseits eine Frage, die Routine ist die also immer zB. bei 20ms Abtastrate unabhängig von der Anzahl der Prellungen dann immer 80ms lang oder vestehe ich da doch was falsch? MfG Gerald
Nein, die Routine besteht nur aus ein paar Instruktionen und wird deshalb in wenigen µs abgearbeitet. Sie wird aber alle 20 ms ausgeführt (getriggert von einem Timer). Und 80 ms bis zur Erkennung eines Tastendrucks dauert es wegen der Vier-Gleiche-Samples-Bedingung.
screwdriver schrieb: > Dennoch steht und fällt doch deren Funktion mit dem Timerintervall ihres > Aufrufs, welcher natürlich auf die zu entprellenden Taster, etc. > abgestimmt sein muss. peda antwortete: >Durch die 4-fach Abtastung ist irgendeine Abstimmung völlig unnötig. >Um einen Preller zu bekommen, muß ein zusätzlicher 0-0-0-0-1-1-1-1 >Impuls entstehen, d.h. bei 10ms Timerinterrupt muß eine Prellperiode > >80ms sein. @peda Das mag ja für einzelne Taster gelten. Benutze ich jedoch deine Routine um einen Drehencoder zu entprellen, muss diese in der Zeit zwischen den Signalflanken von Phase A und Phase B abgeschlossen sein. In dem im Anhang beschriebenen Encoder beträgt diese Zeit 2,5..8 ms. Also muss deine Entprellroutine spätestens nach 0,6ms aufgerufen werden um den Encoder mechanisch auszureizen. Wieviel Sinn es jetzt macht das Intervall für den Aufruf der Entprellroutine an seinem mechanischen Möglichen festzumachen, sei jetzt mal dahin gestellt... Der Link http://www.ganssle.com/debouncing.pdf ist sehr interessant. Vielen Dank. Screwdriver
OK, das ist schon klar das die eigentlich Abarbetungszeit sehr kurz ist, aber es dauert bis zum endgültigen Ergebniss eben 4x die Timerzeit. Das heiß hat man gute und schlechte Taster zusammen wartet man dennoch immer die volle Zeit auf das Ergebniss was sicher selten stört. Der Artikel über die Tasten selber ist sehr Aufschlußreich. Daher wohl auch nicht einfach was zu entwerfen was direkt auf Prellungen reagiert und unmittelbar bemerkt jetz ist gut. Werde mir mal den Artikel morgen gründlicher durchlesen. Vielen Dank mit der Geduld hier mit mir....
screwdriver schrieb: > Das mag ja für einzelne Taster gelten. Benutze ich jedoch deine Routine > um einen Drehencoder zu entprellen, muss diese in der Zeit zwischen den > Signalflanken von Phase A und Phase B abgeschlossen sein. Normalerweise entprellst du einen Drehgeber aber nicht so, sondern du nutzt einfach aus, dass er mehrere Mikrochritte pro Raste hat. Du zaehlst erst einen richtigen Schritt, wenn du mehrere Mikroschritte zusammen hast - wenn der Drehgeber zwischen zwei Mikroschritten hin und her springt, passiert also nichts.
Gerald Schlüter schrieb: > OK, das ist schon klar das die eigentlich Abarbetungszeit sehr kurz ist, > aber es dauert bis zum endgültigen Ergebniss eben 4x die Timerzeit. Das > heiß hat man gute und schlechte Taster zusammen wartet man dennoch immer > die volle Zeit auf das Ergebniss was sicher selten stört. Das merkst du nicht. Und wenn es dich so stoert, schaltest du eben beim ersten Flankenwechsel und ignorierst dann eben fuer die Entprellzeit die weiteren Flankenwechsel. .oO( Frage mich mittlerweile, ob es auch eine Diplomarbeit ueber Entprellung gibt.)
screwdriver schrieb: > Das mag ja für einzelne Taster gelten. Benutze ich jedoch deine Routine > um einen Drehencoder zu entprellen, muss diese in der Zeit zwischen den > Signalflanken von Phase A und Phase B abgeschlossen sein. Mein Encoder-Routine arbeitet daher auch völlig anders. Sie nutzt aus, daß ein Encoder Gray-Code sendet, d.h. es ändert sich immer nur ein Bit. Dadurch ergibt sich eine besonders einfache Entprellung, jeder Entpreller wird einfach wieder abgezogen, da die Schritte immer nur +1 oder -1 entfernt sind. Daher muß man auch so häufig abtasten, wie Phasenwechsel durch die Drehgeschwindigkeit möglich sind. http://www.mikrocontroller.net/articles/Drehgeber#Solide_L.C3.B6sung:_Beispielcode_in_C Peter
Hallo, ich werde heute mal was versuchen ob es auch möglich ist direkt auf die Prellungen zu reagieren (bzw. eben nicht) und so das sofort erkannt wird ob eben der Taste nur einmal prellt oder 20mal und dann eben Tasterabhängig das Ergebnis da ist. Falls sowas möglich ist gibts bestimmt noch genug Leute hier die das alles optimieren können. Ich gebe das Ergebnis dann ob positiv oder resigniert Aufgebend hier bekannt. MfG Gerald
Hallo habe was zum testen mal entworfen. Geht bereits erstaunlich zuverlässig und das mit zwei Drahtenden als Taster.... Anschauen, meckern oder Vorschläge machen.
Ja, eine Frage: Wenn ich einen Taster hätte, der bei einer Betätigung 20 Preller erzeugt, würde dann die Routine "tastenint" in Deinem Programm 20 mal durchlaufen werden?
Ja genau... es wird mit jeden Preller der Timer zurückgesetzt. Gerald
Gerald Schlüter schrieb: > Geht bereits erstaunlich zuverlässig und das mit zwei Drahtenden als > Taster.... > Anschauen, meckern oder Vorschläge machen. Mach weiter! (Bin schon neugierig wie du das jetzt auf mehrere Tasten verallgemeinern willst, bei nur einem hardwaremässig vorhandenem Timer. Nebensatz: Einfachheit war das Ziel. Aber ich finds trotzdem gut, dass du dich damit beschäftigst!)
Hallo, durch Auswertung von: in tasten,pinb ;Tasten einlesen mov temp2,tasten andi temp2,0b00000001 ;entspr. Maskieren mov tasten,temp2 com tasten ;negieren, bits zeigen dann die gedr? Tasten an Wert in "tasten" sollte es mir möglich sein. Werde heute Abend mal sehen ob ich Zeit finde zum testen mit den Attiny13, zumindest mit zwei Tasten erstmal. Dann mal auf ein 2312 portieren. Optimieren kommt später, will erst wissen obs überhaupt in der Praxis geht. Der Grund meiner Überlegung ist ja nur Idieller Natur ander Varianten gehen ja schließlich auch zuverlässig, ich möchte eben nicht mehrmals nachschauen ob ich die Taste wirklich gedrückt habe, das tue ich ja mit dem Betätigen durch ein Pegelwechsel ja eh, sondern eben nur noch die nicht gewollten Preller ausblenden. Gerald
sei ;geändert main: tst gedr breq main : clr gedr rjmp main timerov: push temp2 in temp2,sreg mov regsich,temp2 : pop temp2 reti ;geändert tastenint: push temp2 in temp2,sreg mov regsich,temp2 : pop temp2 reti ;geändert Kein Wunder das I-Bit in SREG immer wieder gelöscht wurde....
Neue noch ungeteste Version mit 3 Tastensteuerung, im AVR-Sim gehts bereits. Livetest heute Abend an den Attiny13. Die eigentliche Tastenabfrage besteht aus timeov und tastenint - teil des Programms, also nun auch nicht gerade groß oder unüberschaubar. Meinungen und Vorschläge? Gerald
Tasteneingaben reagieren Super, hier mit drei Tasten getestet, kann ohne Probleme auch auf 8 Tasten bzw. 256 Tastenkombinationen erweitert werden. Nur vieleicht hat da jemand eine Idee, durch Pinchange reagiert das auch wieder nach dem loslassen wenn man länger gedrückt gehalten hat nochmals. Mir fällt momentan nichts mehr ein. Gruß
> reagiert das auch wieder nach dem loslassen
Eben, und deshalb mag ich den PeDa-Algorithmus der Entprellung und setze
ihn (je nach Bedarf) in verschiedenen Varianten (nur Tastendruck, auch
Tastenloslassen, Tastenrepeat, Unterscheidung kurzer/langer Tastendruck)
ein.
Er läuft im Hintergrund in einer Task und stellt dem Hauptprogramm neben
den Merkern für den aktuell entprellten Zustand (nutzbar für
Shift-Tasten) noch die Merker für erneuten Tastendruck (also Flanke
losgelassen -> gedrückt) von 8 Tasten gleichzeitig zur Verfügung. Die
ASM-Routine braucht nur wenige Takte pro Aufruf alle 2..32ms, also weit
weniger als 1% Prozessorauslastung und belastet das Hauptprogramm
absolut nicht.
Und nein, ich gehöre nicht zu den Copy&Paste-Programmierern. Aber zu
Peters Algorithmus gibt es keine vergleichbare Alternative. Das wirst Du
aber erst dann beurteilen können, wenn Du Peters Algorithmus analysiert
und verstanden hast.
Achja, für Encoder (handbetätigte Drehgeber) habe ich die (modifizierte)
Routine auch schon eingesetzt (1kHz Aufruftakt), inzwischen nutze ich
für Encoder aber eine Routine mit LookUp-Tabelle (auch im 1kHz-Takt).
Wenn es sein muss, hänge ich auch mal ein gutes Dutzend Tasten über
Spannungsteiler an den ADC. Aber auch hier wird zyklisch abgefragt und
der Wert erst akzeptiert, wenn er oft genug identisch ist (was auch
Unterscheidung kurz/lang und Repeat ermöglicht).
Viele Wege führen zum Ziel, aber nicht alle sind optimal. Pin-Interrupt
ist für (mechanische handbetätigte) Taster eine der schlechtesten
Lösungen. Selbst wenn der PCI zum Aufwecken aus dem Power-Down-Sleep
genutzt wird (um Strom zu sparen), lohnt es sich, die eigentliche
Tastenabfrage durch (Timer-) zyklisches Einlesen und 4-fach-Entprellung
zu realisieren.
Mach' ruhig Deine Experimente, aber versuche nebenbei auch mal, Peters
Routine [Entprellung] zu verstehen. Vergleiche deren Effizienz dann mal
mit Deinen Ergebnissen. Du wirst überrascht sein... ;-)
...
Ok.... ich hab irgendwie das Gefühl das es nichts besseres geben wird...! Noch kurz mal eine Anfrage zum bestätigen der Funktion, das mit den vertikale Zähler habe ich Verstanden, wenn zum Beispiel der Taster extrem prellt zB. 100mal dann wird 100mal der eingelese Wert verworfen und anschließend noch 4mal im vertikalen Zähler auf Gleichheit verglichen, dann übernommen? Soweit richtig? Thema meinerseits Abschließend.... Gerald
> Soweit richtig?
Nööö, nicht ganz...
Da die Routine zyklisch aufgerufen wird, bekommt sie nicht alle Preller
mit. Sie muss also nicht wie bei Benutzung eines Pin-Interrupts auf
jeden Preller reagieren.
Sie prüft einfach nur im festen Zeitraster den Zustand der 8 Eingänge
und vergleicht ihn mit dem zuletzt entprellten (also zuletzt gültigen)
Wert (in Key_State). Ist der (Bit-)Wert anders, wird der entsprechende
2-Bit-Zähler hochgezählt, ist der Wert identisch, wird der Zähler
gelöscht. Läuft der Zähler über, dann wird der neue Bitwert als neuer
gültiger entprellter Status übernommen. Bei Wechsel von 0 nach 1
(Bitwert) wird zusätzlich das Bit in Key_Press gesetzt, worauf die
Mainloop (oder ein Job derselben) den Tastendruck erkennen und darauf
reagieren kann. Und dies alles geschieht für 8 Taster gleichzeitig, denn
jedes Bit in den verwendeten Registern steht für den entsprechenden
Taster.
Durch eine kleine Erweiterung (Repeat-Counter) lässt sich eine
Tasten-Wiederholfunktion realisieren, bei der die erlaubten Tasten, die
Verzögerung bis zum ersten Zuschlagen und die Verzögerung beim
wiederholten Zuschlagen separat parametriert werden können. Und dabei
kann man auch noch festlegen, ob bei langem Tastendruck eine separate
Aktion ausgeführt werden soll oder ob einfach nur die normale Aktion
wiederholt wird.
Sollten die Taster mal nicht alle an einem Port hängen, so kann man auch
beide Ports (in Temp-Register) einlesen und ein paar Bits mittels
BST/BLD ins zu verwendende Register kopieren. Dieser Overhead fällt bei
Flash-Verbrauch und Prozessorbelastung kaum auf. Selbst wenn man alle 8
Bits aus verschiedenen Quellen (soviele gibt es gar nicht)
zusammenkopieren müsste, wären das lediglich 16 Takte (und 8 für die
INs), das ist immernoch weniger Prozessorlast als vermeintliche
alternative Entprellroutinen brauchen.
Dieser Entprellalgorithmus (auf den speziellen Einsatzzweck optimierbar)
bietet mit geringstem Aufwand das maximale Ergebnis. Wer darauf
verzichtet ist selbst schuld.
...
VIELEN Dank für die ausführliche Erklärung! Zwei Sachen hats gebracht, ich habe dazu gelernt und ich weiß dadurch es geht auch garnicht mehr besser... Vielen Dank an alle die mit mir Ausdauer zeigten.... Gerald
Hannes Lux schrieb: > Ist der (Bit-)Wert anders, wird der entsprechende > 2-Bit-Zähler hochgezählt, ist der Wert identisch, wird der Zähler > gelöscht. Läuft der Zähler über, dann wird der neue Bitwert als neuer > gültiger entprellter Status übernommen. Welchen Vorteil bringt der Zaehler gegenueber einer selteneren Abfrage?
> Welchen Vorteil bringt der Zaehler gegenueber einer selteneren Abfrage?
Sieh dir mal folgendes Bild an:
1 | ___ ___ ____ ______________________ |
2 | _______| |______________| |_____| |___| |
3 | |
4 | 10ms | | | | | | | | | | | | | |
5 | Zähler ? 0 0 1 2 0 0 0 0 1 2 3 4 |
6 | |
7 | feste Zeit 50 ms |
8 | | | | |
9 | | | | |
10 | | | | |
11 | | | | |
12 | | | | |
13 | | | |
Bei der Zählermethode wird gewartet, bis der Pegel definitiv 4 Abtastungen lang auf dem Zielpegel ist. Und das ist schon besser, als nur von 2 Abtastungen auszugehen (das wäre die Methode mit der festen Zeit). Die seltenere Abfrage ist also nur eine schlechtere Lösung des Zähleransatzes. Das kannst du mit Peda's EXOR-Zähler-Ansatz auch so lösen:
1 | i = key_state ^ ~PINA; // key changed ? |
2 | ct0 = ~( ct0 & i ); // reset or count ct0 -- 1-Bit-Exor-Zähler |
3 | i &= ct0; // count until roll over ? |
4 | key_state ^= i; // then toggle debounced state |
5 | key_press |= key_state & i; // 0->1: key press detect |
Lothar Miller schrieb: >> Welchen Vorteil bringt der Zaehler gegenueber einer selteneren Abfrage? > Sieh dir mal folgendes Bild an: Sorry, aber das Bild finde ich hoechst irritierend. Ich denke, ich weiss trotzdem, was du meinst - du gehst hier aber von einem Taster aus, der extrem lange prellt. Mit dem Argument koennte man auch beliebig zeigen, dass x+1 mal zaehlen besser ist als x mal.
> Sorry, aber das Bild finde ich hoechst irritierend. Ja, ich auch :-o > Mit dem Argument koennte man auch beliebig zeigen, > dass x+1 mal zaehlen besser ist als x mal. Ja, so ist es doch eigentlich auch... Wobei natürlich die Abstände zwischen den Abtastungen stark mit reinspielen... Einmal Abtasten ist sehr schlecht, da kommt jeder Preller/Spike/Störung durch. Zweimal Abtasten ist schon stabiler, hier muß aber die Zeit gut an den verwendeten Taster angepasst werden. Mit Peda's Ansatz wird 4 mal abgetastet, jede Pegeländerung während des Zählzyklus für zum Neustart. Das kann man "sicher" nennen.
Hallo nochmals, hab es auf ein Attiny13 portiert, und was soll ich sagen, es funktioniert die PeDa-Lösung so wie ich es eigentlich ja auch haben wollte. Viel Zeit verwendet um das zu verwenden was eh schon optimal ist. Man lernt eben so auch dazu...., es ist tatsächlich so, wenn man das vollstänig begriffen hat was da steht, bzw. was da passiert, dann ist es eben bereits optimal. Gruß an alle und an "PeDa" extra nochmal! Gerald
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.