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
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
Sind deine Leitungen zum LCD zu lang? Hast du mal das Timing am Controller etwas langsamer gemacht? HD44780's sind nicht die schnellsten..
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!
Das ist nicht normal. Wenn Du einen Verdrahtungsfehler ausschließen kannst, ist das LCD wahrscheinlich defekt.
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!
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
Hallo! Das ist eine gute Idee, bringt aber leider nix :) Auch wenn ich die drei auf low lege bleibt die DB6 auf high :(
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
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
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
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
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 ;)
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
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.
Stephan! ich hoffe Du redest hier auch vom HD44780 im welchen Modi Betreibst Du dein LCD? Gruß Klaus
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ß.
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
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.
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
Hi! Kleine korrektur meiner Aussage: Die Balken erscheinen auf Reihe 1 und 3, ich hatte das Display falschrum gehalten. Sorry! klaus
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.