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
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
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.
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
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
..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
> 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
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
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.