Forum: Mikrocontroller und Digitale Elektronik 4x20 LCD HD44780 probleme


von Andreas Palm (Gast)


Lesenswert?

Hallo!

Habe ein Problem:

Wenn ich das Display wie im Tutorial beschrieben verkabele, dann ist
das Datenbit6 immer auf high! Auch wenn das Display nur mit Strom
versorgt wird und nicht mit dem µC verbunden ist. Dadurch kann ich
natürlich keine Befehle senden, weil bit 6 und (im zweiten nibble) bit
2 immer high ist. Alle anderen Datenpins und auch die RS, RW, EN sind
open, so wie es ja auch sein sollte, oder???

Bin ich zu blöd dafür, oder gibts es da etwas was ich wissen müsste?

Hat da jemand einen Tipp???

Gruß
Andi

von Andreas Palm (Gast)


Lesenswert?

Hat niemand eine Idee diesbezüglich?

Ich hab einfach mal nen Pulldown dran gehangen... danach konnte der µC
das LCD ansteuern, aber sehr ungenau... teilweise werden die Befehle
von LCD falsch verstanden! und zwar genau an bit 2 oder bit 6 liegt
dann der falsche wert grrrr

Ist vielleicht der HD44780 defekt?

Hab leider kein zweites LCD zum testen da :(

Gruß
Andi

von Simon K. (simon) Benutzerseite


Lesenswert?

Sind deine Leitungen zum LCD zu lang? Hast du mal das Timing am
Controller etwas langsamer gemacht? HD44780's sind nicht die
schnellsten..

von Andreas Palm (Gast)


Lesenswert?

Hi!

Zunächst mal danke für deine Antwort

Timing habe ich auch schonmal langsamer gemacht, bringt nüscht.
Leitungen zum LCD sind momentan gerade mal 5cm... da dürfte es
eigentlich nicht dran liegen, oder?

Aber das mit dem Timing löst ja auch nicht das Problem mit dem
6.Datenbit (immer high). Das mit dem Pull-Down ist doch nicht üblich,
oder doch? Hab ich noch nirgends gesehen!

von Simon K. (simon) Benutzerseite


Lesenswert?

Is nich üblich, Welcher Controller? Wie angeschlossen?

von Thomas K. (thkais)


Lesenswert?

Das ist nicht normal. Wenn Du einen Verdrahtungsfehler ausschließen
kannst, ist das LCD wahrscheinlich defekt.

von Andreas Palm (Gast)


Lesenswert?

Also einen Verdrahtungsfehler kann ich außschließen, denn wie oben
schonmal beschrieben sind wenn ich nur gnd, vcc und vee anschließe alle
datenleitungen und die RS, RW, EN open (liegen so zwischen 0,5 und 2V),
außer die datenleitung6: die liegt auf 5V.

Da ist ein KS0076B/KS0063, HD44780 kompatibel drauf! (Display von
reichelt). Da ist halt nur dieser schwarze Kunststoff drüber, so dass
man den chip selber nicht sehen kann!

von Peter (Gast)


Lesenswert?

Hi Andreas,

bei R/W ist Low = Write als bei Open Read und da kann was rauskommen.
E(nabel) ist ja freigegeben. Leg mal RS,RW,E auf low.

Gruß Peter

von Andreas Palm (Gast)


Lesenswert?

Hallo!

Das ist eine gute Idee, bringt aber leider nix :)

Auch wenn ich die drei auf low lege bleibt die DB6 auf high :(

von Leenders (Gast)


Lesenswert?

Schon mal mit Pullup Widerständen versucht?

Paul

von Läubi (Gast)


Lesenswert?

Eventuell Aktiviertes JTAG o.ä?

von Klaus (Gast)


Lesenswert?

Hi!

Also ich habe mein HD44780 fest im vier Bit Modus angeschlossen d.h.
nur das High-nibble.

Bei angelegter Spannung  LCD  5V Pin 1 und 2 hab ich folgendes
gemessen:

Pin 4 RS = High
Pin 5 R/W = High
Pin 6 E   = LOW

von Klaus (Gast)


Lesenswert?

Verdammt bin hab ausversehen Submit gedrückt!

Also ich habe mein HD44780 fest im vier Bit Modus angeschlossen d.h.
nur das High-Nibble und RS,R/W,E .

Bei angelegter Spannung  LCD  5V Pin 1 und 2 hab ich folgendes
gemessen:

Pin 4 RS = High
Pin 5 R/W = High
Pin 6 E   = LOW
Pin 7-11 (DB0-DB4)= Low
Pin 12 (DB5)= High
Pin 13 (DB6) = LOW
Pin 14 (DB7) = LOW

Also dein LCD sollte also Funzen wenn deine Initalisierungs-Sequenz
stimmt.

Sollte es trotzdem nicht gehen einfach umtauschen.

Gruß Klaus

von Klaus (Gast)


Lesenswert?

Ach ja!
ich hoffe Du hast dein LCD richtig angeschlossen!

bei der 8 Bit Version brauchste den ganzen Port + Steuersignale

bei der 4 Bit Version nur ein Port aber das Low-Nibble des Ports muss
mit dem High-Nibble am Display verbunden werden.


Die Steursignale werden mit dem High-Nibble am selben Port ausgegeben.

Ich denke das ist dir ja bekannt!

Gruß Klaus

von Andreas Palm (Gast)


Lesenswert?

Zunächst mal danke an alle, die geholfen haben, aber ich habe das
Problem nun gelöst:

Ein Kurzschluss auf der LCD-Platine durch einen "Lötzinn-Flocken" der
sich zwischen LCD und Platine festgeklemmt hat... das muss man erstmal
erkennen unter der 5x Lupe grrrrr

Jetzt läuft alles bestens! Werde mich nun an die DCF-Signale
begeben...

Gruß
Andi

von Stephan (Gast)


Lesenswert?

schon merkwürdig, ich arbeite auch gerade mit einem LCD und habe die
gleichen Probleme wie du. Jedes Programm läuft einfach nicht. Ausser
den vier Reihen aus schwarzen Rechtecken zeigt sich nichts auf dem
Display. Habe nie eine Änderung auf dem Display gesehen. Dann habe ich
mal diesen Beitrag gefunden und bin auch beigegangen und habe die LCD
Pins durchgemessen nachdem ich es wie folgt angeschlossen habe.
Vss GND
VDD Vcc
VEE Vcc (ist so bei dem EA 204)
RS GND
R/W GND
E GND

messe an D0,D1,D4,D6,RES 5V. Res ist wohl normal, aber die anderen
anscheinend nicht.
Die Lötstellen sehen auch ganz gut aus. Habe mir nur eine
Adapterplatine fertig gemacht, dass ich von Rastermaß 2 auf 2,54 für
mein Steckbrett komme.

Ist das LCD jetzt defekt? Was kann ich noch testen? Wäre echt schade,
wären 21€ einfach so in den Sand gesetzt, ohne das ich es jemals
richtig genutzt habe. Habe mich lediglich an der Hintergrundbeleuchtung
erfreut ;)

von Klaus (Gast)


Lesenswert?

Hallo Stephan!

Das LCD Display funzt nur wenn Du eine sogenannte Initialisierung
durchführst.

Das LCD kann im 4 Bit oder 8 Bit modus Betrieben werden.

Das Du nur Rechtecke siehst liegt wahrscheinlich am Timinig überprüf
mal deine Routine.


Gruß Klaus

von Stephan (Gast)


Lesenswert?

also ich habe schon mehrere Routinen ausprobiert und keine hat
funktioniert, deswegen bin ich froh das ich diesen Beitrag gefunden
habe. Deswegen möchte ich gerne einen Hardwaredefekt ausschliessen. Da
ich weiter oben gelesen habe, dass der Andreas ein ähnliches Problem
hatte, bin ich davon ausgegangen, dass die Spannungen an den Datenpins
nicht normal sind.

von Klaus (Gast)


Lesenswert?

Stephan!

ich hoffe Du redest hier auch vom HD44780 im welchen Modi Betreibst Du
dein LCD?

Gruß Klaus

von Stephan (Gast)


Lesenswert?

hallo Klaus

also es ist ein EA DIP 204-4    4x20 LCD mit einem KS0073 Kontroller,
welcher laut Herstellerangabe "nahezu 100% HD44780 kompatibel" ist.

Ich versuche das LCD im 4bit Modus zu betreiben, habe auch schon den
8bit Modus probiert, aber ohne Erfolg. Da ich schon über 40std in
Routinentests und umprogrammieren beschäftigt habe, möchte ich ein
Hardwarefehler ausschliessen. Wie kann man es testen, ohne das man
etwas an das LCD senden muß.

von Klaus (Gast)


Lesenswert?

Hallo Stephan!

wenn Du dein Display mit Spannung versorgst und dein Kontrast richtig
eingestellt ist, sollte ohne Initialisierung zumindest mal
die Reihe 2 und 4 angezeigt werden. (lauter vierecke)

Wie hast Du den vier Bit Modus realisert??

Gruß Klaus

von Klaus (Gast)


Lesenswert?

Stephan  Poste mal dein Code!


Ich hoffe Du arbeitest mit einem 8051'er

von Stephan (Gast)


Lesenswert?

z.B. http://www.mikrocontroller.net/tutorial/lcd Habe auch den Takt auf
4MHz gestellt, wie verlangt.
Stimmt, habe auch nicht gesagt, dass ich einen Mega8 mit Assembler
benutze.
Würde ich eine fertige Hex Datei haben und eine Anleitung an welchem
Port was anzuschliessen ist, dann könnte ich auch ein in C
programmiertes Programm benutzen. Ich bin leider selber nicht in der
Lage etwas in C zu programmieren. Assembler finde ich schön
verständlich und nachvollziehbar; bei C würde ich wohl den Überblick
verlieren.

Naja wie gesagt, ich glaube bei den ganzen Programmen die ich im Netz
gefunden und ausprobiert habe, möchte ich einen Hardwaredefekt als
nächstes ausschliessen. Deswegen auch die Frage ob man an den Datenpins
bei Minimalbeschaltung eine Spannung messen darf.

von Klaus (Gast)


Lesenswert?

Hallo Stephan!

Siehe oben da hab ich mal an meinem LCD gemessen.

Die Anleitung sagt ja schon aus wie Du  dein LCD an Port Anschliessen
musst.


Sind bei dir die Balken zusehen??

Klaus

von Klaus (Gast)


Lesenswert?

Hi!

Kleine korrektur meiner Aussage:
Die Balken erscheinen auf Reihe 1 und 3, ich hatte das Display
falschrum gehalten.


Sorry!

klaus

von Stephan (Gast)


Lesenswert?

hmmm, habe auch mal nur Spannung an Pin 1 und 2 angelegt und messe bei
RS, R/W, E, D2,D3,D5,D7 Low. D0,D1,D4,D6 sind auf High. Also nicht ganz
wie bei dir.
Werde nochmals das mikrocontroller.net Tutorial durchführen, vielleicht
hat sich ja doch irgendwo ein Fehler eingeschlichen. Das Anschliessen
geht ja mit einem Steckbrett ganz schnell.

Auf dem Display sehe ich bei Spannungsversorgung und Kontrast vier, mit
schwarzen Rechtecken gefüllte Zeilen. Es soll ja bedeuten, dass die
Initialisierung noch nicht stattgefunden hat, aber wie soll es auch
stattfinden, wenn an manchen Pins ein High-Signal anliegt, dann kann
der uC diese ja nicht mehr ansprechen.
Aber ich werde nicht so schnell aufgeben.

von Andreas Palm (Gast)


Lesenswert?

Da ich zufälliger Weise das gleiche Display hier habe :) denke ich, dass
ich die Lösung kenne:

Probier mal folgendes:

VSS (Pin 1) -> GND
VCC (Pin 2) -> 5V
VEE (Pin 3) -> GND !!!!! (wenn ich die bei mir an 5V lege erkenne ich
gar nix, weil der Kontrast zu stark ist!)
RS (Pin 4) -> GND
R/W (Pin 5) -> GND
EN (Pin 6) -> Ein Kabel dran was du an GND legst, aber dort abmachen
kannst und kurz an 5V tippen kannst
DB0,1,2,6,7 -> GND
DB3,4,5 -> 5V

Dann kurz mit dem EN-Kabel auf 5V und wieder auf GND... danach solltest
du ein leeres Display haben. Wenn das funktioniert und der µC das nicht
schafft, liegt es am Code oder an der Verkabelung. Das LCD ist dann
aber in jedem Fall in Ordnung!

Gruß
Andi

von Stephan (Gast)


Lesenswert?

so, komplett neu verdrahtet. Läuft aber immernoch nicht. Benutze den
internen Oszi. Daran wird es aber wohl nicht liegen, oder?

hier nochmal der Code, den ich auf den Mega8 gespielt habe. Ist im
Prinzip der gleiche wie auch im Tutorial.

.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ;Port D = Ausgang
           out DDRD, temp1

           rcall lcd_init     ;Display initialisieren
           rcall lcd_clear    ;Display löschen

           ldi temp1, 'T'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ;Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 ;sendet ein Datenbyte an das LCD
lcd_data:
           mov temp2, temp1             ;"Sicherungskopie" für
                                        ;die Übertragung des 2.Nibbles
           swap temp1                   ;Vertauschen
           andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ;entspricht 0b00010000
           out PORTD, temp1             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
                                        ;2. Nibble, kein swap da es
schon
                                        ;an der richtigen stelle ist
           andi temp2, 0b00001111       ;obere Hälfte auf Null setzen
           sbr temp2, 1<<4              ;entspricht 0b00010000
           out PORTD, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret                          ;zurück zum Hauptprogramm

 ;sendet einen Befehl an das LCD
lcd_command:                            ;wie lcd_data, nur ohne RS zu
setzen
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTD, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTD, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ;erzeugt den Enable-Puls
lcd_enable:
           sbi PORTD, 5                 ;Enable high
           nop                          ;3 Taktzyklen warten
           nop
           nop
           cbi PORTD, 5                 ;Enable wieder low
           ret                          ;Und wieder zurück


 ;Pause nach jeder Übertragung
delay50us:                              ;50us Pause
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ;wieder zurück

 ;Längere Pause für manche Befehle
delay5ms:                               ;5ms Pause
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ;wieder zurück

 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
gesendet
           out PORTD, temp1             ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
           out PORTD, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001100        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret

 ;Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ;Display löschen
           rcall lcd_command
           rcall delay5ms
           ret

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.