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ß
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.
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. ;)
@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, 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?
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
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.
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
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.