Mahlzeit, ich habe ein Problem bei der Inbetriebnahme eines LCD - Displays. Es handelt sich um folgendes Display: http://cgi.ebay.at/LCD-Display-HD44780-4x20-chr-20x4-Green-neg-Backlight-/170440870233?cmd=ViewItem&pt=Bauteile&hash=item27af114959 Der controller ist in diesem Display ist mit dem HD44780 angeblich zu 99% identisch. Ich hoffe, das ist kein Problem. Die Stromversorgung habe ich erfolgreich aufgebaut. Die Hintergrundbeleuchtung leuchtet und die Blöcke der Ersten und der Dritten Zeile sind zu erkennen. Ich versuche nun schon seit einigen Stunden erfolglos Zeichen auf diesem Display anzuzeigen. Bitte keine Links zu anderen Websites, ich habe schon einige durchstöbert. Sollte jemand ein fertiges Programm habe, teste ich dies auch gerne. Ich freue mich auf Deine Hilfe. Gruß Dirk
Die 2 schwarzen Balken bedeuten, wie du sicher schon weißt, dass der HD44780-kompatible Controller noch nicht richtig initialisiert wurde. Sofern du alles richtig angeschlossen hast, nehme ich an der Fehler liegt in der Initialisierungsroutine. Das häufigste Problem dabei sind die Timings, die eingehalten werden müssen. Man sollte auf jeden fall 15 ms nach dem Einschalten warten, bis man Daten an das Display schickt. Die anderen zeitlichen anforderungen stehen im Datenblatt. Hoffe ich konnte helfen
Laut Datenblatt ist da ein KS0066 (oder SPLC780) drin. Der ist nur ein bissche kompatibel mit dem HD44780, insbesondere die Initialisierung ist wohl komplett anders. SuFu im Forum liefert einige Treffer.
Ok, nun weiß ich, dass das richtig an die Stromversorgung angeschlossen wurde. Danke schon mal für deine Hilfe! Kann ich die Wartezeiten mit Zeitschleifen realisieren oder sollte ich dies mit Timer machen? Gruß Dirk
Dirk schrieb: > Kann ich die Wartezeiten mit Zeitschleifen realisieren oder sollte ich > dies mit Timer machen? Das bleibt dir überlassen. Beide Varianten führen zum Ziel.
Wunderbar. Ich habe nun auch einige Beiträge durchstöbert, jedoch hilft mir das nicht weiter. Hat bitte jemand ein Flussdiagram zur Initialisierung für den SPLC780 bzw. KS0066+ controller? Schade, dass dieser controller nicht zu 100% mit dem HD44780 kompatibel ist. Gruß Dirk
Das Datenblatt vom KS0066U gibts da [1], das vom SPLC780 (..in Version A1) daneben [2]. Die in diesen beiden Datenblättern angegebenen Initialisierungssequenzen sind sich recht ähnlich und unterscheiden sich erheblich von der des HD44780 [3]. Achtung auf fOSC und auf Warten-auf-Godot^W^H^Wnach-dem-Busy-flag. [1] http://www.datasheetarchive.com/pdf-datasheets/Datasheets-29/DSA-571983.html [2] http://www.datasheetarchive.com/pdf-datasheets/Datasheets-312/159663.html [3] http://www.datasheetarchive.com/pdf-datasheets/Datasheets-13/DSA-247674.html
Vielen Dank für deine Hilfe! Leider bin ich jetzt noch mehr verwirrt. Benötige muss ich bei meinem Display den controller KS0066+ und den SPLC780 initialisieren oder genügt da einer der beiden? Da ich im Display Bereich noch neuling bin, wäre es top wenn jemand dieses Display in Assember schon initialisiert hat und das Programm reinstellen könnte. Gruß Dirk
Dirk schrieb: > Benötige muss ich bei meinem Display den controller KS0066+ und den > SPLC780 initialisieren oder genügt da einer der beiden? Na du musst den initialisieren, der verbaut ist. Entweder KS0066+ oder SPLC780.
Mir ist eben noch aufgefallen, dass die Datenblätter leicht widersprüchlich sind: Beim KS0066 ist eine andere Sequenz drin als beim HD44780. Beim SPLC780 dagegen sind zwei (widersprüchliche) angegeben, nämlich sowohl die vom KS0066 als auch die vom HD44780.. vielleicht sollte man da noch etwas in den Details graben. Ich hab leider kein Display mit einem solchen Controller da (nur stapelweise "HD44780" - zumindest stand es so in der Beschreibung und der Algorithmus aus dem HD44780-Datenblatt funktioniert..), das würde mich nämlich echt interessieren, was denn dann jetzt richtig ist.. :-) Glücklicherweise sind die Sequenzen nicht lang, sollte also kein großes Problem sein, die nötigenfalls alle durchzuprobieren.
na toll ... Da hab ich mir wohl das richtige Display für einen Display - Anfänger ausgesucht^^ Leider konnte ich nicht herausfinden welcher controller sich im Display befindet(es steht nichts drauf) und im Datenblatt steht, nur, dass entweder der SPLC780 oder der KS0066+ KS0065(X4) verbaut ist. Gruß Dirk
Ich bin eigentlich immer mit der standard HD44780 Initialisierung gut klargekommen. Große Unterschiede konnte ich zu anderen LCDs nicht finden. Vielleicht ist Dein E-Impuls zu kurz, den würde ich mal auf 1µs verlängern. Peter
Muss ich den Oszillator des 8051er für den Betrieb mit dem Display unbedingt auf 270kHz einstellen? Gruß Dirk
Hat jemand zufällig ne funktionierende Initialisierung in Assembler für den HD44780? Gruß Dirk
Wenn du sagst an welchem Port dein Display angeschlossen ist und wie, kann ich dir ein Hex-File reinstellen. Wichtig dabei ist, das RW nicht auf GND angeschlossen ist sondern an einem Portpin, weil ich das Busyflag abfrage. Das Hex-File ist nur für den 4bit-Mode also ein Port.
Hallo Dirk, wenn du mir deine Mail-Adresse schreibst, habe ich vielleicht was für dich! Gruß, Philipp
Ach Herr je hab gerade deine Def gelesen und weiss jetzt das es P2 ist. Allerdings hast du den 8-bit mode. Aber trotzdem kannst das hexfile testen eben im 4bit-mode dazu müsste ich wissen welchen controller du einsetzt?
Hallo Klaus, ich verwende das F320 Kit von Silabs. Es ist nett, dass du mir das HEX - File zum Testen geben würdest, jedoch kann ich noch kein HEX - File lesen und ich möchte es auch verstehen. Könntest du bitte die work.asm Datei prüfen? Gruß Dirk
Hat jemand ein Programm welches mit dem HD44780 funktioniert? MfG Dirk
Hi Dirk, alle Programme werden mit dem Display funktionieren - aber nicht mit deinem Board. Warum? Erstens weil ein Programm immer auf ne spezielle Hardware geschnitten ist und unterschiedliche Ansätze verwendet (Timer oder Delayschleifen, 4/8-Bit Modus, etc.) und zweitens weil 99,9% der Programme, die du hier erhalten wirst für einen Standard-8051 und nicht für einen SiLabs-8051 geschrieben sind, die brauchen spezielle Initialisierungsroutinen etc. Andersrum ist es nun doch wirklich nicht schwer, die Initialisierung und ein paar Buchstaben aufs Display zu zaubern. Poste deinen Schaltplan, und den kompletten Code, den du bis jetzt hast. Ralf
> Andersrum ist es nun doch wirklich nicht schwer, die Initialisierung und > ein paar Buchstaben aufs Display zu zaubern. > Poste deinen Schaltplan, und den kompletten Code, den du bis jetzt hast. Ich habe gehofft, dass es keine Probleme gibt aber wenn man das zum ersten Mal macht ist es halt nicht so einfach ... Zum Schaltplan: Die Stromversorgung und die Kontrastspannung ist einigermaßen richtig eingestellt, da in der Ersten und der Dritten Zeile Blöcke zu sehen sind => die Initialisierung des Displays hat nicht richtig funktioniert Die Pins habe ich wie in der work.def beschrieben angeschlossen. Gruß Dirk
Das..
1 | INIT_LCD: |
2 | CLR RS |
3 | MOV PInOut,#38h |
4 | SETB EN |
5 | CLR EN |
6 | LCALL WAIT_LCD |
7 | CLR RS |
8 | MOV PInOut,#0Eh |
9 | SETB EN |
10 | CLR EN |
11 | LCALL WAIT_LCD |
12 | CLR RS |
13 | MOV PInOut,#06h |
14 | SETB EN |
15 | CLR EN |
16 | LCALL WAIT_LCD |
17 | RET |
..funktioniert so nicht. In der Doku stehts auch dick und fett eingeramt neben dem Ablaufdiagramm: "BF cannot be checked before this instrucion". Während der Initialisierung musst du ausdrücklich Zeit verwarten (oder vertimern, oder was-auch-immer, jedenfalls nicht BF lesen) (15ms nach dem Start, 4.1ms, 100µs, ..), erst danach knann man das BusyFlag zurücklesen. HTH
Nach welchem Ablaufdiagramm ist das Display zu initialisieren? Was genau meinst du mit während der Initialisierung? Gruß Dirk
> Ich habe gehofft, dass es keine Probleme gibt aber wenn man das zum > ersten Mal macht ist es halt nicht so einfach ... Das ist normal, keine Sorge. Hinterher machts klick :) Zu deiner Software: Gefährlich, Push-Pull-Mode für ein 5V-Display zu verwenden, und zusätzlich auch noch per BitBanging das Display zu betreiben... Ein Fehler bei der Ansteuerung, und es fließt... Ich würde eher dazu tendieren, dem Daten-/Controlbus des Displays Pull-Ups nach 5V zu spendieren und die entsprechenden Pins OpenDrain zu betreiben... Erweitere bitte mal deine Kommentare für INIT_LCD:, damit man sieht was dein Programm da macht (bzw. machen soll), ich hab grad keine Lust die Befehlstabelle für's Display durchzustöbern und zu dekodieren :) Ralf
Ich habe es gefunden und nochmal rauskopiert. Was bedeutet wait time > 40ms after VDD? VDD ist doch die Spannung vom Netzgerät für die Logik des Display. Gruß Dirk
> Nach welchem Ablaufdiagramm ist das Display zu initialisieren? Nach denen aus den für dich für dich zutreffenden Datenblättern: Beitrag "Re: Display HD44780 mit 8051er" > Was genau meinst du mit während der Initialisierung? Die Busy-Abfrage funktioniert erst nachdem eine bestimmte Anzahl an bestimmten Befehlen gesendet wurde, vorher kann man nur durch "Warten" sicherstellen, dass das Display bereit ist... Ralf
> Ich habe es gefunden und nochmal rauskopiert. Genau, und dort steht gleich beim ersten Befehl, dass das Busyflag ohne diesen Befehl nicht gültig ist. > Was bedeutet wait time > 40ms after VDD? > VDD ist doch die Spannung vom Netzgerät für die Logik des Display. Das heisst, dass das Display bei Einschalten der Versorgung einen eigenen Reset durchführt, der die angegebene Zeit dauert. Vorher mit dem Display zu reden bringt nix... Ralf
> Nach welchem Ablaufdiagramm ist das Display zu initialisieren? Ich würd man mit dem Ablaufdiagramm vom Datenblatt [1] vom HD44780 anfangen - zu jenem soll es ja kompatibel sein. Es gibt dort zwar auch den 'internen Reset' (nach dem scheinst Du dich gerichtet zu haben - allerdings darf man währenddessen auch nicht das BF abfragen!), den würde ich aber aussen vor lassen und mich an Abbildung 25 (PDF-Seite 46) halten. Das funktioniert auch dann, wenn die Stromversorgung nicht den Anforderungen für den internen Reset genügt. > Was genau meinst du mit während der Initialisierung? Naja also solange das Display halt initialisiert wird :-) [1] http://www.datasheetarchive.com/pdf-datasheets/Datasheets-13/DSA-247674.html
Ich habe die Ausgänge jetzt auf open Drain konfiguriert. Die Initialisierungsroutinen verstehe ich leider nicht richtig. Ich habe sie aus einem anderem Forum kopiert. Die Theorie zu den Display´s haben wir im Unterricht leider noch nicht durchgemacht, ich möchte aber unbedingt dass es funktioniert. Es wäre echt top wenn sich jemand die Zeit nehmen würde (ich benötige sonst wahrscheinlich noch ein paar wochen dafür^^) MfG Dirk
Dirk schrieb: > Es wäre echt top wenn sich jemand die Zeit nehmen würde > (ich benötige sonst wahrscheinlich noch ein paar wochen dafür^^) Hier wird dir niemand für Lau etwas programmieren. Mehr als Tips zur Fehlersuche und eventuelle Links zu ähnlichen Problemlösungen wirst du wahrscheinlich nicht bekommen. Mein Tip: Füge die für die Initialiserung notwendigen Pausen ein und du wirst sehen, sofern alles richtig verdrahtet, dass es funktioniert.
Ich behaupte mal ganz frech, dass du wesentlich zu schnell bist. Wenn ich mich recht erinnere, gelten bei den Displays Befehlsausführungszeiten von 10-100µs,bei einigen Befehlen sogar im ms-Bereich. Du hast hier einen SingleCycleCore mit fast 25MHz vor dir, das heisst deine Portansteuerung für EN beispielsweise generiert einen etwa 40ns langen Puls, das Datenblatt meines Displays sagt hierzu mindestens 450ns. > Die Initialisierungsroutinen verstehe ich leider nicht richtig. Ich habe > sie aus einem anderem Forum kopiert. Klar, dass das nicht geht, allein schon der erste Satz beisst sich mit dem zweiten, obwohl sie Hand in Hand gehen... VERSTEHEN bedeutet SELBER MACHEN. Sonst wird das nix. Und was ist so schwer dran, die Befehle nach der Reihenfolge aus dem Datenblatt mit dem richtigen Timing runterzupusten? ;) Oder mal andersrum gefragt: Was verstehst du nicht an dem, was du bisher hast? Vielleicht kommen wir auf die Art zum Ziel =) > Die Theorie zu den Display´s haben wir im Unterricht leider noch nicht > durchgemacht, ich möchte aber unbedingt dass es funktioniert. Dann MUSST DU ES AUCH VERSTEHEN. Jeder von uns hat's mit dem Datenblatt hinbekommen, du wirst das auch schaffen. Vorschlag: Du guckst jetzt mal nach deinem Timing bzgl. der EN-Pulse etc. und morgen schauen wir, was daraus geworden ist. Wenn es gar nicht klappt, dann mach eine Kopie des aktuellen Programmes, und füge zwischen jedem Befehl und jeder Ansteuerung der Zugriffsleitungen eine kleine Delayschleife ein. Für den Anfang kann sich so etwas als sinnvoll erweisen, um Timingfehlern auf die Schliche zu kommen. Danach wird ordentlich die Busyabfrage implementiert und die Signale mit ausreichend kurzer Dauer angesteuert, um die Geschwindigkeit zu optimieren. Ralf
Hier mal meine INIT Routine im 4 Bit mode. LCD_INIT: CALL LCD_Pause_15ms ; Warte nach dem die Stromversorgung angeschlossen wurde MOV A,#30h ; 8 Bit - Mode muss 3 mal gesendet werden CALL LCD_Intialisieren CALL LCD_Pause_4ms MOV A,#30h CALL LCD_Intialisieren CALL LCD_Pause_4ms MOV A,#30h CALL LCD_Intialisieren CALL LCD_Pause_4ms MOV A,#20h ; jetzt umschalten auf den 4 bit mode CALL LCD_Intialisieren CALL LCD_Pause_4ms MOV A,#_LCD_SetRE ;nur bei EADIP204-4 verwenden CALL LCD_Komando MOV A,#_LCD_ExtfuncSet ;nur bei EADIP204-4 verwenden CALL LCD_Komando MOV A,#_LCD_Schnitstellenbreite ; Funktion Set CALL LCD_Komando MOV A,#_LCD_AUS ; LCD-Display ausschalten CALL LCD_Komando MOV A,#_LCD_Loeschen ; LCD Löschen CALL LCD_Komando CALL LCD_Komando MOV A,#_LCD_Betriebsart CALL LCD_Komando MOV A,#_LCD_EIN CALL LCD_Komando RET
ne, leider noch immer nicht .... schön langsam verfalle ich ... die initialisierung scheint aber geklappt zu haben. im anhang mein aktuelles programm. es kann also nur noch eine Kleinigkeit sein denke ich Gruß Dirk
Deine initroutine ist immer noch Käse! Schu dir das Datenblatt genau an. http://www.mikrocontroller.net/attachment/83997/initialisierung.JPG Da steht das du 3 mal 30h senden musst. lcd aus Function Set Entry mode Set lcd an fertig!! LCD_init: ; warten, bis sich das Display initialisiert hat mov a,#50 LCD_init_sleepsometime: call LCD_ws djnz Acc,LCD_init_sleepsometime ; Steuercodes senden clr LCD_RS clr LCD_RW clr LCD_ENABLE ; setb enable mov a,#00101000b ; #00110000b = 30h call LCD_send_b setb LCD_ENABLE ; clr enable mit fallender Flanke übernahme clr LCD_ENABLE mov a,#00101000b ; #00110000b = 30h call LCD_send_b mov a,#1100b ; #00110000b = 30h call LCD_send_b call LCD_clear . . . ret
>es kann also nur noch eine Kleinigkeit sein denke ich Eher was grosses;) > mov a,#00101000b Das stellt den 4Bit Mode ein. So gehts das für 8Bit mov a,#00111000b
>>es kann also nur noch eine Kleinigkeit sein denke ich >Eher was grosses;) Und noch grösser: Das ist für den 4Bit Mode LCD_send: mov c,ACC.7 ; high-nibble ausgeben mov LCD_D7,c mov c,ACC.6 mov LCD_D6,c mov c,ACC.5 mov LCD_D5,c mov c,ACC.4 mov LCD_D4,c setb LCD_ENABLE call LCD_ws clr LCD_ENABLE ........
ja, ich habe vergessen bekannt zu geben dass ich den 4 bit mode verwendet habe. ich habe alles richtig angeschlossen(mehrmals überprüft) ich werde mich morgen nach der arbeit nochmal dran machen
möglicherweise habe ich es auch falsch angeschlossen. ich bin mir nicht sicher wo PIN 3 angeschlossen gehört. ich habe leider kein 20k potentiometer und weiß nicht welche spannung Vo ist. ich habe es an masse geschlossen. sobald ich auf 1V mit der kontrastspannung gehe, sind die blöcke nicht mehr so gut zu erkennen. Gruß Dirk
>ich habe es an masse geschlossen. sobald ich auf 1V mit der >kontrastspannung gehe, sind die blöcke nicht mehr so gut zu erkennen. Das ist völlig korrekt so.
ok, wunderbar:) ich möchte nun doch wieder den 8 bit modus versuchen ich bin gerade dabei die initialisierung durchzuführen, weiß aber nicht was die eingerahmten zeichen im flussdiagramm heißen. außerdem ist mir das mit der warteschleife größer als 15ms nach dem spannungsanlegen der logik. die Spannungsversorgung für die logik ist bei mir ständig eingeschalten. verursacht dies eventuell die probleme bei der initialisierung? MfG Dirk
Hi Die X sind dem Displaycontroller egal. ie restlichen findest du in der Beschreibung zu den Befehlen. MfG Spess
ich habe nun versucht das programm erneut im 8 bit modus zu initialisieren und zu starten, jedoch funktioniert es immer noch nicht ... hat jemand noch guten rat? Gruß Dirk
Deine Routinen sind immer noch für 4bit-mode ausgelegt und es fehlt auch LCD_Init Routine. Schau dir mal deine work.def an wo sendest du 8 bit. Wenn du schon den 8-bit mode verwendest dann bitte auch ein Byte zum LCD anden Port legen. Also D0 - D7 und dann EN auf low setzen. Grundsätzlich sagst du mit EN = High das Du Daten an den Port legen wirst. Mit EN = Low holt der LCD controller das Datenbyte ab. Danach etwas Zeit verstreichen lassen bis das LCD wieder bereit ist Daten zu empfangen.
moin moin, in Anhang ein Ausschnitt aus einem Prog für den F360 mit LCD als 8Bit Version. Sieh Dir das mal an. Mit Gruß Pieter
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.