Forum: Mikrocontroller und Digitale Elektronik Wieder mal Tastenabfrage geht das auch so?


von Gerald S. (pcgerald63)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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.

von Gerald S. (pcgerald63)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gerald S. (pcgerald63)


Lesenswert?

OK, habt mich überzeugt...

von Joachim (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Michal (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

> 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)

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Gerald S. (pcgerald63)


Lesenswert?

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

von Michal (Gast)


Lesenswert?

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

von NurEinGast (Gast)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

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?

von Gerald S. (pcgerald63)


Lesenswert?

bzw. den jeweiligen Spannungswert halt einfach übernehmen der dann zu 
Testzwecken zB. aufs LCD-Display ausgegeben werden kann.

Gerald

von Gerald S. (pcgerald63)


Lesenswert?

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.

von Gerald S. (pcgerald63)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

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.

von Gerald S. (pcgerald63)


Lesenswert?

Ich denke mal das dann in diesen Fall 2ms für nicht mehr so gute Tasten 
zu kurz sein werden.

von Gerald S. (pcgerald63)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

>
> 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

von Oh weh... (Gast)


Lesenswert?

> Ich dachte eher an nur ein Timer für alle Tasten gemeinsam zu verwenden

Jeder Taster braucht aber sein eigenes Zeitfenster...

von Gerald S. (pcgerald63)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von screwdriver (Gast)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von screwdriver (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

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.

von P. S. (Gast)


Lesenswert?

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.)

von Peter D. (peda)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Angehängte Dateien:

Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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?

von Gerald S. (pcgerald63)


Lesenswert?

Ja genau... es wird mit jeden Preller der Timer zurückgesetzt.
Gerald

von Karl H. (kbuchegg)


Lesenswert?

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!)

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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

von Gerald S. (pcgerald63)


Angehängte Dateien:

Lesenswert?

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

von Gerald S. (pcgerald63)


Angehängte Dateien:

Lesenswert?

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ß

von Hannes Lux (Gast)


Lesenswert?

> 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... ;-)

...

von Gerald S. (pcgerald63)


Lesenswert?

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

von Hannes Lux (Gast)


Lesenswert?

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

...

von Gerald S. (pcgerald63)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von P. S. (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Gerald S. (pcgerald63)


Lesenswert?

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
Noch kein Account? Hier anmelden.