PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4x20 LCD KS0073 EA-DIP204 ich dreh durch



Vitis
19.07.2005, 08:46
Hi Leute, komm mir ziemlich dämlich vor :(

ich hab das altbewährte DIP-204 LCD An meinen M16 gehängt und will für das laufende Projekt den Port A für die Steuerung verwenden.
4-Bit
a.2=RS
a.3=E
a.4=DB4
a.5=DB5
a.6=DB6
a.7=DB7

DB0-3 = GND

Hab mich schon von der Lib verabschiedet und versuch das Ding "von Hand" mit dem folgenden Code zu betreiben, aber funzt nit.

Ich tüftel da schon 2 Abende dran rum und seh vermutlich den Wald vor Bäumen nicht. Habt Ihr mal ne Minute Zeit mir n Fingerzeig zu geben?



$regfile = "m16def.dat"
$crystal = 8000000

$baud = 2400

'$lib "ea-dip-Zeit.lib"
'Initlcd

Declare Sub Lcdinit(byval Zeichen As Byte)

Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
Config Lcd = 20 * 4a
Initlcd

Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Pina.5 = Output
Config Pina.6 = Output
Config Pina.7 = Output

E Alias Porta.3
Rs Alias Porta.2


Call Lcdinit(&B00100100)
Waitms 5
Call Lcdinit(&B00001001)
Waitms 5
Call Lcdinit(&B00100000)
Waitms 5
Call Lcdinit(&B00000110)
Waitms 5
Call Lcdinit(&B00000001)
Waitms 5
Call Lcdinit(&B00001100)
Waitms 5


Cls

Dim Temp As Byte

Do
Waitms 500
' Hintergrundbeleuchtung aus
Portd.7 = 0

Incr Temp
Lcd Temp
Print Temp

Waitms 500
' Hintergrundbeleuchtung ein
Portd.7 = 1

Loop

'Schreibt die Initialisierungs - Bits zum LCD

Sub Lcdinit(byval Zeichen As Byte)
Print "init: ";
Print Zeichen

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

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

End Sub

Frank
19.07.2005, 10:35
Schau mal ins Projektforum
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10766

Der Thread sollte dir helfen

19.07.2005, 12:47
ja, den Thread kenn ich auch schon, hab ich auch schon probiert, aber irgendwie funktionierts bei mir doch nicht ...

die elektrischen Verbindungen stimmen, die hab ich schon vor und zurück getestet ohne Ergebniss ...

Also es funktioniert soviel:
Reset, Anzeige wird leer, Initialisierungsroutine läuft durch, alle Zeichen
als 4-Ecke auf dem Display sichtbar,

CLS Anzeige wird leer

und das wars dann auch schon ... bin da echt am verzweifeln

Vu 4,98V, sollte allso passen

Vitis
19.07.2005, 12:50
der Letzte war von mir

19.07.2005, 13:59
Ich hab das gleiche Display und hab festgestellt, dass wenn der Kontrast zu hoch eingestellt ist, nur weiße Rechtecke statt den Buchstaben ausgegeben wird. Versuch doch mal den Kontrast zu ändern. Das ist bei diesem Display etwas anders als bei den "normalen". Du ein poti mit 5v und Pin3 (Vo) verbinden und nicht wie sonst üblich mit Masse.

MFG

sunwatch
19.07.2005, 14:00
Hatte mich nicht eingellogt, sorry

Marten83
21.07.2005, 08:38
Hallo!

Ich habe das gleiche Problem! (Scheint ne Krankheit zu sein)
Wie oben in dem Link beschrieben habe ich das mal versucht. Geht auch eigentlich optisch echt gut.
Mein problem ist aber dass das ganze wohl ziemlich langsam ist.
ich stell mal den Code dazu den ich benutze.

'ATMega8
'11059200 Hz
'BascomAVR 1.11.7.9


$crystal = 11059200

Declare Sub Lcdwrite(byval Zeichen As Byte)


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

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

Config Lcd = 20 * 4a ' 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
Cls
Dim N As Byte
Do
For N = 1 To 255
Locate 3 , 12
Lcd N
Waitms 500
Cls
Next
Loop
End

Sub Lcdwrite(byval Zeichen As Byte)

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

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

End Sub

Bis jetzt zum nächsten Wert hochgezählt wird, dauert es ganze 4! Sekunden.
Kann mir jemand sagen warum?
Ausserdem: Wenn man das LCD nicht säubert hat man 2 so komische KLammerreihen, woher kommen die?

Danke schonmal für die Hilfe
Marten83

Marten83
21.07.2005, 10:14
Hi!
Hab gerade gemerkt das es wohl doch nicht so wirklich funktioniert!!
Hab wieder die Anfangsprobleme!

Frank
21.07.2005, 10:21
Wie der Kontrast eingestellt wird und welchen Vorwiderstand man bei Licht nutzt steht ja im Datenblatt. Ich würde das nicht als Krankheit bezeichnen wenn das bei dem LCD anders ist als bei anderen.
Die Ansteuerung ist bei dem DIP LCD halt leider etwas verzwickt. Aber wenn ihr die Initialisierungsroutine wie in dem Thread https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10766 nehmt, dann muss es gehn. Die Pins müsst ihr natürlich entsprechen eurer Belegung umschreiben.
Und wenn alles nicht hilft, dann schaut Euch mal das Projekt RN-KeyLCD an. Da steckt ihr das Display rein und dann könnt ihr es ganz einfach mit RS232 oder I2C ansteuern.

Gruß Frank

Vitis
22.07.2005, 10:16
Also,

ich hab dann doch wieder auf die LIB zurückgegriffen und mein Layout etwas geändert. hab nicht mehr PortA.4 - PortA.7 sondern A.0 - A.3 verwendet für die DB-Leitungen, noch die RS und E auf Port D, die Lib angepasst und siehe da es funzt.

Den Kontrast hab ich per 5K Poti Mittelabgriff und Poti zwischen +5 und GND, funzt auch.

Das RN-Projekt find ich gut, nur ists für die Anwendung, die mir vorschwebt einfach zu sperrig. Wenn ich das LCD sockle kann ich darunter den Mega16 einlöten, das spart enorm Platz auf dem Layer

Marten83
23.07.2005, 12:52
Hi Vitis!

Sag mal, könntest du bitte mal kurz genau beschreiben wie du das mit der lib gemacht hast und welche du genommen hast?
Kenne mich damit nur wenig damit aus und würde es gerne genauso machen.
Vielen Dank
Marten83

RAM
23.07.2005, 13:02
Das Problem hatte ich auch schon mit meinem Display an nem Mega32, hatte es erst an PD0 - PD5 hängen, hat auch nicht funktioniert, habs dann auch mal an PA0 - PA5 gehängt und da hats einwandfrei hingehauen. Ist schon komisch.

Gruß,

Martin

23.07.2005, 23:07
Herzlichen Dank - ich war auch schon am Verzweifeln, weil das Display irgentwie absolut nicht funzen wollte. Bis man mich vom RC-Line-Forum mal hierhin verwiesen hatte. Ich habe das jetzt gerade ausprobiert - und endlich läufts...

Ich habe das jetzt so gemacht: - Das Programm zählt in jedem Durchlauf eine Integervariable um 1 rauf beginnend bei -100 und gibt diese in einem Text auf den 4 Zeilen des Displays aus....


$regfile = "m16def.dat" 'Mega16
$crystal = 3686400

Declare Sub Lcdinit
Declare Sub Lcdwrite(byval Zeichen As Byte)

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


Dim H As Integer
H = -100

Cls

Do
Locate 1 , 1
Lcd "1H: " ; H ; "m"
Locate 2 , 1
Lcd "2H: " ; H ; "m"
Locate 3 , 1
Lcd "3H: " ; H ; "m"
Locate 4 , 1
Lcd "4H: " ; H ; "m"
Incr H
Loop



Sub Lcdinit
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
End Sub


Sub Lcdwrite(byval Zeichen As Byte)

' Höherwertiges Nibble setzen
If Zeichen.4 = 1 Then Porta.0 = 1 Else Porta.0 = 0
If Zeichen.5 = 1 Then Porta.1 = 1 Else Porta.1 = 0
If Zeichen.6 = 1 Then Porta.2 = 1 Else Porta.2 = 0
If Zeichen.7 = 1 Then Porta.3 = 1 Else Porta.3 = 0
' Höherwertiges Nibble übertragen
Portd.5 = 1 'E setzen
Waitms 1
Portd.5 = 0 'E rücksetzen
Waitms 1

' Niederwertiges Nibble setzen
If Zeichen.0 = 1 Then Porta.0 = 1 Else Porta.0 = 0
If Zeichen.1 = 1 Then Porta.1 = 1 Else Porta.1 = 0
If Zeichen.2 = 1 Then Porta.2 = 1 Else Porta.2 = 0
If Zeichen.3 = 1 Then Porta.3 = 1 Else Porta.3 = 0
' Niederwertiges Nibble übertragen
Portd.5 = 1 'E setzen
Waitms 1
Portd.5 = 0 'E rücksetzen
Waitms 1

End Sub


Wenn andere Pins benutzt werden, muß das dann natürlich angepaßt werden. Also Danke daß ich das jetzt auch ordentlich am laufen haben kann...

Marten83
25.07.2005, 08:29
Hallo!

Hat jemand mehr Erfahrung wenn man das ganze mit einer eigenen Library macht?
Hab es so gemacht und mein Problem ist, das ich zwar Text wunderbar anzeigen lassen kann, es aber bei ner Variablen (ADC) überhaupt nicht funktioniert. Er zeigt keine Zahl und an der falschen Stelle an.

Marten83

Vitis
25.07.2005, 11:15
Also ich hab mal n lib gefunden und verwende das auch.

wie ich das mach findet Ihr unter:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=5810&highlight=