Forum: Mikrocontroller und Digitale Elektronik LCD geht bei Tastendruck aus


von Hannes (Gast)


Lesenswert?

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.

von bascom (Gast)


Lesenswert?

port falsch eingestellt

von Gast (Gast)


Lesenswert?

Zeig mal die Programmschleife ...

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist ein "Extrakt" mit dem (hoffe ich) nötigsten. Seid nicht zu hart 
mit mir, ich bin ein Neuling :S

von condi (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Du rufst in jeder Tastendruck-Subroutine lcd_clear auf.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Gast (Gast)


Lesenswert?

> Das ist aber nicht die wirkliche Ursache... ;-)

Äääh ja, ich hatte die Frage falsch verstanden. ;-)

von Hannes L. (hannes)


Lesenswert?

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"

...

von Hannes (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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