PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit einem LCD



Kampi
01.02.2010, 16:20
Hallo

Ich habe am Wochenende ein neues LCD gekauft und wollte es heute mal testen. Ich hab das Beispielprogramm vom RN-Wiki genommen und auf meinen Controller umgeschrieben aber das LCD zeigt den Text nicht an.
Meine Frage ist nun ist das Programm falsch oder hab ich bei der Verkabelung was falsch gemacht?

Hier das Programm:



$regfile = "m32def.dat"
$crystal = 16000000

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Cls
Locate 1 , 1
Lcd "Hallo Welt"

End

peterfido
01.02.2010, 16:41
Ohne Infos über das LCD und den Schaltplan fällt eine Antwort nicht leicht...

KingTobi
01.02.2010, 16:46
ISt das ein HD447 kompatibles?

TomEdl
01.02.2010, 16:54
Hallo!

Versuch doch mal diesen Code:



$regfile = "m32def.dat"
$crystal = 16000000

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Initlcd
waitms 100
Cls
Locate 1 , 1
Lcd "Hallo Welt"

End


Grüße
Thomas

Kampi
01.02.2010, 16:54
Jap ist es.
Das ist dieses Display
-> http://www.conrad.de/goto.php?artikel=181863

Und Peterfido in erster Linie wollt ich wissen ob der Fehler am Programm liegt. Wenn das Programm soweit stimmt weiß ich das ich auf der Adapterplatine zwischen LCD und Mega32 (weil das LCD hat 12 einen 14 Pin Stecker und der Mega nur 10) ein Fehler ist. 8-[

Und der Code funktioniert auch net.

Jaecko
01.02.2010, 17:13
Naja, ob das Programm stimmt, kann man ohne Displayangabe nicht sagen, da ein Display A durchaus anders angesteuert werden kann als Display B.

Bei dem Conrad-Display ist es so; es ist fast mit den HD44780 kompatibel. Bei der Initialisierung brauchts nur noch ein Kommando mehr.

Kampi
01.02.2010, 17:22
Kann es vielleicht sein das ich eine Lötbrücke auf der Rückseite des LCDs ändern muss da ich es ja im 4-Bit Modus betreibe?

for_ro
01.02.2010, 19:31
Hallo Kampi,

Kann es vielleicht sein das ich eine Lötbrücke auf der Rückseite des LCDs ändern muss da ich es ja im 4-Bit Modus betreibe?
Ne, das ist wohl zum Umschalten in den SPI Modus.
Hast du den R/W Anschluss auf GND gelegt?
Die Zeile
Config Lcdbus = 4
solltest du entfernen, da das LCD ja im PIN Modus betreibst (jeden Pin hast du einzeln angegeben).

Wenn du mal nach KS0073 suchst, findest du diesen Thread zum Unterschied zum HD44780 Controller:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=9925
Dort ist im hinteren Teil eigentlich alles erklärt.

Kampi
01.02.2010, 21:05
Nein R/W hab ich net auf Ground gelegt. Auch nicht die nicht angeschlossenen Datenpins.

So ich hab mal auf
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10766
bisl gelesen und dementsprechend was zusammengebastelt:



$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4a
Dim Zeichen As Byte

Declare Sub Lcdwrite

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

Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Initlcd


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

Cls
Locate 1 , 1
Lcd "Hallo Welt"

'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

Allerdings kommt beim Kompilieren ein Fehler wo drin steht:
Incorrect number of parameters und zwar in dieser Zeile:
Call Lcdwrite(&B00101100)

TomEdl
01.02.2010, 21:55
Hallo!

Versuch einfach mal die nicht angeschlossenen Pins auf GND zu legen und benutze herkömmlich den Initlcd-Befehl. Dann sollte es demenstprechend funktionieren.

Grüße
Thomas

Kampi
01.02.2010, 21:58
Gut werd ich morgen dann mal machen!

Tido
01.02.2010, 22:01
Hast du an Pin 3 vom Display den Schleifer eines Potis angeschlossen?
Sind nach dem Anlegen der Betriebsspannung am Display in Zeile 2 und 4 dunkle Balken sichtbar?

for_ro
01.02.2010, 22:27
Versuch einfach mal die nicht angeschlossenen Pins auf GND zu legen und benutze herkömmlich den Initlcd-Befehl. Dann sollte es demenstprechend funktionieren.

Die nicht verwendeten Daten-Pins sollen offen bleiben. Siehe Datenblatt.
Initlcd wird nicht funktionieren, da das Display nicht 100% kompatibel ist. Außerdem ist die Initialisierung neuerdings schon automatisch enthalten.



Nein R/W hab ich net auf Ground gelegt. Auch nicht die nicht angeschlossenen Datenpins.

R/W muss auf GND, damit BASCOM Befehle und Daten in den Controller schreiben kann.

Deine Declare Zeile muss so aussehen:
Declare Sub Lcdwrite(byval Zeichen As Byte)

Kampi
01.02.2010, 22:43
Hast du an Pin 3 vom Display den Schleifer eines Potis angeschlossen?
Sind nach dem Anlegen der Betriebsspannung am Display in Zeile 2 und 4 dunkle Balken sichtbar?


So ich hab jetzt mal R/W nach Groung gelegt und diesen Code benutzt:



Ja hab ich so angeschlossen und es sind keine dunklen Balken sichtbar. Das Programm funktioniert nun soweit und das mit dem R/W Ground mach ich morgen. Melde mich dann morgen mittag nochmal.

$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4a
Dim Zeichen As Byte

Declare Sub Lcdwrite

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

Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Initlcd


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

Cls
Locate 1 , 1
Lcd "Hallo Welt"

'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

Nun wird mir auf dem Display ein V mit Unterstrich und ein ê angezeigt. Ist das richtig so oder deutet das auf einen Fehler hin? *kopf kratz*

for_ro
02.02.2010, 12:31
Hallo Kampi,
ich würde jetzt zunächst mal wieder deinen ursprünglichen Code benutzen. Auch der sollte eine gewisse Ausgabe ermöglichen. Dann im nächsten Schritt diese speziellen Sachen integrieren, um die Inkompatibilität zu beheben.


$regfile = "m32def.dat"
$crystal = 16000000

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4

Cls
Locate 1 , 1
Lcd "Hallo Welt"

End

Kampi
02.02.2010, 12:45
Gut werd ich dann mal nach der Arbeit aufspielen und mich dann nochmal melden.

Boah es funktioniert endlich *Luftsprünge macht*. Es lag anscheinend echt nur an der fehlenden R/W Verbindung.

Danke euch allen für die Hilfe =D>

TomEdl
02.02.2010, 15:39
Außerdem ist die Initialisierung neuerdings schon automatisch enthalten.

Also bei mir geht mit fehlendem Initlcd gar nix.