Forum: Mikrocontroller und Digitale Elektronik LCD verschiebt Text


von Robert S. (efyzz)


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

von Robert S. (efyzz)


Angehängte Dateien:

Lesenswert?

hier der Anhang...

von Uwe (Gast)


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

von Hannes L. (hannes)


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.

...

von Robert S. (Gast)


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!

von xyz (Gast)


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.

von xyz (Gast)


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.

von Robert S. (efyzz)


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...

von Hannes L. (hannes)


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.

...

von xyz (Gast)


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! :)

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.