PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Initialisierung des LCD - Display (20x4)



hemisoft
11.07.2005, 10:49
Hallo,

ich lese hier schon eine zeitlang mit, jetzt habe ich ne Frage.
Gibt es die (Firmware-)Quelle zu den RN.Boards (hier speziell das RN-KeyLCD) zum Download?

Ich versuche gerade das gleiche LCD-Display unter Bascom direkt an einem AVR zum Laufen zu kriegen, wie es auch auf dem RN-KeyLCD-Board unterstützt wird (Dotmatrix, 20x4 Zeichen, Kontroller KS0073). Leider mache ich bei der Initialisierung irgendwas falsch.

Ich bekomme zwar den Text auf das Display, allerdings lassen sich die 4 Zeilen nicht sauber ansteuern. Die erste Zeile und die dritte Zeile sind ok. Die zweite und vierte Zeile kann ich erst ab etwa der Mitte beschreiben. Am Anfang dieser Zeilen sehe ich wieder ein Teil des Textes aus der jeweiligen Zeile davor.

Ich vermute, dass ich nur igendwas bei der Ansteuerung oder Inititalisierung falsch mache. (Ich benutze die orginal - Bascom - Routinen)

Code-Schnipsel:



' Lcd-Modul initialisieren

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.1
Config Lcd = 20 * 4
Config Lcdbus = 4


Angeschlossen ist das Display mit den Leitungen E, RS und D4 - D7.

Vielleicht hat ja jemand einen Tipp, oder sogar einen Code-Schnipsel, was bei der Initialisierung fehlt.

Danke und Gruß,
- Joerg -

Frank
11.07.2005, 20:37
Hallo,

mit dem Quellcode der Firmware kann ich nicht dienen, aber ich kann dir sagen das der KS-Controller nicht 100% identisch mit dem üblichen ist, daher funktioniert die Bascom Libary nicht optimal. Du musst das LCD etwas anders initialisieren.
Entweder du schreibst eine kleine Libary dafür oder aber du sendest nach dem Bascom "initlcd" einige Kommandos direkt an das LCD, dann gehts auch mit den Bascom Befehlen und der normalen Libary

In etwas so:


Call Rn_writelcdcode(&B00101100) ' Funktionsset RE=1
Call Rn_writelcdcode(&B00001001) ' 4 Bit-Datenlänge, extension
Call Rn_writelcdcode(&B00101000) ' Funktionsset RE=0

Call Rn_writelcdcode(&B00000110) ' Entry Mode Set Cursor Auto-Increment
Call Rn_writelcdcode(&B00001100) ' Display ein, Cursor aus, Blinken aus


Den Befehl "Rn_writelcdcode" musst du dir selbst definieren, der ist abhängig von deiner Belegung.Er gibt die Befehle in 4er Bits direkt an das LCD.
Siehe auch LCD-Datenblatt

Gruß Frank

hemisoft
11.07.2005, 21:51
Hallo Frank,

das hört sich doch vielversprechend an.
Wenn ich das richtig verstehe - wenn nicht bitte korrigieren - dann sollte die Routine RN_writelcdcode die in Deinem Beispiel genannten Bitmuster einfach nacheinander auf die Pins des LCD ausgeben. (Ich vermute von links nach rechts auf D0, D1 ... D7)
Müssen diese eine Mindestzeit anstehen? (Ich ziehe die letzte Frage zurück, das steht bestimmt im Datenblatt)

Ich muss gestehen, dass ich die Initialisierung im Datenblatt nicht wirklich verstanden habe - vielleicht hätte ich das einfach mal ausprobieren sollen.

Ich werds auf jeden Fall nachher einmal versuchen und melde mich wieder wenns geklappt hat - und natürlich auch wenn ich nicht weiterkomme. Bis hierhin aber schon mal danke.

Gruß
- Joerg -

Frank
11.07.2005, 22:36
Hallo Joerg,
ja das Datenblatt ist ein wenig verwirrend, ich hatte auch Anfangs meine Problemchen damit. Auch ein Grund warum ich rn-keylcd programmiert hab, ist halt doch bequemer.

Also der Code den ich die gepostet hab ist nur dann gültig, wenn dir das Display im 4 Bit Modus betreibst. Du musst dann ja 6 Leitungen D1-4 (oberen 4 Bit) und E und RS mit einem Port verbinden. Dann müssen immer 4 Bit gleichzeitig gesendet werden, wobei E und RS auch besonders gepulst wird. Dazu haben wir im Download Bereich irgendwo ein kleines Tutorial wo das genauer beschrieben wird. In Bascom könnte die Funktion in etwa so aussehen:



' Definition der Displayports
Config Pind.5 = Output 'E
E Alias Portd.5
Config Pinb.0 = Output 'RS
Rs Alias Portb.0
Config Pinc.0 = Output 'D4
D1 Alias Portc.0
Config Pinc.1 = Output 'D3
D2 Alias Portc.1
Config Pinc.2 = Output 'D2
D3 Alias Portc.2
Config Pinc.3 = Output 'D1
D4 Alias Portc.3

Sub Rn_writelcdcode(byval Zeichen As Byte)
Rs = 0

If Zeichen.4 = 1 Then D1 = 1 Else D1 = 0
If Zeichen.5 = 1 Then D2 = 1 Else D2 = 0
If Zeichen.6 = 1 Then D3 = 1 Else D3 = 0
If Zeichen.7 = 1 Then D4 = 1 Else D4 = 0
E = 1
Waitus 2
E = 0
If Zeichen.0 = 1 Then D1 = 1 Else D1 = 0
If Zeichen.1 = 1 Then D2 = 1 Else D2 = 0
If Zeichen.2 = 1 Then D3 = 1 Else D3 = 0
If Zeichen.3 = 1 Then D4 = 1 Else D4 = 0
E = 1
Waitus 2
E = 0

Waitus 250
End Sub

hemisoft
17.07.2005, 18:44
Hallo nochmal,

bin zwar nicht direkt zum Ausprobieren der Tipps gekommen, habe nun aber die Lösung mithilfe der Tips gefunden.

Den Code habe ich mal beigefügt:



'Pins des LCD-Modules setzen ggf. an eigene Anschlüsse anpassen

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.1
Initlcd

'Config Lcd = 20 * 4 ' wird nicht benötigt daher auskommentiert
'Config Lcdbus = 4 ' oder weglassen :-)

Call Lcdwrite(&B00101100)
Waitms 5

Call Lcdwrite(&B00001001)
Waitms 5

Call Lcdwrite(&B00101000)
Waitms 5

Call Lcdwrite(&B00000110)
Waitms 5

Call Lcdwrite(&B00001100)
Waitms 5

'...
' hier LCD - Ausgaben und Hauptprogramm
'...

'Schreibt die Initialisierungs - Bits zum LCD

Sub Lcdwrite(byval Zeichen As Byte)

' Höherwertiges Nibble setzen
If Zeichen.4 = 1 Then Portc.4 = 1 Else Portc.4 = 0
If Zeichen.5 = 1 Then Portc.5 = 1 Else Portc.5 = 0
If Zeichen.6 = 1 Then Portc.6 = 1 Else Portc.6 = 0
If Zeichen.7 = 1 Then Portc.7 = 1 Else Portc.7 = 0
' Höherwertiges Nibble übertragen
Portc.3 = 1
Waitms 1
Portc.3 = 0
Waitms 1

' Niederwertiges Nibble setzen
If Zeichen.0 = 1 Then Portc.4 = 1 Else Portc.4 = 0
If Zeichen.1 = 1 Then Portc.5 = 1 Else Portc.5 = 0
If Zeichen.2 = 1 Then Portc.6 = 1 Else Portc.6 = 0
If Zeichen.3 = 1 Then Portc.7 = 1 Else Portc.7 = 0
' Niederwertiges Nibble übertragen
Portc.3 = 1
Waitms 1
Portc.3 = 0
Waitms 1

End Sub


Das kann man zwar bestimmt noch besser machen, aber es funktioniert.

Ich habe jetzt "nur" noch das Problem, dass das LCD mit den Bascom-Befehlen
- Lowerline die dritte Zeile und mit
- Thirdline die Zweite Zeile anspricht.

Das ist zwar nicht schön aber kein Problem, da ich das ja im Code berücksichtigen kann. (Nur für die Dokumentation ist es etwas verwirrend.)

Wenn hier noch jemand einen Tipp für mich hat, ist der gerne willkommen, ansonsten lasse ich es so wie es jetzt ist.

Danke nochmal für die Hilfe.
Gruß, Jörg

Frank
17.07.2005, 19:00
Lowerline und Thurdline nehme ich eigentlich nie. Wenn der Befehl Locate richtig funktioniert reicht es ja in der Praxis.

Du solltest aber noch den Befehl
Config Lcd = 20 * 4a
einfügen.

Gruß Frank

hemisoft
17.07.2005, 20:47
Prima,

sobald ich den Befehl
Config LCD = 20 * 4a
eingefügt habe, funktionieren auch Lowerline und Thirdline richtig.

Auch Locate arbeitet richtig.
Ich bin begeistert.

Gruß Jörg

hardstyleroxx
06.10.2005, 20:39
Nur nochmal so zum Verständnis: Ich muss einfach den Code den Hemisoft geschrieben hat in mein Bascom programmfenster einfügen die Pins anpassen und kann dann wie gewöhlich mein programm schreiben?

Mein LCD hat glaube ich einen KS0066 Controller.

hemisoft
07.10.2005, 09:09
Hallo hardstyleroxx,
genau. Du musst den Quelltext einfach an den Anfang (bevor du LCD-Ausgaben nutzt) in Dein Programm reinkopieren.
Dort wo im Quelltext die Zeilen


'...
' hier LCD - Ausgaben und Hauptprogramm
'...
stehen kann dann Dein Hauptprogramm und auch (darin) Deine normale LCD-Ausgabe (mit den Standard-Bascom-Befehlen) stehen.

Vergiss nicht die Zeile


Config LCD = 20 * 4a

an der Stelle einzufügen, wo diese Zeile (ohne 'a') im Quelltext noch auskommentiert ist. Dann funktionieren auch die Zeilenzuordnungen richtig.

Aber Achtung! Du hast geschrieben, dass Du einen KS0066 - Controller hast. Ich hatte einen KS0073. Den KS0066 habe ich noch nicht probiert. Vielleicht kann dazu jemand anderes was sagen - ob diese kompatibel ist zum KS0073 - ich komme jetzt gerade nicht dazu, die Datenblätter runterzuladen und das zu prüfen.

Gruß Jörg (hemisoft)

hardstyleroxx
07.10.2005, 11:40
Ich habe für das Display mal 40€ bei Conrad bezahlt, ist mit Backlight. Wäre echt schade wenns nicht funktioniert :(

Frank
07.10.2005, 13:30
Der Code ist eigentlich speziell für den KS0073, also von daher musst du ausprobieren ob´s auf deinem Controller geht. Eventuell gehts sogar mit den Bascom Befehlen ohne den Code, oder garnicht. Zwar steht in den Datenblättern immer das die kompatibel sind, aber dennoch ist oft eine andere Initalisierung notwendig.
Wenn ich mich recht entsinne, dann hat der KS0066 ja schon 2 Enable Pins, bin mir aber nicht mehr ganz sicher. Wenn ja, dann müsste Code zumindest etwas angepaßt werden. Aber mit Hilfe der LCD Doku sollte man es hin bekommen.

Gruß Frank

hardstyleroxx
07.10.2005, 13:33
Also ohne was zu ändern funktioniert es definitiv nicht bei mir. Hab 5 Stunden nichts anderes gemacht ausser es zu versuchen.... :(

hemisoft
07.10.2005, 13:50
Na um da helfen zu könne, müsstest Du uns schon etwas mehr sagen.
Was funktioniert denn nicht? Oder besser: was funktioniert denn schon?

Eine kleine Checkliste:

- Versorgungsspannung am LCD?
- Kontrastregelung ok?
- erscheinen mit dem Befehl "LCD" Zeichen auf dem LCD oder erscheint gar nichts?
- wie ist der LCD denn angeschlossen (4-bit, 8-bit, ...?)

Gruß Jörg

hardstyleroxx
07.10.2005, 14:08
Das LCD zeigt in der ersten und dritten Zeile einen schwarzen Balken. Contrastregler Funktionert auch einwandfrei.
Wenn ich mit dem befehl LCD "hallo" schreibe passiert gar nichts (es bleiben einfach die schwarzen Balken). Das lässt mich ja schonmal drauf schliessen das es ein initialisierungsfehler ist oder?

Frank
09.10.2005, 10:46
Könnte Initialisierungsfehler sein, ich kenn leider das Display nicht näher. Du solltest mal deinen Quellcode, Verkabelung und ne Displaybeschreibung (Pinbelegung / Datenblatt) posten, vielleicht kann dir dann jemand helfen.

Marcos
28.05.2013, 21:26
Hallo Frank
ich habe das selbe Problem. Ich möchte mein LCD Display 20 * 4 von Anag Vision zum laufen bringen. Es funktioniert einfach nicht. Kontrastregler und Hintergrundbeleuchtung funktionieren. Zu sehen bekomme ich allerdings nur zwei Balken. Einer in der ersten Zeile und der zweite in der dritten Zeile. Ich betreibe das LCD an einem STK500 mit einem Atmega88 und 16Mhz. Habe schon das ganze Forum abgesucht und bin schlisßlich in diesem Chat gelandet.
Habe schon den Code von hemisoft ausprobiert, doch da kommt beim compilieren eine Fehlermelduung bei der Zeile mit dem call Lcdwrite (&C.....)
Bin echt am verzweifeln.
Das LCD benutzt den Controller KS0066. Der solte allerdings kompatibel sein, so steht es zumindest in dem Buch dass ich gerade lese. "Microcontroller programmieren mit Bascom Basic" von Ulli Somer.

Vielleicht kannst Du mir helfen oder hast einen Tip.

Danke!

HeXPloreR
28.05.2013, 21:43
Hallo, ich denke mal Frank wird Dir nicht antwort...vermutlich noch wem anders - er kümmert sich hoffentlich noch im Hintergrund um seine Herde :(

Schau hier mal ob es was Für Dich ist: LCD 20x4 (klick mich :arrow: ) (https://www.roboternetz.de/community/threads/61976-Bascom-4-zeiliges-LCD-l%C3%A4sst-sich-nur-einzeilig-in-Zeile-1-oder-2?highlight=lcd)