Forum: Mikrocontroller und Digitale Elektronik LCD löscht Anzeige nicht komplett beim Wechsel


von ERT1 (Gast)


Lesenswert?

Hallo,

Habe ein Problem mit meinem 4x20 LCD EA DIP204.KONTROLLER KS0073.
Ich schreibe alles in einer Endlosschleife ins DDRAM.
Mein Problem: Beim wechseln der Anzeige lösche ich das Display. Es wird 
aber nicht ganz gelöscht. 1 bis 2 Zeichen von der vorherigen Anzeige 
stehen dann fälschlicherweise auf der aktuellen Anzeige.

Weiß wer Abhilfe?
LCD wird definitv gelöscht.
Muss ich extra das DDRAM noch löschen, wenn ja wie?

Danke
LG

von Wusel D. (stefanfrings_de)


Lesenswert?

Der Fehler liegt in Zeile 42.

Was heissen soll: Ohne Quelltext kann ich Dir nicht helfen.

Beantworte auch bitte folgende Fragen: Was meisnt Du mit "DDRAM" und 
"Anzeigenwechsel" und warum bist Du sicher, dass das LCD definitiv 
gelöscht wird?

Typischer Fehler ist, das Löschen des Displays bzw Puferspeichers zu 
vergessen:

Erste Ausgabge: "Du hast 1230 Punkte"
Zweite Ausgabe: "Du hast 23 Punkte"
Sichtbares Ergebnis: "Du hast 233Punktete"

von hilmar (Gast)


Lesenswert?

Zeig mal den Code für's Löschen.
Welcher Prozessor?
evtl. Schaltung?

> LCD wird definitv gelöscht.
Offensichtlich nicht, wenn noch Zeichen stehen bleiben...

Timingproblem?
Die meisten Befehle des Displays brauchen 39µs, das "Clear Display" und 
das "Home" brauchen 1,53ms, da ist fast die 40fache Zeit. Hast du das 
beachtet?
Kannst auch mit dem Busy Flag arbeiten, dann mußt du keine Zeiten 
beachten.

von spess53 (Gast)


Lesenswert?

Hi

>Ich schreibe alles in einer Endlosschleife ins DDRAM.

Woher?

>Beim wechseln der Anzeige lösche ich das Display.
>Muss ich extra das DDRAM noch löschen, wenn ja wie?

Wie löscht du das Display, wenn nicht durch Löschen des DDRAMs.

MfG Spess

von hilmar (Gast)


Lesenswert?

@stefan:
DDRAM ist im Display (Datenblatt)
und zum Löschen gibts einen Befehl, den meint er wahrscheinlich. Nicht 
das Überschreiben mit Leerzeichen.

von ERT1 (Gast)


Lesenswert?

Ja genau ich lösche das Display durch den Befehl.

von hilmar (Gast)


Lesenswert?

und die anderen Fragen? Schau mal auf das Timing, ob du nach dem "Clear 
Display" lange genug wartest...
Oder stell mal den Quellcode hier rein.

von ERT1 (Gast)


Lesenswert?

Ja ich habe dann nach dem LCD Clear befehl extra ganz lange 
Warteschleifen reingemacht. Hat aber keinen Unterschied gemacht.

Ja DDRAM ist im display und bezüglich Code reinstellen wird etwas 
schwierig, da dieser sehr groß ist.
Es wirklich nur ein dummes Wechseln der Anzeigen durch einen Taster. 
Manchmal löscht das Display alles und manchmal werden Buchstaben von der 
einen Anzeige zur anderen Anzeige übertragen blöderweise.

von spess53 (Gast)


Lesenswert?

Hi

>Manchmal löscht das Display alles und manchmal werden Buchstaben von der
>einen Anzeige zur anderen Anzeige übertragen blöderweise.

Dann dürfte der Fehler in deiner Endlosschleife liegen.

MfG Spess

von hilmar (Gast)


Lesenswert?

> extra ganz lange Warteschleifen reingemacht.
Wie lang ist "ganz lange"?

Wenn der Quelltext zu lang ist, dann mach einen Ausschitt, wo du 
löschst, wartest und neu schreibst. Es muß gehen.

von ERT1 (Gast)


Lesenswert?

Das wäre so ein Testprogramm, wobei ich hier nur die 2 Anzeigen 
programmiert habe.
Bei Tasterdruck wird Display gelöscht und auf die andere Anzeige 
geschalten.
Lange ist länger als 5ms. Habs schon mit einer halben Sekunde auch 
getestet.


Anzeige1:

ldi  temp1, 0b10000000  ;1ste Zeile DDRAM setzen
call  lcd_command
call  delay5ms

ldi     temp1,'A'
call    lcd_data


jmp Anzeige1


Anzeige2:

ldi  temp1, 0b10000000
call  lcd_command
call  delay5ms

call    leerzeichen
call    leerzeichen
call    leerzeichen
ldi     temp1,'B'
call    lcd_data

jmp Anzeige2


Anzeigenwechsel:

call  lcd_clear
call  delay5ms
ret

lcd_clear:

ldi     temp1,0b00000001   ; Display löschen
rcall   lcd_command
ret

von Karl H. (kbuchegg)


Lesenswert?

ERT1 schrieb:
> Ja ich habe dann nach dem LCD Clear befehl extra ganz lange
> Warteschleifen reingemacht. Hat aber keinen Unterschied gemacht.
>
> Ja DDRAM ist im display und bezüglich Code reinstellen wird etwas
> schwierig, da dieser sehr groß ist.

Dann speck ab soviel du kannst aber so, dass der Fehler noch sichtbar 
ist.

> Es wirklich nur ein dummes Wechseln der Anzeigen durch einen Taster.
> Manchmal löscht das Display alles und manchmal werden Buchstaben von der
> einen Anzeige zur anderen Anzeige übertragen blöderweise.

Es hilft aber nichts.
Keiner kann hier hellsehen. Ohne Code kann die kein Mensch helfen.

von ERT1 (Gast)


Lesenswert?

Programmierung soll jetzt nur veranschaulichen wie ich das geschrieben 
habe!
Also in der Form.

von Karl H. (kbuchegg)


Lesenswert?

ERT1 schrieb:
> Das wäre so ein Testprogramm, wobei ich hier nur die 2 Anzeigen
> programmiert habe.

Assembler?

Gerade dann ist es wichtig, ein vollständiges Programm zu haben!

Denn im schlimmsten Fall muss man das hier, auf dieser Seite des 
Bildschirms mal in einen µC brennen und laufen lassen, damit man die 
Details untersuchen kann.

von Karl H. (kbuchegg)


Lesenswert?

Zum Beispiel

> Anzeigenwechsel:
>
> call  lcd_clear
> call  delay5ms
> ret

geschieht dieses aus einem Interrupt heraus? Muss es wohl, denn das hier

Anzeige1:

  ....
  jmp Anzeige1

ist ja eine Endlosschleife.


Die Details sind wichtig. Die sieht man aber nur im kompletten Programm. 
Deine Vorstellung, dass da irgendwas mit dem Clear-Kommando des LCD 
nicht stimmt, ist auf jeden Fall keine korrekte Analyse. Das Problem 
liegt schon in deinem Programm. Und es muss nicht dort liegen, wo du 
vermutest.
Es kann auch sein, dass dein kompletter Programmaufbau diesen Fehler 
provoziert und es gar keine einfache Möglichkeit gibt, das zu beheben 
sondern dass ein Redesign notwendig ist.

von hilmar (Gast)


Lesenswert?

> Anzeige1:

> ldi  temp1, 0b10000000  ;1ste Zeile DDRAM setzen
> call  lcd_command
> call  delay5ms

> ldi     temp1,'A'
> call    lcd_data


> jmp Anzeige1

Übersetzt:
Kommando schicken -> warten -> Zeichen schicken -> Kommando schicken...
                                      /----------^---------\

Fällt dir was auf, was nach dem Zeichen schicken fehlt?

von ERT1 (Gast)


Lesenswert?

Eine Warteschleife?

von hilmar (Gast)


Lesenswert?

> lcd_clear:

> ldi     temp1,0b00000001   ; Display löschen
> rcall   lcd_command
> ret

Ach ja, und hier sehe ich gar keine Wartezeit.

von hilmar (Gast)


Lesenswert?

> Eine Warteschleife?
Richtig! :-)

von Karl H. (kbuchegg)


Lesenswert?

hilmar schrieb:
>> lcd_clear:
>
>> ldi     temp1,0b00000001   ; Display löschen
>> rcall   lcd_command
>> ret
>
> Ach ja, und hier sehe ich gar keine Wartezeit.

Dafür sehe ich vom ERT1 eine Aussage, die man interpretieren kann als: 
Das ist zwar nicht mein richtiger Code, sondern nur Code der so ähnlich 
aussieht aber doch ganz anders ist.


Ach wie habe ich das mittlerweile satt, dass man auf die Frager einreden 
muss wie auf eine kranke Kuh, bis sie endlich mal die einzig wahre 
Unterstützung zur Fehlersuche rausrücken: ihren tatsächlichen und 
richtigen Code - den der auch tatsächlich auf dem µC läuft.

von hilmar (Gast)


Lesenswert?

> Ach ja, und hier sehe ich gar keine Wartezeit.
Hatte ich übersehen, ist bei Anzeigewechsel drin (5ms).
Ist aber besser, direkt beim Befehl zu warten, also im Unterprogramm 
lcd_clear. Die Wartezeit gehört ja immer zum Befehl, den du schickst. 
Und so kannst du das nie vergessen, wenn der Befehl und das Warten 
gemeinsam aufgerufen werden.

von hilmar (Gast)


Lesenswert?

@Karl-Heinz: Wollte ich ja haben, war ihm aber zu lang.

@ERT1: Wenn der Quelltext zu lang ist, dann füge ihn nicht ein, sondern 
mach einen Anhang draus.
Und wie siehts aus mit der Pause zwischen "Zeichen schicken" und 
"Kommando schicken"?

von ERT1 (Gast)


Lesenswert?

Kommt leider noch immer vor, aber ich probier noch was aus.

Ich kann das Programm nicht schicken!

von hilmar (Gast)


Lesenswert?

> Ich kann das Programm nicht schicken!
Was heißt das? Willst du nicht oder bringst du es nicht?
Im ersten Falle wir dir hier wahrscheinlich keiner weiterhelfen.
Im zweiten Falle schau mal bei "Antwort schreiben" den Button 
"Durchsuchen" an bei "Dateianhang". Damit geht es. Einfach dein *.asm 
auswählen.

von hilmar (Gast)


Lesenswert?

Korrektur: ...wird dir hier...

von ERT1 (Gast)


Lesenswert?

Ok es funktioniert jetzt nachdem ich eine Warteschleife von einer halben 
Sekunde reingemacht habe.

Ist doch etwas sehr lang?

von spess53 (Gast)


Lesenswert?

Hi

>Ist doch etwas sehr lang?

Ja.

MfG Spess

von hilmar (Gast)


Lesenswert?

> Ist doch etwas sehr lang?
Ja, viel zu lang.

von Peter D. (peda)


Lesenswert?

Diese ganze Rumraterei ist doch völlig sinnlos.
Ohne einen exakten Code kann keiner helfen, Punkt!

Und erzähl nicht, daß Tasten + LCD super geheim ist, daß es Dir die 
Chinesen sofort wegkopieren und dicken Reibach damit machen.

von ERT1 (Gast)


Lesenswert?

Ja nur gehts da nicht nur um ein Display und Tasten!

Habe jetzt ein Testprogramm geschrieben und da funktioniert es 
einwandfrei. Werde jetzt nach und nach Programmstücke implementieren und 
schauen wo der Fehler ist.

von Peter D. (peda)


Lesenswert?

ERT1 schrieb:
> Habe jetzt ein Testprogramm geschrieben und da funktioniert es
> einwandfrei.

Nun, dann ist ja Deine Frage beantwortet, das LCD ist nicht defekt.

Ich würde generell große Projekte nicht in Assembler schreiben. Man hat 
dort ne ganze Latte an Fehlermöglichkeiten mehr, als z.B. in C.

von Wusel D. (stefanfrings_de)


Lesenswert?

Kleiner Tip:

Wenn ein Großes Programm nicht funktioniert, reduziere es auf den 
problematischen Teil. Meistens kommt man so schneller auf die 
Fehlerursache.

von ERT1 (Gast)


Lesenswert?

Ja das hab ich jetzt auch gemacht.
Hab auch den Fehler gefunden. Problem ist dass ich einen Timerinterrupt 
verwende um den Taster abzufragen. Wenn dieser dann sagt es ist gedrückt 
worden löscht er das Display. Nur die Abfrage wann der Displaywechsel 
vorgenommen werden soll findet nicht im Timerinterrupt danach statt 
sondern später irgendwann in der main schleife und somit wurde die alte 
Anzeige geschrieben und nachdem er merkt er muss jetzt Anzeige wechseln 
löscht er das Display nicht mehr.

Naja ich kann C nicht wirklich gut und nach dem ich das Projekt in 
Assembler angefangen hab bin auch nicht in C umgestiegen. Wusste auch 
gar nicht dass es so an Umfang bekommt.

LG

von Karl H. (kbuchegg)


Lesenswert?

ERT1 schrieb:
> Ja das hab ich jetzt auch gemacht.
> Hab auch den Fehler gefunden. Problem ist dass ich einen Timerinterrupt
> verwende um den Taster abzufragen. Wenn dieser dann sagt es ist gedrückt
> worden löscht er das Display. Nur die Abfrage wann der Displaywechsel
> vorgenommen werden soll findet nicht im Timerinterrupt danach statt
> sondern später irgendwann in der main schleife und somit wurde die alte
> Anzeige geschrieben und nachdem er merkt er muss jetzt Anzeige wechseln
> löscht er das Display nicht mehr.

Und genau deswegen bin ich darauf rumgeritten, das komplette Programm 
(oder zumindest ein vollständiges) zu sehen.
Denn genau sowas hab ich mir schon gedacht.
Das muss redesigned werden - so ist das Mist, aus einer naiven Annahme 
heraus geboren. Dein Problem lässt sich nun mal nicht 3 oder 4 
Anweisungen festmachen, sondern das Problem steckt im Aufbau des 
Programmes.

von Peter D. (peda)


Lesenswert?

Das LCD ist eine Ressource, die nicht reentrant ist. Es kann also immer 
nur eine Task zur Zeit darauf zugreifen.
Du mußt Dich also entscheiden, entweder nur Timerinterrupt oder nur 
Main.

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.