www.mikrocontroller.net

Forum: Projekte & Code LCD - Ansteuerung


Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Koko Lores (Gast)
Datum:

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

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine Antwort mehr? Ich komm net drauf was net passen könnte.

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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

#include <AT892051.h>
#include "lcd.h"   
#include "Func.h"    // wait()
#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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

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

Autor: cri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir vielleicht wer weiterhelfen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cri wrote:
> Kann mir vielleicht wer weiterhelfen?

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


Peter

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steven Wetzel (steven)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Semmel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  P3=P1=0xff;

meinst du das geht?

dieter

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Autor: Joe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ;-))

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe (Gast)
Datum:

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

Autor: Cri Gri (crigri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...und die 4_Bit Version funktioniert auch schon :) freufreu :)

Vielen Dank Joe!

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cri Gri (crigri)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sebi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;-)

Autor: Joe (Gast)
Datum:

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

>> ich bin verzweifelt;-)

Warum ?

Autor: Thilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.