Forum: Projekte & Code LCD - Ansteuerung


von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Hi Leute. Anbei ein kleines Progi um ein LCD anzusteuern. Das Programm 
hab ich ausführlich dokumentiert so dass es leicht verständlich ist.

Ein kleines Bsp. (main.c) welches zeigt wie das LCD angesprochen wird 
ist auch dabei.

lg CriGri

von Koko Lores (Gast)


Lesenswert?

Wieso schreibst Du nicht hier etwas genauer, worum es sich handelt?

von Cri G. (crigri)


Lesenswert?

Sorry ,hab nicht daran gedacht.
Es handelt sich um ein Programm welches für LCD's mit KS0066 / HD44780 - 
Contollern geeignet ist. Das Programm hab ich für einen 8051er 
geschrieben. Folgende Funktionen sind im Progi enthalten:
-> Initialisierung
-> Ausgabe eines Strings  einzelner Zeichen  eigene Zeichen
-> Funktion zum erstellen eigener Zeichen

Ich habe das Progi so geschrieben, dass der 8051er Bytewise Operationen 
ausführt da ihm das besser "liegt" als das Bit für Bit ansprechen.
Die Funktionen set_address und set_data() hab ich aus 
vereinfachungsgründen mit eingebunden. Ich hoffe das das nun genug 
Erklärung war.

lg CriGri

von Peter D. (peda)


Lesenswert?

Dein Programm enthält mehrere gravierende Fehler:

1.
Die Init-Sequenz entspricht nicht dem Datenblatt. Es kann funktionieren, 
wenn das LCD sauber resettet (schnell und monoton ansteigende VCC), muß 
aber nicht.

2.
Beim Busy-Lesen werden D0..D6 kurzgeschlossen (P1=  0x80;), das führt zu 
erhöhter Stromaufnahme und kann die Lebensdauer des LCD drastisch 
verkürzen.

3.
Die Bus-Timings werden nicht eingehalten.
Laut Datenblatt müssen RS und RW vor E=1 gesetzt werden (>40ns) und nach 
E=0 gehalten werden (>10ns).


Wundere Dich also nicht, wenn es mit anderen Displays, MCs, Spannungen, 
Temperaturen, Frequenzen Probleme gibt.


Peter

P.S.:
Ich benutze beim AT89C2051 immer den 4Bit-Modus (6 Portpins), denn mit 
nur 4 freien Portpins (15-11) kann man ja nicht mehr viel anfangen.

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Hallo Peter.
Erstmals vielen Dank für deine Ausbesserungen.

Habe das Progi mal abgeändert. kannst du nochmal drüber schauen und mir
sagen was ich vielleicht noch verbessern könnte (außer dem 8-Bit Modus.
den werd ich später ändern) ?!

Bezüglich den Timings: Ich benutze einen 11.059MHz Quarz. Damit geht 
sich das mit RS & R/W >40ns mit einem Taktzyklus aus oder?

Lg CriGri

von Cri G. (crigri)


Lesenswert?

@Steven

In " set_address(0x3b); " ist es drinnen. Es ist auch das erste 
Kommando. Im Datenblatt wird die init (8-Bit) so durchgeführt (KS0066U 
Controller).

mfg

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Da hast du recht (laut Datenblatt). Das Datenblatt welches ich benutze 
(auch KS0066U) schreibt mir aber genau diese Art der Initialisierung 
vor. Ich hängs mal dran. Relativ knapp am Ende findest du die 
Init-Vorschrift.
Entweder ist deines richtig oder beide und ich hab einfach Müll geprogt.

lg

von Cri G. (crigri)


Lesenswert?

okay :) hast mich überzeugt. Danke.
Komisch ist allerdings, dass dieses Progi schon bei 3 LCD's (auch 
HD44780) einwandfrei rennt. hmm....wie gibts denn das?

lg

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Habe das Progi nun umgeändert (Anhang) aber jetzt geht nichts mehr.
Scheint so als ob das LCD zwar initialisiert ist aber ausgeben lässt
sich nichts mehr. Warum? Habe mich an das Datenblatt gehalten.

lg

von Cri G. (crigri)


Lesenswert?

keine Antwort mehr? Ich komm net drauf was net passen könnte.

von Cri G. (crigri)


Lesenswert?

das hab ich vorher auch entdeckt und schon geändert und getestet aber es 
funzt net. hmm... ich schnalls net. Mit meiner "Falschen" Routine ist 
alles gegangen und nu nix mehr. Siehst du sonst noch nen Fehler?

lg

von Peter D. (peda)


Lesenswert?

Cri Gri wrote:
> das hab ich vorher auch entdeckt und schon geändert und getestet aber es
> funzt net.

1
#include <AT892051.h>
2
#include "lcd.h"   
3
#include "Func.h"    // wait()
4
#include "MyTypes.h"

Ja, mit Deinem Code kann keiner was anfangen.

Es fehlen 4 Includes (AT892051.h, Func.h, func.h, MyTypes.h).

Warscheinlich ist Dein wait() zu kurz.


Peter

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Hier sind die Includes. Vielleicht kannst mir ja weiter helfen.
Die 2051er ist die Originale von µVision2
lg

von cri (Gast)


Lesenswert?

Kann mir vielleicht wer weiterhelfen?

von Peter D. (peda)


Lesenswert?

cri wrote:
> Kann mir vielleicht wer weiterhelfen?

Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38.


Peter

von Cri G. (crigri)


Lesenswert?

Peter Dannegger wrote:

> Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38.

Das ist das Function-Set Kommando für 8Bit,2Zeilen und 5*8Font.
Das kann wohl nicht der Fehler sein oder?

lg cri

von S. W. (Gast)


Lesenswert?

Schreib doch mal die while-Funktion (busy-check) in eine 
ANSI-C-leserlichen Schreibweise und nicht im Perl-Dialekt. Die 
Schreibweise mag zwar cool sein und in der Schule gut ankommen, sie ist 
aber unnötig und verleitet zu Fehlern.

Vielleicht erkennst du dabei was.

von Cri G. (crigri)


Lesenswert?

Steven Wetzel wrote:
> Schreib doch mal die while-Funktion (busy-check) in eine
> ANSI-C-leserlichen Schreibweise und nicht im Perl-Dialekt. Die
> Schreibweise mag zwar cool sein und in der Schule gut ankommen, sie ist
> aber unnötig und verleitet zu Fehlern.

wieso cool? das hat doch nichts mit "cool" zu tun. Und was ist überhaupt 
ein Pearl - Dialekt?

Sorry aber ich weiß echt nicht was du meinst. Ich find die Funktion net 
sonderlich "cool" aber Fehler sehe ich auch nicht unbedingt.
P1 wird auf Eingabe gesetzt. R/W auf 1,DB7 ausgelesen,High-Low Flanke an 
EN und P3 löschen.

von Peter D. (peda)


Lesenswert?

Cri Gri wrote:
> Peter Dannegger wrote:
>
>> Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38.
>
> Das ist das Function-Set Kommando für 8Bit,2Zeilen und 5*8Font.
> Das kann wohl nicht der Fehler sein oder?
>
> lg cri

Probiers aus.

Ich denke schon, daß es wichtig ist, den richtigen Typ einzustellen.


Peter

von Semmel (Gast)


Lesenswert?

Hi Christian,

3x 0x38 gilt für eine 8 BIT initialisierung. Insgesamt kann man das 
Programm durchaus ein bischen mehr strukturieren.

PS: was macht der Robbi ?

von Cri G. (crigri)


Lesenswert?

Hi Semmel !!!
Freu mich wieder mal was von dir zu hören. Wie gehts dir denn?

Wie meinst du
>Insgesamt kann man das Programm durchaus ein bischen mehr strukturieren.

das? Deine Tipps waren in der Vergangenheit schon sehr hilfreich!!  :)

@Steven
>Ob wir jemals wieder etwas von ihm hören?

Ja "er" meldet sich wieder zurück ;)
Beim Busy-Check hast du dich wohl auf das High-Setzen des EN-Pins 
bezogen , oder täusch ich mich ?

@Peter
>Ich denke schon, daß es wichtig ist, den richtigen Typ einzustellen.

Ich versteh nicht was du meinst. Ich wiederhole 3mal die 0x30(laut 
Datenblatt) und dann setz ich 0x38 -> 2Zeilen, und 5*8Font !
Ab zwei Zeilen muss das "Bit F" nicht gesetzt werden da das LCD bei 2 
Zeilen nur 5*8 kann.

lg cri

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

Anbei das C-File

@Steven
>Perl-Dialekt, eine Dialekt, in dem man Funktionen in möglichst
>komplizierter und unleserlicher Form darstellt.

Nichts für ungut aber mein Progi is doch net so "verschlüsselt". Da hab 
ich hier im Forum schon einiges gesehen wo der Perl-Dialekt bis ins 
letzt ausgereizt wurde.

von dieter (Gast)


Lesenswert?

>>  P3=P1=0xff;

meinst du das geht?

dieter

von Cri G. (crigri)


Lesenswert?

ja

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

Hi Christian,

damit die Verwirrung nicht zu groß wird, Semmel = Joe, Joe = Semmel ;-))

Was ist gemeint mit Struktur ? Schau dir mal folgenden Thread an:

Beitrag "Wie mache ich eine Textausgabe 8Bit auf Display?"

hier habe ich mal einen Displaycode mit einem anderen Forumteilnehmer 
erarbeitet (für nen AVR und im 4 BIT mode). Wie dem auch sei, eine 
Struktur ist hoffentlich zu erkennen. Am Ende des Threads habe ich dann 
meinen Code mal reingestellt, schaus dir mal an.

Im Prinzip verwende ich nie einen 8 BIT LCD Bus, reine Verschwendung. 4 
BIT ist mir schon zuviel. In der Regel verwende ich dann lieber noch nen 
Schieberegister und brauch dann noch 3 Leitungen. Im Anhang mal nen 
"quick & dirty" fürs Schieberegister. Ich hab mal bewußt C & H File in 
eine Tüte gesteckt, hoffe dann kommt rüber was ich mit Struktur meine. 
Der Code ist diesmal für nen 8x51.

Zu deinem Code, 3x 0x38 reicht für die Initialisierung, schaus dir an.

Gruß,

Joe Semmel alias Bernd ;-))

von Cri G. (crigri)


Lesenswert?

kannst mir mal erklären warum ich nur 3*0x38 brauche? Im datasheet is 
noch die
"eig" function-set drinn usw.
Warum nur 3*0x38??

von Joe (Gast)


Lesenswert?

Probiers aus ;-))

Häng mal dein Datenblatt hier herein.

Übrigens, teste mal den code und laß das Schieben weg (hast ja kein 
Schieberegister. Der Code läßt sich bei 8 BIT auch noch deutlich kürzen.

von Joe (Gast)


Lesenswert?

Hab das Datenblatt gesehen, war ja schon im Thread ;-)) bleib dabei, 
0x38 ;-))

von Cri G. (crigri)


Lesenswert?

so. ich habs nu mal umgeschrieben. ich gehe es später testen und geb dir 
dann beschied über jenes was nun nicht geht :D

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

jipi :)

Es geht nu. Ich häng mal mein "unstrukturiertes" ;) Progi an. Vielleicht
hast ja Zeit es dir mal anzusehen Semmel = Joe = Bernd :D
Aber ich weiß noch immer nicht warum 3*0x38 genügt :)

Vielen Dank für die Hilfe. Auf dich ist Verlass :)

@Peter
...auch der Stromverbrauch ist gesunken!

@Steven
Dir auch vielen Dank. Das mit dem Busy hab ich völlig übersehen.
lg Cri

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

...und die 4_Bit Version funktioniert auch schon :) freufreu :)

Vielen Dank Joe!

von Joe (Gast)


Lesenswert?

>> so. ich habs nu mal umgeschrieben. ich gehe es später testen und geb dir
>> dann beschied über jenes was nun nicht geht

;-)) kein Kommentar ;-))

Nun, warum geht 0x38, weils so im Datenblatt steht, ich weiß nicht wie 
ich es einfacher erklären soll. Lese dir das DB noch einmal in Ruhe 
durch und mach dir eine Tabelle für die BIT Kombinationen, vielleicht 
kommst du selbst drauf.

Die 4 BIT Variante gefällt mir, gut gemacht.

von Cri G. (crigri)


Angehängte Dateien:

Lesenswert?

klar das sie dir gefällt :) is auch deiner ähnlich.

hab jetzt set_address und set_data gegen eine einzige Funktion lcd_write
ersetzt da sich die beiden sehr ähnlich waren.

lg cri

von Sebi (Gast)


Lesenswert?

Soooo....folgendes:
Ich habe das Display 64128A mit einem controller KS0108. nun möchte ich 
durch meinen pic 16f ansteuern. ist dies mit diesem programmcode auch 
möglich und wenn was muss ich änder bzw. machen...

ich bin verzweifelt;-)

von Joe (Gast)


Lesenswert?

Im Prinzip ja, I/O's und Timing solltest du anpassen. Ganz ohne Arbeit 
gehts nicht.

>> ich bin verzweifelt;-)

Warum ?

von Thilo (Gast)


Lesenswert?

kann mir mal jemand sagen wie ich das Zeug auf den Mega8 krieg? Also die 
c.* und h.* Dateien!! Kann damit irgendwie nix anfangen /-: grml

von Joe (Gast)


Lesenswert?

Wieso nicht, weil du keiner Erfahrung mit C hast, weil du nicht lesen 
kannst ? sorry, der mußte jetzt mal sein.

Weiter oben schon erwähnt:

Beitrag "Wie mache ich eine Textausgabe 8Bit auf Display?"

Am Ende des Thread mein Code für nen ATTINY, sollte also kein Pronlem 
sein den auf nen Mega 8 laufen zu lassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.