www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD verschiebt Text


Autor: Robert S. (efyzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frohe Ostern!

Ich nutze einen AT89S8252 mit einen 2x16 LCD-Display von Reichelt
(HD44780 kompatibel).
Das ganze ist eine Art Schaltuhr.
So kann ich zb. mehrere Anzeigemodi umschalten:
Modus 1:
1. Zeile "Uhrzeit 17:23:04"
2. Zeile " Mo, 17.04.2006 "

Modus 2:
1. Zeile "Uhrzeit stellen:"
2. Zeile "17:23:04        "

Modus 3:
1. Zeile "Datum stellen:  "
2. Zeile "Mo, 17.04.2006  "

usw...

Die erste Zeile beginnt also immer mit Text, danach folgen Zahlenwerte,
die im RAM des Controllers liegen.

Problem ist nun, dass sich beim Moduswechsel der Text in der ersten
Zeile ab und zu nach links oder rechts verschiebt.
Die Zahlenwerte und alle anderen Zeichen sind jedoch immer an der
richtigen Stelle.

Jeder Modus beginnt mit dem Löschen des gesamten displays.
Ich habe schon versucht, vor der Textausgabe den Cursor nochmal auf
Position 00 zu schieben, aber das nützt auch nichts.

Als Anhang die Display-Ansteuerung, die allerdings nicht von mir
stammt. Teile, die ich nicht brauche, habe ich auskommentiert.

Die Ausgabe eines Textes sieht dann im Programm so aus:

mov  dptr,#Textuhr  ;Adresse des DB in DPTR
lcall  textaus          ;Unterprogramm "Text ausgeben" aufrufen

Autor: Robert S. (efyzz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier der Anhang...

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Habe jetzt dein Progr.nicht studiert, aber das Löschen deines Displ.
dauert recht lange im Gegensatz zum Schreiben. Wenn dein nächter
Zugriff zu schnell erfolgt entsteht halt sowas. Habe Das Thema auch
gerade hinter mir. Die 2.Zeile stimmt übrigens deshalb, weil du
bestimmt eine neue Schreibadresse sendest.

Viel Erfolg, Uwe

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lösche das LCD meist durch Positionieren des Schreibcursors und
Überschreiben mit neuem Text bzw. mit Leerzeichen. Das geht schneller
als das Clear-Kommando. Clear und Home meide ich.

...

Autor: Robert S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!
Zuerst habe ich es mit einem delay nach jedem lösch-befehl versucht,
das zeigte aber keinen Erfolg.
Also überschreibe ich jetzt zuerst immer alles mit Leerzeichen.
Das funzt astrein!

Das einzige, was mich jetzt noch wundert:
Nach Programmstart sieht man förmlich, wie das Display Zeichen für
Zeichen schreibt.
Sobald ich aber die Uhrzeit stelle (Modus2) läuft das Display wieder
"unsichtbar" schnell.
Also nicht allein durch das Modus-wechseln, sondern durch das Uhr
stellen an sich...
Aber das ist wohl eine Sache, bei der ich mir nur selbst helfen kann.
(Man gut, dass ich morgen noch Urlaub habe ;))

Also vielen Dank nochmal!

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin
@Robert

Mir ist noch Aufgefallen das Du dein PSW bei Lcall aufrufen nicht
sicherst. Dies könnte für ungewöhnliche Seiteneffekte sorgen.

Ist ein böser Fehler vor allem wenn Du mit Registern Arbeitest zudem
wird das PSW verändert bei Unterprogrammaufrufe und kann
Ärgerverusachen.

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Robert

Du solltest bei LCDbefehl das wbusy auch nach dem senden des
High-Nibbel abfragen da ja, das Display etwas Zeit brauch um neue Daten
zu übernehmen und zwar jedesmal wenn Zeichen oder Befehle gesendet
werden.

Autor: Robert S. (efyzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend!
Bei jedem LCALL das PSW sichern? uiuiui... ich hab da bestimmt an die
100 von, auch sehr verschachtelt. Bisher läuft ja alles...

das mit dem lcdbefehl guck ich mir nochmal an. der programmteil stammt
wie gesagt nicht von mir. fange erst langsam an, das ganze zu
verstehen...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du solltest bei LCDbefehl das wbusy auch nach dem senden des
> High-Nibbel abfragen da ja, das Display etwas Zeit brauch um neue
> Daten
> zu übernehmen und zwar jedesmal wenn Zeichen oder Befehle gesendet
> werden.

Also davon ist mir nichts bekannt, meine 4-Bit-LCD-Routinen (auf AVR)
laufen ohne Wartezeit oder Busywait zwischen den Nibbles.

Bei HD44780-Kompatiblen dauert lediglich DISPLAY-CLEAR und RETURN-HOME
etwas länger, alle anderen Zugriffe gehen schnell. Um Wartezeiten
(Busywait) zu vermeiden, erfolgt bei mir in letzter Zeit die Ausgabe
eines Zeichens aus dem Ringbuffer (256 Byte) im Interrupt etwa alle
1ms. Die Printroutinen schreiben dann nur in den Ringbuffer, was ja
keine Wartezeit kostet.

...

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes!

Bei meinem HD44780 Kompatiblen frage ich (Busywait) nicht ab sondern
mache das Timing selber ohne Interrupt.

Ich habe bei mir festgestellt, das nachdem Enable erzeugt wurde, es
besser ist eine kleine weile zuwarten bevor neue Daten am LCD-Display
angelegt werden.

Nichts desto Trotz soll jedermachen wie er es für richtig hält
Hauptsache es funzt! :)

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.