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
@stefan: DDRAM ist im Display (Datenblatt) und zum Löschen gibts einen Befehl, den meint er wahrscheinlich. Nicht das Überschreiben mit Leerzeichen.
Ja genau ich lösche das Display durch den Befehl.
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.
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.
Programmierung soll jetzt nur veranschaulichen wie ich das geschrieben habe! Also in der Form.
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.
> 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?
> lcd_clear: > ldi temp1,0b00000001 ; Display löschen > rcall lcd_command > ret Ach ja, und hier sehe ich gar keine Wartezeit.
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"?
Kommt leider noch immer vor, aber ich probier noch was aus. Ich kann das Programm nicht 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.
Ok es funktioniert jetzt nachdem ich eine Warteschleife von einer halben Sekunde reingemacht habe. Ist doch etwas sehr lang?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.