LCD löscht Anzeige nicht komplett beim Wechsel

Gast #3173730
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
#3173737
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"
Gast #3173739
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.
Gast #3173740
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
Gast #3173749
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.
Gast #3173760
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
Gast #3173776
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
#3173777
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.
#3173782
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.
#3173786
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.
Gast #3173793
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?
#3173809
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.
Gast #3173813
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.
Gast #3173815
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"?
Gast #3173835
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.
Gast #3174010
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.
Gast #3174774
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
#3174787
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren