Forum: Mikrocontroller und Digitale Elektronik Display HD44780 mit 8051er


von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von g457 (Gast)


Lesenswert?

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.

von Dirk (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von Dirk (Gast)


Lesenswert?

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

von g457 (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von g457 (Gast)


Lesenswert?

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.

von Dirk (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Muss ich den Oszillator des 8051er für den Betrieb mit dem Display 
unbedingt auf 270kHz einstellen?

Gruß
Dirk

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

hier der Anhang für die Initialisierung

Gruß
Dirk

von Dirk (Gast)


Lesenswert?

Hat jemand zufällig ne funktionierende Initialisierung in Assembler für 
den HD44780?

Gruß
Dirk

von holger (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

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.

von Philipp B. (philippb)


Lesenswert?

Hallo Dirk,
wenn du mir deine Mail-Adresse schreibst, habe ich vielleicht was für 
dich!
Gruß, Philipp

von Klaus (Gast)


Lesenswert?

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?

von Dirk (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Hat jemand ein Programm welches mit dem HD44780 funktioniert?

MfG
Dirk

von Ralf (Gast)


Lesenswert?

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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

> 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

von g457 (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Nach welchem Ablaufdiagramm ist das Display zu initialisieren?

Was genau meinst du mit während der Initialisierung?

Gruß
Dirk

von Ralf (Gast)


Lesenswert?

> 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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ralf (Gast)


Lesenswert?

> 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

von Ralf (Gast)


Lesenswert?

> 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

von g457 (Gast)


Lesenswert?

> 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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

Und schon irgendwelche Zeichen auf dem Display zu sehen?

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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

von holger (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Die X sind dem Displaycontroller egal. ie restlichen findest du in der 
Beschreibung zu den Befehlen.

MfG Spess

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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.

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.