PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD funktioniert nicht



quad
20.09.2005, 16:09
Hallo

Ich hoffe Ihr könnt mir helfen

Ich habe an meinem ATmega162 mit 11,0592MHz Quarz das gleiche LCD wie bei RNKeyLCD
Leider tut das LCD bei mir noch keinen Mucks...

Ich weis auch nicht ob ich es korrekt verdrahtet habe bzw. den richtigen BASCOM Code drauf habe.

Hier der Link zum Datenblatt:
http://www.robotikhardware.de/download/eadip204_datenblatt.pdf

Das Display betreibe ich im 4Bit Modus.
D0-D3 habe ich an GND gelegt. D4 bis D7 mit dem AVR verbunden. Stromversorgung, E(Enable) und RS sind ebenfalls mit dem AVR verbunden. Die LED Beleuchtung brauche ich ja noch nicht
Zu den restlichen Pins noch kurze checks ob ichs richtig gemacht habe.

VEE; Kontrastspannung - Im Datasheet ist eine Schaltskizze zum Betreiben von VEE mit Poti und 27kOhm Widerstand eingezeichnet. Im Schaltplan von RNKeyLCD, den ich nun zum debuggen nutze fehlt dieser Widerstand. Was nun?

R/W (Read/Write) habe ich nicht mit dem AVR verbunden sondern auf Masse gelegt. Ist das korrekt?

RES (Reset, Interner 10K Pullup) habe ich gar nicht angeschlossen. Oder muss der irgendwo ran? Und was macht dieser Reset?

Ansonsten hier ein ganz einfacher BASCOM Code damit mir das LCD was anzeigen soll. Ich weis auch hier nicht ob er korrekt ist.



$regfile = "m162def.dat"
$crystal = 11059200

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

Cls

Portb = 63

Do

Locate 1 , 1
Lcd "Hallo"
Waitms 5000
Loop
End

Aber wie gesagt, das CD stellt sich tot, keine Kontrastbeleuchtung an, nichts....

Murus
20.09.2005, 16:52
Hmm, meiner hat etwas weniger Inhalt... (Mega8)

Config Lcd = 20 * 4
Config Lcdpin = Pin , E = Portb.0 , Rs = Portb.1 , Db7 = Portb.5 , Db6 = Portb.4 , Db5 = Portb.3 , Db4 = Portb.2
waitms 10 (damit es initialisieren kann, ohne das gings bei mir nicht...)

RW hab ich auch auf Masse.

Gruss
Mario

quad
20.09.2005, 19:56
Leider half das bei mir auch nichts :(
könntest du mal den kompletten Code geben damit der bei mir schonmal stimmt.

Murus
20.09.2005, 20:21
Das ist der komplette Code bei mir, um das LCD einzustellen.

Dann noch
cls
locate 1,1
lcd "Hello World

End

und fertich

Marco78
20.09.2005, 20:41
Config Lcd = 20 * 4
Config Lcdpin = Pin , E = Portb.0 , Rs = Portb.1 , Db7 = Portb.5 , Db6 = Portb.4 , Db5 = Portb.3 , Db4 = Portb.2
Das sollte eigentlich reichen. Bascom erkennt damit schon selbst das es sich um 4Bit handelt usw.
Mit Cls wird das Display initalisiert. Eigentlich ist waitms 10 völlig überflüssig, weil Bascom schon die benötigen Zeiten ausrechnet und mehr als genug Reserve dazu zählt.
Ich glaube auch ganz fest dran, irgendwo mal gelesen zu haben, das wenn kein CLS im Programm steht dann sobald der erste LCD-Befehl auftaucht (also irgendein Befehl der auf's Display zugreift) ein Code eingefügt wird um das Display zu initalisieren.
R/W muss auf Masse!
Außer wenn du das Busyflag auslesen willst. Aber das ist n anderes Thema.

VEE kannst du zum probieren auch erstmal auf Masse legen. Damit hast du den maximalen Kontrast.
Die erste und dritte Zeile müssen dann nach anlegen der Versorgungsspannung komplett schwerz aufgefüllt erscheinen. Was das schonmal klappt hast du so gut wie gewonnen!

RES ist für solche Display eher untypisch. Aber der muss auch auf Masse liegen so wie ich das Datenblatt deute.

EA-Display sind eigentlich ganz tolle Displays. Normalerweise ist es wirklich Qualität, was man da kauft. Aber (und das steht auch im Datenblatt) da ist kein HD44780 Controller drauf verbaut. Der verwendete KS0073 ist zwar nahzu kompatibel zum HD44780, aber nur nahzu und nicht völlig 100%ig. (Ist wie mit SPD und Union. Wenn du SPD mit der Union regieren will, würden alle Sitze zählen, aber wenn es um die Einladung zu Gesprächen geht, zählen nur die Sitze der einzelnen Parteien ;))

Solange du noch keinen Kontast hast und die schwarzen Balken siehst musst du den Fehler erstmal da suchen. (Wie gesagt, VEE mal auf GND legen)
Danach wirst du aber sicherlich immer noch das Problem haben.
Ich glaube einer der Unterschiede der beiden Kontroller ist die Initalisierungssequenz. Ich hab dir mal 4 Links rausgesucht. Gelesen habe ich sie nicht, aber ich denke, mind. einer wird dir dabei helfen können.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=9925&highlight=ks0073
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10944&highlight=ks0073
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=4863&highlight=ks0073
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=6522&highlight=ks0073

quad
21.09.2005, 00:35
Vielen Dank :)

Nur langsam wirds wirklich Frustbastelei...

Erst hab ich ewig rumprogrammiert...irgendwann erschienen dann wie durch Zufall auf dem LCD die heiligen Worte "Hallo Welt".

Voller Freunde hab ich dann das Sample runtergehauen, meinen eigentlichen Code drauf und seit dem ist die LCD Ansteuerung wieder tot.

Auch wenn ich nun den alten Code draufspiele geht absolut nichts mehr, nada...

Ich habe den AVR schon auf Funktion getestet. Er hat keine Schäden, führt jeden normalen Befehl (Tasterdruck -> LED leuchtet) korrekt aus, sofort aber das LCD ins Spiel kommt scheint alles zusammenzubrechen und er macht gar nichts mehr auch nicht mehr das mit dem Tasterdruck.

Ich versteh das nicht wieso er nun den alten Code nicht mehr ausführt...
Ich habe bei allen relevanten Pins nochmal den Kaltlötstellentest gemacht. Alle Lötstellen sind ok!

Man muss sagen, dass bei mir BASCOM auch ein bissl spinnt, hängt sich manchmal auf aber wenn es dann mal speichert, dann durchaus brauchbaren Code.

Ich habe hier mal meinen LCD-Code. Bitte checkt den Mal, das muss doch gehen!!




$regfile = "m162def.dat"
$crystal = 11059200

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

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

'Config Lcd = 20 * 4a 'ich habs mit und ohne versucht, nichts geht...

Waitms 100

Call Lcdinit

Cls



Do

Lcd "Hallo Welt" 'Displayausgabe für den Benutzer
Waitms 5000
Cls 'Display löschen
Loop

Sub Lcdinit
Call Lcdwrite(&B00101100)
Call Lcdwrite(&B00001001)
Call Lcdwrite(&B00101000)
Call Lcdwrite(&B00000110)
Call Lcdwrite(&B00001100)
End Sub

'Schreibt die Initialisierungs - Bits zum LCD

Sub Lcdwrite(byval Zeichen As Byte)

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

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

End Sub


End

Das ist der Code den ich eigentlich will, wegen dem Zeileproblem dieses LCD-Treibers.

Aber selbst das Programm das vorher funktionierte geht nicht mehr:




'================================================= ==============================
' Compiler
'================================================= ==============================
$regfile = "m162def.dat"
$crystal = 11059200
'-------------------------------------------------------------------------------


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

Cls
Cursor Off Noblink


'_________________________________________________ _____________________________



Do
Cls
Lcd "Hallo"
Waitms 2000

Loop
End


Wie gesagt, ich vermute sehr sehr stark dass es ein softwaretechnisches Problem gibt, denn vor dem ersetzen dieses Codes durch einen anderen funktionierte das Ding 1A. Das LCD scheint auch zu gehen. Man kann am Poti 1A den Kontrast verändern. Das ging ganz am Anfang noch nicht.

quad
21.09.2005, 15:17
Könnt ihr mir mal sagen ob die Pins zur Steuerung des LCDs die mit dem AVR verbunden sind bei euch dort Spannung anliegt wenn ihr die Stromversorgung des LCD kappt?


Bei mir ist es so, dass nur Spannung an den Pins (Db4-Db7 sowie E und RS) anliegt wenn ich das LCD einschalte...Hat das seine Richtigkeit oder ist das bei mir ein Fehler. Denn eigentlich muss doch der AVR Signale senden auch wenn das LCD aus ist, das weis der AVR ja nicht nehme ich mal an?

Marco78
21.09.2005, 20:50
Noch ein Tipp zu LCDs. Die brauchen ja immer zwei Spannungen. Einmal die Betriebsspannung und die Kontrastspannung. Die Kontrastspannung darf niemals vor der Betriebsspannung angelegt werden.
Zuerst B.Spannung und dann K.Spannung oder beide zur gleichen Zeit. Beim ausschalten das gleiche in umgekehrter Reihenfolge. Erst K.Spannung weg, dann B.Spannung. Oder beide gleichzeitig.

Das mit den Spannungen versteh ich nicht so ganz was du da meinst.
Es liegt Spannung an, obwohl keine Betriebsspannung da ist? Ich würd mir das patentieren lassen :D

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10766
Hast du den Beitrag schon gelesen? Ist ein Link aus einer der Beiträge, die ich dir rausgesucht habe.

Javik
21.09.2005, 20:56
Ich plag mich auch grad mit exact dem selben Problem rum.
Hab nen KS0076B, der lässt sich mit Bascom einfach auch nicht ansteuern.
Es liegt wohl am Initialiesieren. Ich glaub der erste Link der oben geposteten is schon gar nicht schlecht.
Man muss das LCd einfach *reusper* anders Initialisieren. Die machen das über eine LIB und nich direkt über Bascom (vlt is das zu langsam?!)
Ich fusel da jetzt schon ne Woche rum, aber bin leider auch noch nciht auf eine Lösung gekommen.
Aber die Hoffnung stirbt ja zuletzt... ^^

Gruß Javik

Marco78
21.09.2005, 21:10
Es liegt wohl am Initialiesieren.
Es liegt da 100%ig dran! Und das sind die paar Prozente, die dem KS0073 am HD44780 fehlen ;)

Der letzte Link von mir ist aber einer, wo das Problem gelöst wurde. Den einfach mal durchlesen.

Javik
22.09.2005, 10:42
Hmm mir is grad irgendwie aufgefallen, dass ich ja nen KS0076B hab. IS bei dem die Initialisierung etwa nochmal anders? o.0
Weil bei mir diese Routinen die in dem Link beschrieben werden auch nicht funktionieren.

Gruß Javik

quad
22.09.2005, 20:51
Was mich dann aber wundert...
wieso zeigte es bei mir einmal ein "Hallo Welt" an??
Genau DAS verstehe ich nicht. Hatte das LCD da seinen guten Tag oder wie?

Marco78
22.09.2005, 21:48
Hatte das LCD da seinen guten Tag oder wie?
Ich denke eher der AVR hatte einen schlechten Tag. Hat vielleicht einen Takt verschluckt und dann passte des Timing zufällig :D

http://www.excess-solutions.com/SpecSheets/KS0076B.pdf
Wenn du das Datenblatt mit dem des KS0076 vergleichst weisst du ob es unterschiede gibt.
Geht mal auf www.lcdhype.de.vu Schau dort, wie das Display am PC angeschlossen wird und was man sonst so machen muss. Wenn's am PC mit der Software nicht geht, liegt es am LCD. Ansonsten ist es ein Anwendungsfehler beim AVR.

Oder du schaust die das Smple lcd4busy.bas von BASCOM an. Das auslesen des Busyflags und der Code zum KS könnten das Problem evtl auch lösen.
Oder in Google mal KS0076B und BASCOM eingeben. Ggf die Suchanfrage etwas abändern.

quad
22.09.2005, 23:02
Danke dem werde ich nachgehen...
Nein an einem Versehen kann es nicht liegen.
Das war so....
Ich hab nen Code aufgespielt und nach einiger Zeit 3-4 Sekunden warten erschien die Anzeige...!! Dann hab ich lediglich im Code als Anzeigetext anstatt "Startet!","Booting..." geschrieben, übertragen und schon hies es Rien Ne Va Plus...

Was mir auch auffiel...irgendwie kommt es bei mir drauf an ob ich die Basisspannung des LCD beim Übertragen zum AVR an habe oder nicht.
Habe ich das LCD aus heist es meistens "flash memory error", habe ich es an sagt er nüscht, aber der Code geht trotzdem kein Stück...

Was ist da bitteschön los?

Marco78
22.09.2005, 23:32
PB5 auf dem bei dir laut deinem Code Db7 liegt ist einer der ISP-Pins. Db7 ist auch zufällig der Pin auf dem das Busyflag gesendet wird. Das Busyflag muss aber abgefragt werden. Ich kann mir zwar nicht vorstellen, das zufällig dieser Code beim flashen gesendet wird, aber wer weiss?! ODer der Eingang des LCDs stört das übertragen?

Kannst du das LCD nicht auf andere Pins legen? Zumindest nur um auszuprobieren ob das LCD was anzeigt sollte das ja möglich sein.

Die ISP-Pins sollten nur dann belegt werden, wenn man weiss, was man da tut. So ein µC kann ja auch mal in einer großen Maschine eingebaut sein. Da kann es dann passieren, das sich ein Motor in Bewegung setzt weil man die Folgen nicht bedacht hat. Die nächste Folge ist dann die Befragung der Berufgenossenschaft. Warum musste der Arbeiter seine Hand verlieren? Wer hat die Schaltung entworfen? Hat derjenige eine gute Versicherung?
Auch bei Tastern mus man aufpassen. Wenn der Taster zufällig beim flashen gedrückt wird, kann man nochmal von vorne anfangen.
Oder der Taster ist so geschaltet, das es garnicht erst möglich ist ein Programm zu übertragen.
LEDs sind in der Regel ungefährlicher. Da muss man nur aufpassen, das die Strombelastung für den Programmieradapter nicht zu hoch wird.
Ist es jedoch eine Laserdiode die auf einmal leuchtet, obwohl die Schutzmassnahmen außer Kraft gesetzt sind können wieder Fragen aufkommen ;)

Das soll dich nicht entmutigen, die Pins mit in einer Schaltung einzubeziehen, aber man muss bedacht vorgehen.

quad
23.09.2005, 14:14
Der kritische Pin fiel mir auch vor ein paar Tagen auf und wurde auf PIN A0 umgelötet. Fazit: Nichts hat sich getan. Gleich wie vorher

Marco78
23.09.2005, 18:18
Gleich wie vorher
Auch mit den Meldungen beim flashen?

quad
23.09.2005, 21:24
Ja, alles gleich, wirklich alles...also daran kanns nicht liegen.

Marco78
23.09.2005, 22:10
Verwendest du auch tatsächlich einen 11,0592MHz Quarz? Ist der AVR 100%ig auf externen Quarz gestellt?

quad
23.09.2005, 22:57
Es handelt sich ganz sicher um den genannten Quarz. Die Fuse- und Lock-Bits stehen hier.

https://www.roboternetz.de/phpBB2/viewtopic.php?t=12768

Oder soll ichs mal versuchen die Standardeinstellungen herzunehmen und es damit zu probieren?

Marco78
24.09.2005, 10:04
Zu erkennen, ob es der richtige Quarz ist, ist ja auch nicht weiter schwer.
Schwerer wird es bei den Fusebits. Aus dem Beitrag geht nicht klar hervor, das der AVR wirklich auch external Crystal steht.
Bei den Fusebits ist es wie mit dem LCD. Erst geht's nicht, dann geht's auf einmal, ohne das was gemacht wurde.
Wenn ein Quarz am AVR ist, bedeutet das ja noch nicht, das er nicht trotzdem den internen nutzt.
Du kannst ja mit Bascom die Bits auslesen. Da steht im Klartext was eingestellt ist.

quad
24.09.2005, 10:40
Okay hier die Bits:


Lock Bits:
LB1 - X
LB2 - X
BLB01 - X
BLB 02 - X
BLB 11 - X
BLB 12 - X

Fuse Low Bits
CKSEL0 - X
CKSEL1 - X
CKSEL2 - X
CKSEL3 - X
SUT0 - O
SUT1 - X
CKOUT - X
CKDIV8 - O

Fuse High Bits

BOOTRST - X
BOOTSZ0 - O
BOOTSZ1 - O
EESAVE - X
WDTON - X
JTAGEN - O
0CDEN - X

Fuse Ex Bits

BODLEVEL0 - O
BODLEVEL1 - O
BODLEVEL2 - O
M161C - O

Ich sehe gerade dass die Fuse Ex Bits alle deselektiert sind....komisch?! Eigentlich sollte das nicht der Fall sein

30.09.2005, 23:55
Das Display betreibe ich im 4Bit Modus.
D0-D3 habe ich an GND gelegt. D4 bis D7 mit dem AVR verbunden. Stromversorgung, E(Enable) und RS sind ebenfalls mit dem AVR verbunden. Die LED Beleuchtung brauche ich ja noch nicht


Probier mal Bitte den 8 Bit Modus, bei mir hat es so gefunzt ](*,)