Forum: Mikrocontroller und Digitale Elektronik Suche geeignete Entprellmethode


von Klaus (Gast)


Lesenswert?

Moin,
eines vorweg:
Ich habe den Artikel über Entprellung gelesen und auch schon einige 
vorgeschlagene Methoden (u.a. einige von Peter D.) ausprobiert. 
Scheinbar habe ich die richtige noch nicht gefunden bzw. war nicht in 
der Lage, sie entsprechend zu implementieren.

Denn leider scheinen die nicht auf meine Anforderung zu passen.

Im Prinzip geht es mir um folgendes, simples Vorhaben:

Eine LED soll solange leuchten, wie ein Taster gedrückt ist. D.h. ist 
der Taster für 1s gedrückt, leuchtet die LED 1s. Ist der Taster 5s 
gedrückt, leuchtet die LED 5s. Ohne Entprellroutine läuft das auch wie 
geschmiert. Nun möchte ich jedoch eine Entprellroutine implementieren.

Und genau dafür kann ich keine geeignete Methode finden, weil die 
Methoden meinem Verständnis nach auf einmaliges Drücken reagieren. 
Drücke ich den Taster einmal kurz, leuchtet die LED dauerhaft, bis ich 
den Taster ein weiteres mal drücke. Jedenfalls kam ich zu der 
Konklusion, als ich die Methoden ausprobiert habe.

Zudem muss ich gestehen, dass ich in uC Programmieren noch in den 
Anfängen stecke. Vielleicht/wahrscheinlich kann man die vorgeschlagenen 
Methoden ohne große Probleme zu meinem Vorhaben umändern, jedoch blicke 
ich durch viele der Methoden nicht durch. Habt deshalb bitte Nachsicht, 
wenn es eine für euch triviale Herausforderung zu sein scheint. Für mich 
ist es alles andere als trivial.

Meine konkrete Frage nun:
Welche Entprellroutine wäre für mein Vorhaben geeignet?


Danke und Gruß

von Joe S. (bubblejoe)


Lesenswert?

Du willst also nur, dass die LED leuchtet, wenn der Taster gedrückt ist?
Dann brauchst du nicht zu entprellen, setze die Ausgänge einfach gleich 
auf die Eingänge, fertig.

von Edson (Gast)


Lesenswert?

Joe B. schrieb:
> Du willst also nur, dass die LED leuchtet, wenn der Taster gedrückt ist?
> Dann brauchst du nicht zu entprellen, setze die Ausgänge einfach gleich
> auf die Eingänge, fertig.

Die Anforderung wird sicher noch etwas mehr beinhalten, sonst könnte man 
ja gleich den ganzen uC einsparen, du Spezialist. ;)

von Edson (Gast)


Lesenswert?

@Klaus

Du fragst halt die (für dein Vorhaben) falschen Informationen der 
Entprellroutine ab. Irgendwo befindet sich ein Flag (oder Bit), das nur 
den entprellten Zustand einer Taste enthält - und das musst du abfragen. 
Anscheinend holst du ein Bit, das mit jedem aktiv-werden des Debounce- 
(Entprell-)Flag den Zustand wechselt. Diese Funktion ist aber schon eine 
Ebene höher als die eigentliche Entprellung.

von Hans (Gast)


Lesenswert?

Hi,
Joe B. schrieb:
> Du willst also nur, dass die LED leuchtet, wenn der Taster gedrückt ist?
> Dann brauchst du nicht zu entprellen, setze die Ausgänge einfach gleich
> auf die Eingänge, fertig.

nun ja, die LED ist erstmal das Mittel zum Zweck, da ich noch in den 
Anfängen stecke. Später will ich z.B. ein LCD anschließen, das mir 
angibt, wie oft ich auf den Taster gedrückt habe etc.

Für solche Sachen sollte doch wohl eine Entprellung empfehlenswert sein, 
oder?

von Karl H. (kbuchegg)


Lesenswert?

Klaus schrieb:
> Moin,
> eines vorweg:
> Ich habe den Artikel über Entprellung gelesen und auch schon einige
> vorgeschlagene Methoden (u.a. einige von Peter D.) ausprobiert.

Wenn hast du den Artikel
Entprellung
gelesen?

Ich hab vor ein paar Tagen in den C-Komfortroutinen noch die Funktion 
get_key_state nachgereicht, die genau das macht, was du willst.
Sie liefert dir (entprellt) die Information, ob eine Taste gedrückt ist 
oder nicht.
Verwendet wird sie genau gleich wie get_key_press

von Hans (Gast)


Lesenswert?

Edson schrieb:
> @Klaus
>
> Du fragst halt die (für dein Vorhaben) falschen Informationen der
> Entprellroutine ab. Irgendwo befindet sich ein Flag (oder Bit), das nur
> den entprellten Zustand einer Taste enthält - und das musst du abfragen.
> Anscheinend holst du ein Bit, das mit jedem aktiv-werden des Debounce-
> (Entprell-)Flag den Zustand wechselt. Diese Funktion ist aber schon eine
> Ebene höher als die eigentliche Entprellung.

Hi,
danke. Ich werde die zahlreichen Routinen noch mal durchgehen und 
versuchen die zu verstehen. Beim letzteren hapert es wohl :D
Hätte ja sein können, dass sich schon mal jemand mit genau meinem 
Problem befasst hat und hier irgendwo ein Codeschnipsel dazu rumfliegt.

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:

> nun ja, die LED ist erstmal das Mittel zum Zweck, da ich noch in den
> Anfängen stecke. Später will ich z.B. ein LCD anschließen, das mir
> angibt, wie oft ich auf den Taster gedrückt habe etc.

Das ist ist dann aber wieder ein Fall für get_key_press


Du musst anfangen zu unterscheiden zwischen
 * ist eine Taste jetzt gerade gedrückt
 * wurde die Taste nieder gedrückt

Das sind 2 Paar Schuhe!

Das erste ist dann interessant, wenn eine Aktion laufen soll SOLANGE 
eine Taste gedrückt ist (zb. Rollomotor soll laufen, solange eine Taste 
gedrückt ist).
Das zweite hingegen ist dann interessant, wenn der reine Vorgang, DIE 
AKTION des Niederdrückens wichtig ist und es unerheblich ist, wie lange 
der Benutzer auf die Taste drückt. Einmal Niederdrücken -> eine Aktion. 
Zb. einmal Drücken -> Licht an. Noch ein mal Drücken -> Licht aus

Das erste ist ein Fall für get_key_state.
Das zweite ist ein Fall für get_key_press

Entprellung

von Hans (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>
> Wenn hast du den Artikel
> Entprellung
> gelesen?
>
> Ich hab vor ein paar Tagen in den C-Komfortroutinen noch die Funktion
> get_key_state nachgereicht, die genau das macht, was du willst.
> Sie liefert dir (entprellt) die Information, ob eine Taste gedrückt ist
> oder nicht.
> Verwendet wird sie genau gleich wie get_key_press

Ich habe den Artikel gestern gelesen. Okay, ich muss mich entschuldigen. 
Die Komfortroutine habe ich nämlich nicht weiter beachtet, weil ich die 
recht unübersicht fand mit viel Code. Allerdings werde ich mich jetzt 
mit der intensiver beschäftigen.

Vielen Dank

von Hans (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das ist ist dann aber wieder ein Fall für get_key_press
>
>
> Du musst anfangen zu unterscheiden zwischen
>  * ist eine Taste jetzt gerade gedrückt
>  * wurde die Taste nieder gedrückt
>
> Das sind 2 Paar Schuhe!
>
> Das erste ist dann interessant, wenn eine Aktion laufen soll SOLANGE
> eine Taste gedrückt ist (zb. Rollomotor soll laufen, solange eine Taste
> gedrückt ist).
> Das zweite hingegen ist dann interessant, wenn der reine Vorgang, DIE
> AKTION des Niederdrückens wichtig ist und es unerheblich ist, wie lange
> der Benutzer auf die Taste drückt. Einmal Niederdrücken -> eine Aktion.
>
> Das erste ist ein Fall für get_key_state.
> Das zweite ist ein Fall für get_key_press
>
> Entprellung

Aaaah, mein Kopf raucht :D

Ich werde das verinnerlichen. Vielen Dank für eure Hilfe/Geduld.

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:
> Ich habe den Artikel gestern gelesen. Okay, ich muss mich entschuldigen.
> Die Komfortroutine habe ich nämlich nicht weiter beachtet, weil ich die
> recht unübersicht fand mit viel Code. Allerdings werde ich mich jetzt
> mit der intensiver beschäftigen.

Der Code ist nicht trivial.
Und in diesem Fall ist es ausnahmsweise ok, wenn man das was in der ISR 
vor sich geht nicht versteht. Dazu funktioniert der Code einfach zu gut. 
Lass dich nicht von den Leuten irre machen, die sagen man darf nur Code 
verwenden, den man auch versteht. Das ist zwar im Allgmeinen richtig, es 
gibt jedoch auch Ausnahmen. Die wenigsten von denen verstehen, was in 
einem TCP/IP Stack vor sich geht und doch benutzen sie eine Socket 
Library ohne Hemmungen.

Die Übernahme in eigenen Code ist allerdings wieder relativ trivial.
Du brauchst auf jeden Fall erst mal einen Timer. Der wird so 
eingestellt, dass eine ISR im Millisekundenbereich aufgerufen wird. 
Peter verwendet dazu 10 Millisekunden - tatsächlich ist diese Zeit aber 
nicht kritisch. Wenn sie sich im Bereich 5 bis ca. 20 Millisekunden 
bewegt, dann passt das schon.

Hast du den Timer, mit seinen regelmässigen Interrupt Aufrufen am 
laufen, dann gehts weiter
* die #define für die Tasten erst mal übernehmen
* den Teil aus der ISR in deine eigene ISR kopieren
  (wobei ich die Zeile mit dem Timer-Reload weglassen würde. Denn
   du hast ja den Timer vorher schon auf deine Millisekunden
   eingestellt - wie auch immer du das gemacht hast. Eventuell sogar mit
   der Reload Technik)
* die restlichen Funktionen übernehmen
* die #define konfigurieren, so dass sie deiner Hardware entsprechen
* in der main() die Init Funktion aufrufen
* im restlichen Programm die Funktionen je nach Bedarf verwenden



Im einfachsten Fall allerdings, nimmst du das abgedruckte Beispiel 
einfach her, passt es an deine Hardware (und Taktfrequenz) an, testest 
das erst mal und entwickelst daraus dann dein eigentliches Programm. 
Speziell beim ersten mal wird das der einfachere Weg sein, und wenn du 
dann schon ein wenig Erfahrung mit dem Code gesammelt hast, ist es dann 
auch leichter den umgekehrten Weg zu gehen und die Entprellung in dein 
eigenes Programm einzubauen.

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:

> Aaaah, mein Kopf raucht :D


Was gibts da zu rauchen?
Hast du doch schon tausend mal gemacht.

Wenn du beim Nachbarn an der Tür klingelst, dann bimmelt die Klingel 
SOLANGE du auf den Knopf drückst.

Wenn du im Stiegenhaus das Licht andrehen willst, dann tippst du einmal 
den Taster an und das Licht geht an.

Das eine mal: SOLANGE
Das andere mal: einmal NIEDERDRÜCKEN

Ja, so ist das, wenn man programmieren anfängt. Mit einem mal bemerkt 
man Dinge in der Welt um uns, die uns vorher noch nie aufgefallen sind 
und beginnt sich darüber Gedanken zu machen, was wir da eigentlich tun 
und was die kleinen, feinen Unterschiede sind, die wir bisher nicht 
beachtet haben, die uns aber in Fleisch und Blut übergegangen sind.

von Bronco (Gast)


Lesenswert?

Vielleicht darf ich anmerken, daß Entprellen lediglich bedeutet, daß 
Signale, die kürzer als eine gewisse Zeitdauer anliegen, unterdrückt 
werden.
Der Sinn ist, daß eine Aktion, die einmalig ausgeführt werden soll, 
nicht aufgrund von "Prellen" ungewollt mehrfach ausgeführt wird.

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.