Archiv verlassen und diese Seite im Standarddesign anzeigen : 4x20 LCD KS0073 EA-DIP204 ich dreh durch
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
Schau mal ins Projektforum
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10766
Der Thread sollte dir helfen
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
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, 15:00
Hatte mich nicht eingellogt, sorry
Marten83
21.07.2005, 09: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, 11:14
Hi!
Hab gerade gemerkt das es wohl doch nicht so wirklich funktioniert!!
Hab wieder die Anfangsprobleme!
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
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, 13: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
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
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, 09: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
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=
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.