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
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"
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.
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
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.
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
> 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.
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
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.
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.
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.
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.
> 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.
@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"?
> 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.
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.
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.
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.
Kleiner Tip:
Wenn ein Großes Programm nicht funktioniert, reduziere es auf den
problematischen Teil. Meistens kommt man so schneller auf die
Fehlerursache.
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
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.
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.