Hallo zusammen, ich bin schon seit einigen Tagen dran mein 4x20 LCD-Display zum Laufen zu bringen, doch ich bekomme es einfach nicht hin :O(. Das Display flackert ständig, mal zeigt es was an, aber dann nicht genau in den viereckigen Kästchen sondern etwas versetzt. Langsam bin ich am verzweifeln. Ich würde mich riesig freuen, wenn mir jemand helfen würde oder vielleicht einen Tipp für mich hat. Die Kontakte habe ich alle nochmal nachgelötet. Die Verbindungen sind auf jedenfall in Ordnung. Betreiben tue ich das Display im 4 Bit Modus. Enable an PIN_B0 RS an PIN_B1 R/W an PIN_B2 DB4 an PIN_B4 DB5 an PIN_B5 DB6 an PIN_B6 DB7 an PIN_B7 Den Resetpin des Diplays habe ich frei gelassen. Ich verwende ein 4 x 20 LCD Display (5x8 DOT). Bezeichnung: EA DIP204-4 mit weißer Hintergrundbeleuchtung und schwarzer Schrift. In dem Display befindet sich der Kontroller KS0073. Die Adressierung des Displays ist folgende: 1. Zeile 0x00...0x13 2. Zeile 0x20...0x33 3. Zeile 0x40...0x53 4. Zeile 0x60...0x73 Als Prozessor verwende ich den PIC16F88 mit dem CCS - Compiler. Das Datenblatt des LCD - Displays, und der C-Code für das Hauptprogramm sowie für den 4x20 LCD Treiber sind im Anhang. Kann es sein, dass ich einen Fehler in der Adressierung habe oder vielleicht in der Initialisierung des Displays? Ich kann einfach keinen Fehler finden. Ich bin über jede Hilfe dankbar!!!
Hi
>sicher das die Aufteilung der Zeilen stimmt ??
Wenn kein Mist im Datenblatt steht, ja.
MfG Spess
Glaube auch, dass Dein Driver mit falschen Timings arbeitet. Den Reset-PIN offen zu lassen ist okay, da das Display einen Pullup hat. Die Zeilenadressen stimmen meiner Meinung nach so auch. Schau mal hier: Beitrag "LCD EA DIP204 KS0073 4-Bit, 8-Bit und serielle C-Routinen"
>Glaube auch, dass Dein Driver mit falschen Timings arbeitet.
Mag sein, aber beim KS073 muss man etwas mehr in der Init
machen um in den 4 Zeilen Modus zu schalten.
Und das hier tut vermutlich nicht was es soll:
lcd_putc("\fZeile 1");
lcd_putc("\nZeile 2");
lcd_putc() schreibt wohl nur ein Zeichen und keinen String.
Vieleicht gibt es ja ein lcd_puts()?
Hallo Sebastian:
> Ich kann einfach keinen Fehler finden.
Wie bereits beschrieben, gibt es verschiedene Fehler.
Ich habe Deinen Code nicht geoeffnet ...ausserdem Programmiere ich nur
in Assembler und koennte Dir vermutlich nicht viel helfen..... aber die
folgenden Fehler sind beim ersten Programmierversuch von LCDs ueblich (
in Reihenfolge der Haeufigkeit):
1. Fehlerhafte Initialisierung durch falsches Timing (wenn das
Busy-Signal nicht ausgewertet wird, dann muss wirklich ausreichend Zeit
gewartet werden nach jedem Befehl -> Datenblatt Seite 2, letzte Spalte,
gerne verdoppeln! ACHTUNG: "Cursor home" und "Clear display" dauern
seeehr lange!)
2. Fehlerhafte Initialisierung durch inkorrekte Steuersequenz ->
Datenblatt Seite 3 oben...und das Timing beachten !
3. Fehlerhaftes Einleiten des 4Bit-Modes, falls verwendet -> Datenblatt
4. Fehlerhaftes Umschalten zwischen EIngabe von Daten/Befehlen (RS Bit
vergessen) -> Datenblatt.
Da sind wir alle mal durchgegangen und ich glaube jeder hat da seine
persoenliche Ini-Routine auf dem Drive liegen ;-)
Die Adressierung der Zeilen ist erstmal unerheblich.....Zeile 1 startet
immer bei Adresse Null und wenn es in der ersten Zeile dann schliesslich
geht, kannst Du Dich um die Zeilenadressen kuemmern.
Gruss
Michael
Der Hauptfehler, der bei LCDs gemacht wird, ist, daß an tausenden Stellen ein Nibble zusammengebastelt wird. Das ist natürlich großer Quatsch (fehleranfällig, großer Code, schwer wartbar). Man muß sich erstmal einen einzige Nibble-Funktion schreiben, die ein Nibble ausgibt, ohne andere Pins des/der verwendeten Ports zu ändern! Dabei ist unerheblich, ob die 4 Datenpins auf einem Port liegen oder auf 4 verschiedenen. Die 4..28 anderen Pins dürfen ihre Richtung und ihren Pegel nicht verändern! Praktischer Weise enthält die Nibble-Funktion auch gleich das E-Pin pulsen (~1µs). Und erst dann kann man daran gehen, damit das Init und Daten/Befehl senden aufzubauen. Das Busy-Testen läßt man bequemer Weise auch weg und nimmt einfach die Delays aus dem Datenblatt. Das Busy-Testen mag vielleicht einige µs weniger warten, aber das spielt keine Rolle. Man muß einen Text eh lange darstellen, damit der Mensch ihn auch ablesen kann. D.h. auch mit festen Wartezeiten ist die CPU-Last durch das LCD weit unter 1%. Peter
Mit dem Programm kann ich Dir leider nicht helfen. (Atmel-Fan) Ich hatte aber mit diesem Display auch genug Ärger. Es liegt zu 99% am Init, da ist nämlich eine Ungenauigkeit im obigen Datebblatt. Das "fast" 100% kompatibel stimmt eben auch nur fast... Hole Dir das Original Datenblatt des Controllers, da sind die (detaillierten) Init Routinen drin, incl der Waits usw. Nach dem ich diese programmiert hatte lief das Display wie es sollte.
Hallo Lcd_putc erwartet eine Character, du übergibst einen String. Gruß Joachim
Hallo zusammen, erst einmal vielen Dank für eure Hilfe! Ich habe heute nochmal ein wenig im Internet recherchiert. Ich denke, dass tatsächlich die Initialierung des HD44780 eine andere ist als die für den KS0073 und die Treiber nicht 100% kompatibel sind ohne sie anzupassen. Vielleicht sollte ich einfach ein 4x20 LCD Display mit einem HD44780 Kontroller suchen ;O), ne Spaß, ich würd schon gerne dieses Display zum Laufen bekommen, zumal ich schon ziemlich viel Zeit damit verschwendet habe ;O). In der angehängten Word-Datei sind zwei Initialisierungsbeispiele für den 8 Bit Modus, einmal für ein 2x16 LCD Display mit einem HD44780 Kontroller und einmal für ein 4x20 LCD Display mit dem HD44780 Kontroller. Wenn ich jetzt einmal das Initialisierungsbeispiel für das 4x20 LCD für den 8-Bit Modus umbaue, zum 4-Bit Modus, würde das im Prinzip heißen, dass ich nacheinander folgende Bytes an das LCD übertragen muss? (siehe Datenblatt) Function SET : 0x2C 101100 Ext. Function SET: 0x09 001001 Function SET : 0x28 101000 Display ON/OFF : 0x0F 001111 Clear Display : 0x01 000001 Entry Mode Set : 0x06 000110 Das 2x16 LCD Display habe ich mit mit dem lcd.c driver von ccs zum Laufen bekommen. Mit dem lcd_putc Befehl zu arbeiten war kein Problem. Morgen werde ich versuchen die o.g. Adressen an das LCD zu übertragen um es korrekt zu initalisieren. Falls es noch immer nicht funktioniert werde ich hier mal den geänderten Driver Code hinterlegen. Wäre schön, wenn den dann mal einer unter die Lupe nehmen würde :O) Danke für eure Hilfe!
Hallo Leute, ich danke euch für eure Hilfe. Hab das Problem gelöst. Ich habe aus der Library des CCS Compilers den LCD420.C Treiber verwendet und in diesem die Initalisierung angepasst. Außerdem, was sehr seltsam ist, dieses Flackern des LCDs kam durch die Spannungsversorgung. Im Datenblatt steht geschrieben, dass das LCD mit einer Spannung zwischen 3,3 und 5V versorgt werden kann. Für die Hintergrundbeleuchtung (Schwarz-Weiß) des LCD, darf die Spannung in einem Bereich zwischen 3,0 und 3,6 V liegen. Der Strom darf maximal 45mA betragen. Ich habe mich für 30mA und 3,3V entschieden. Rv = (Ub-Uv)/I = (5V-3,3V)/0,03A = 56,67 Ohm. Für die Einstellung des Kontrasts habe ich ein 10kOhm Potentiometer verwendet. Und jetzt das seltsame..... Wenn ich die Betriebsspannung, die ja eigentlich in einem Bereich zwischen 3,3V und 5V liegen darf, auf 5V lege, dann fängt das Display an zu flackern und macht nur Driss. Das Display wird direkt an einem Festspannungsregler LM7805 betrieben. Wenn ich aber die Spannung etwas reduziere, durch einen Vorwiederstand, so dass die Betriebsspannung bei ca. 4V liegt, funktioniert alles einwandfrei. Das ist doch ziemlich seltsam, oder? Also entweder isn Fehler im Datenblatt oder ich weiß auch nicht....Werde mir morgen sicherheitshalber nochmal alles genau anschauen.... Viele Grüße
>Wenn ich aber die Spannung etwas >reduziere, durch einen Vorwiederstand, so dass die Betriebsspannung bei >ca. 4V liegt, funktioniert alles einwandfrei. Diese Vorgehensweise bereitet mir fast schon körperliche Schmerzen. >Vorwiederstand Vorwiderstand
Ja gut, dann eben Vorwiderstand, sorry ist schon spät. Wieso bereitet dir dieses Vorgehen körperliche Schmerzen?
Die Ursache für das Problem waren fehlende Stützkondensatoren!!!
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.