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