mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD geht bei Tastendruck aus


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bascom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
port falsch eingestellt

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal die Programmschleife ...

Autor: Hannes (Gast)
Datum:
Angehängte Dateien:

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

Autor: condi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du rufst in jeder Tastendruck-Subroutine lcd_clear auf.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Gast (Gast)
Datum:

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

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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"

...

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.