Hallo an alle! Ich befinde mich gerade vor einem Phänomen welches ich mir nicht erklären kann. Ich habe ein LCD an einen Tiny angeschlossen. Funktioniert auch alles tadellos, sprich ich kann drauf schreiben. Jetzt habe ich ein paar Tasten angeschlossen auf dessen Druck ein Text für jede Taste ausgegeben wird. Funktioniert auch, nur habe ich bemerkt, dass wenn ich eine Taste gedrückt halte, das LCD geleert wird und sobald ich loslasse der neue Text erscheint. Das Program ist simple: Initialisierungen und in einer endlos Schleife die Portpins einlesen. Wurde eine Taste gedrückt wird ein text ausgegeben und ab zurück in die endlos Schleife. Kann es sein dass bei gedrückter Taste dem LCD der Strom weggesaugt wird oder sowas? Denn normalerweise hält das LCD ja den zuletzt geschickten Text auf dem Bildschirm. Ich versteh's nicht.
Hier ist ein "Extrakt" mit dem (hoffe ich) nötigsten. Seid nicht zu hart mit mir, ich bin ein Neuling :S
Hm, was passiert wenn du eine Taste drückst->der überprüft welche gedrückt wurde und gibt das dann aus. Dann springt der in Main. -> oh Taste gedrückt -> ausgabe und das immer und immer wieder. Das Display kommt mit anzeigen einfach nicht nach würde ich jetzt mal meinen bzw. du siehst es nicht. Condi
Gast wrote:
> Du rufst in jeder Tastendruck-Subroutine lcd_clear auf.
Das ist aber nicht die wirkliche Ursache... ;-)
Deine Tastenabfrage hat keine Flankenerkennung und auch keine
Entprellung. Dadurch wird die zum Tastendruck gehörige Routine (in der
auch lcd_clear aufgerufen wird) so lange immer wieder aufgerufen, bis
der Taster losgelassen wurde.
Abhilfe schafft eine vernünftige Tastenabfrage im Timer-Interrupt (oder
zumindest per Timer-Interrupt synchronisiert), die über eine
Flankenerkennung verfügt und ganz nebenbei auch noch über eine
Entprellung. Such' mal in der Codesammlung (Betreffsuche) nach
"bulletproof", das dort vorgestellte Konzept lässt keine Wünsche mehr
offen.
...
> Das ist aber nicht die wirkliche Ursache... ;-)
Äääh ja, ich hatte die Frage falsch verstanden. ;-)
Hier ist ein einfaches Beispiel für die Benutzung der Tastenentprellung: http://www.mikrocontroller.net/attachment/23861/8pwm3.txt Der zugehörige Diskussionsthread ist hier: Beitrag "MENÜ-STEUERUNG" ...
Danke für die Antworten! Was ihr sagt leuchtet mir ein. Ich werde mich mal dran machen und probieren das ganze per Flankenerkennung auszuwerten. Die Code Beispiele nehm ich vielleicht als Referenz aber die so direkt zu kopieren und versuchen in mein Program einzuflicken erscheint mir doch auf Anhieb etwas zu kompliziert (obwohl es vielleicht doch nicht so schwer ist). Zudem hoffe ich auch etwas dazu zu lernen wenn ich's erst mal selber versuche. Vielen Dank nochmals und ich melde mich wieder wenn ich wieder feststecke ;-)
Hannes wrote: > Danke für die Antworten! > Was ihr sagt leuchtet mir ein. Ich werde mich mal dran machen und > probieren das ganze per Flankenerkennung auszuwerten. Die Code Beispiele > nehm ich vielleicht als Referenz aber die so direkt zu kopieren und > versuchen in mein Program einzuflicken erscheint mir doch auf Anhieb > etwas zu kompliziert (obwohl es vielleicht doch nicht so schwer ist). Guter Ansatz. Ich benutze auch keinen fremden unverstandenen Code. ;-) > Zudem hoffe ich auch etwas dazu zu lernen wenn ich's erst mal selber > versuche. Richtige Einstellung. Ich hatte das Beispiel ja auch hauptsächlich zum Analysieren der Funktionsweise genannt. Kurze Erklärung: Die Tastenentprellung braucht neben einem temporär genutztem Register 4 eigene Register. Drei davon können "untere" Register sein, für das Key_press-Register (heißt bei mir "tfl" wie Tastenflags) nehme ich aber gerne ein oberes Register, um es mit cbr bitweise löschen zu können. Das Einlesen und Entprellen der Tasten erfolgt im Timer-Interrupt alle 4 bis 25 Millisekunden, der entprellte Tastenzustand der bis zu 8 Taster steht im Register Key_state (bei mir "tas" wie Tastenstatus). Dieser "Zustand" kann ggf nützlich sein, wenn man eine "Shift-Taste" abfragen will. Die Flankenerkennung (Taste wurde erneut betätigt) setzt das zum Taster zugehörige Bit im Register Key_press (tfl), wenn der Taster erneut (min. 4 Interrupt-Runden lang) gedrückt wurde, zuvor aber (min. 4 Int-Runden lang) losgelassen war. Das Hauptprogramm muss dann nur noch (gelegentlich) die Tastenflags (Key_press bzw. tfl) abfragen. Ist eines gesetzt, so wird zu der Routine verzweigt, die die zur Taste gehörende Arbeit verrichtet. Diese löscht dann das entsprechende Tastenflag, damit der Job nur einmal pro Tastendruck erledigt wird. Ich hänge mal noch ein Beispiel an, was die Einzelabfrage mehrerer Taster etwas deutlicher zeigt. > Vielen Dank nochmals und ich melde mich wieder wenn ich wieder > feststecke ;-) Viel Erfolg ...
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.