Forum: Mikrocontroller und Digitale Elektronik HD44780


von gckoe (Gast)


Lesenswert?

Hallo

Oh nein, nicht schon wieder eine HD44780-Beitrag.
Ja, ich habe die Suchfunktion verwendet.

Ich habe einen Display 4x20 HD44780 Kompatibel von Embedit 
(http://shop.embedit.de/product__250.php)
Datenblatt: http://www.embedit.de/dmdocuments/pc2004cp1.pdf

An einem Board mit einem ATmega32 drauf. Ansteuern möchte ich den mit 
der LCD-Lib von Fleury.

Ich hab den Display an dem Board angeschlossen. Wenn ich jetzt aber den 
anschalte, dann zeigt er das: http://gianclaudio.muasch.com/DSC05569.JPG 
. Eigentlich sollte dann Text dort kommen.
Was mache ich Falsch?

lg
gckoe

von holger (Gast)


Lesenswert?

Vieleicht hast du einfach nur den Kontrast zu weit
aufgedreht ?

von gckoe (Gast)


Lesenswert?

Nein, daran liegts nicht. Ich habe schon ewigs rumgeschraubt an dem 
Kontrastpoti.

Auszug aus dem Wiki-Beitrag zum HD44780:

Spannung zwischen VSS und VCC, kann auf VSS gelegt, oder via Poti 
angeschlossen werden. Bei großflächigen LCDs oder LCDs für weite 
Temperaturbereiche kann auch eine negative Kontrastspannung nötig sein.

Kann es sein dass mein LCD so grossflächig ist, dass eine negative 
Kontrastspannung nötig ist? Und wie würde ich die Realisieren?
Oder was ist sonst falsch?

von Ulf (Gast)


Lesenswert?

Das Display ist nicht korrekt initialisiert....
1.) Schaltung Hardwareseite überprüfen, ob alle Signale korrekt ankommen
2.) Software anpassen ob richtiges Display gesetzt ist

von gckoe (Gast)


Lesenswert?

Ah
Nachdem ich jetzt alles unschöne sauber neu gelötet habe sieht da schon 
einiges anders aus. Aber es ist bei weitem noch nicht das richtige. 
Jetzt kommt folgendes Bild:
http://gianclaudio.muasch.com/DSC05654.JPG

Dastehen sollte:
LCD Test Line 1
Line 2
Line 3

Die Kontakte habe ich überprüft, die sollten funktionieren.

In der LCD Lib von Fleury steht:
Definitions for Display Size
Change these definitions to adapt setting to your display

#define   LCD_LINES   2
#define   LCD_DISP_LENGTH   16
#define   LCD_LINE_LENGTH   0x40
#define   LCD_START_LINE1   0x00
#define   LCD_START_LINE2   0x40
#define   LCD_START_LINE3   0x14
#define   LCD_START_LINE4   0x54
#define   LCD_WRAP_LINES   0
#define   LCD_IO_MODE   1


In einem roboter-chat wurde mir gesagt diese Angaben könne ich so 
lassen. Stimmt das oder liegt hier der Hund begraben?

von Andreas Kramer (Gast)


Lesenswert?

Da liegt der Hund begraben meine ich mal ^^ du hast 4 Linien und 40 
länge und nicht 2 * 16

Gruß Andreas

von gckoe (Gast)


Lesenswert?

Ach nein. Es gab doch einen Grund das aus dem Code zu kopieren und nicht 
aus dem Internet.
Ich hab das natürlich auf 4x20 umgeschalten (ist 20 breit, nicht 40), 
den rest aber gelassen. Ankopfhau war ein schlechtes post da oben.

von gckoe (Gast)


Lesenswert?

Man könnte denken neuer Tag - neues Glück, ist aber nicht so.
Ich habs heute mit der Lib von Radig versucht. Dann kommt aber wieder 
der das Bild, das ich schon bei 
http://gianclaudio.muasch.com/DSC05569.JPG gesehen habe.

Kann es sein dass ich (in der Fleury-lib) im Bereich
#define   LCD_LINE_LENGTH   0x40
#define   LCD_START_LINE1   0x00
#define   LCD_START_LINE2   0x40
#define   LCD_START_LINE3   0x14
#define   LCD_START_LINE4   0x54
etwas falsch habe?

von Sven S. (Gast)


Lesenswert?

bei interresse kann ich ja mal meinen test code posten der ist evtl für 
anfänger etwas übersichtlicher und einfacher gestrickt.

von gckoe (Gast)


Lesenswert?

Klar besteht interesse. Ist der auch in C programmiert?
Und etwas das einfacher gestrickt ist find ich toll, bis jetzt ist immer 
alles kompliziert.

von Matthias (Gast)


Lesenswert?

Blöde Frage:
------------

Hast Du bei deinem Projekt die Prozessortaktfrequenz richtig 
eingestellt?
Die Lib von Fleury und andere ähnliche verwenden so weit ich eiss einen 
"Eierloop" für das Timing. Dafür muss man dem Compiler die Taktfrequenz 
richtig einstellen. Geht im Makefile bzw. AVR-Studio unter 
Compileroptionen
(jeweils AVR-gcc)

Bei dem zweiten Bild sieht mir das nämlich nach einem Timingproblem aus.

von Hannes L. (hannes)


Lesenswert?

gckoe wrote:
> Klar besteht interesse. Ist der auch in C programmiert?
> Und etwas das einfacher gestrickt ist find ich toll, bis jetzt ist immer
> alles kompliziert.

Warum benutzt Du eigentlich C?
- Beherrscht Du es soooo gut?
- Oder drückst Du Dich vor der Arbeit an der Basis, also vor Assembler,
  den Timing-Diagrammen und anderen Angaben im Datenblatt und deren
  direkte Umsetzung in Programm-Routinen direkt an der Hardware?

Meine LCDs liefen auch nicht immer von der ersten Minute an, tun es aber
inzwischen alle. Allerdings nicht mit irgendwelchen Routinensammlungen 
fremder Herkunft, sondern mit meinen eigenen Routinen, die vermutlich 
ein paar Features weniger haben, aber mit denen ICH umgehen kann.

Ich weiß, dieser Beitrag wird von Einigen als 'nicht konstruktiv' 
angesehen werden, damit muss ich aber leben. Ich will damit sagen: Wer 
nur fremdes Zeugs benutzt, ohne es zu verstehen, muss sich nicht 
wundern, wenn etwas nicht funktioniert.

...

von Bastler (Gast)


Lesenswert?

@Hannes
Da stimme ich zu, eine Initialisierung und Ausgabe für HD44780 in ASM 
selbst zu schreiben ist wirklich kein Hexenwerk. Datenblatt lesen, ne 
Handvoll Bytes ausgeben, dazwischen Delays ...fertig!

Vorallem kann man eine solche Routine immer wieder brauchen.

Ich bin grad an nem GLCD ohne Zeichensatz mit zwei Controllern 
(linke/rechte Hälfte), da mit Tabellen arbeiten ist schon wilder.

von gckoe (Gast)


Lesenswert?

Die blöde Frage ist nicht mal so blöd - es war keine 
Prozessortaktfrequenz eingegeben. Allerdings glaub ich langsam aber 
sicher an ein höheres Wesen, denn jetzt ist wieder das Anfangsbild 
(http://gianclaudio.muasch.com/DSC05569.JPG) kopfschüttel irgendwas 
ist da nciht normal, aber was?

Warum ich C benutze? Weil ich zuerst mal ein Handyboard mit InteractiveC 
hatte, dann aber auf Atmel umstieg und da dachte, wenn ich doch schon IC 
gelernt habe, dann mach ich jetzt mit C weiter. Eine eigene Ansteuerung 
bauen ist mir im Moment zu schwierig, ich hab von der Materie keine 
Ahnung, klar ich kann sie mir zulegen, aber ich möchte jetzt aus dem 
Thread keinen Thread machen ist C oder Assembler besser, sollte man libs 
verwenden oder nicht... sondern mir wäre lieber wenn geholfen würde.

von fubu1000 (Gast)


Lesenswert?

hallo,
@hannes:
da muss ich dir recht geben, ich benutze auch nur selbst geschriebene 
software. da dauert jedes projekt zwar länger^^, aber dafür hat man 
danach was gelernt.

@gckoe:
schau dir mal die LCD-lib im avr tutorial von mikrocontroller.net an!!!
die ist leicht verständlich und gut dokumentiert. spiel damit nen bissi 
rum und dann schreib deinen eigenen code, schon allein aus der sicht des 
lerneffektes!!!


gruss an alle ;-)

von Matthias (Gast)


Lesenswert?

Noch ne blöde Frage:
--------------------

Die Fuses sind auch auf den richtigen Takt eingestellt?

von Sven S. (Gast)


Angehängte Dateien:

Lesenswert?

hier mal mein code.

an alle die jetzt sagen das ist aber "mieser spagetti code" muss ich 
sagen sie haber rech ;-)

hier noch des passende MAIN schnippsel:

int main( void )
{

lcd_init();
lcdprint("Hallo Welt",1);

while(1)
    {}
}

include wirst du noch selber hin bekommen ansonsten. die funktionen 
lcdprint,lcd_write_line und lcd_writeline machen im prinzip alle das 
gleiche mit ein paar keinen unterschieden. mir gefällt aber lcdprint am 
besten. mit den define´s kann man oben die ports und pins der steuer und 
datenleitungen einstellen, aber vorsicht wie gesagt nur ziemlich einfach 
gehalten. das heist wenn die steuerleitungen nicht die ersten 3 sind 
muss man schon die init ändern.

viel spass beim testen

gruss sven

von Roland P. (pram)


Lesenswert?

Ich hab mal ne Frage:
Zeigt das Display direkt nach dem Anschalten der Betriebsspannung (ohne 
Initialisierung!) zwei schwaze Balken in Zeile 1 und 3 an? Wenn nicht, 
liegt der Hund eher im Display begraben als in der Init-Routine

von Sven S. (Gast)


Lesenswert?

@Bastler

ein glcd in asm programmieren ... das wär mir zu blöd... mehr als ein 
lern effect hast du dabei auch nicht.

@Roland Praml
gute idee. auch wenn der schaltplan x mal im netz ist könnte er mal 
seinen posten.

von gckoe (Gast)


Lesenswert?

@Matthias: Die Fuses sind Oke
@Sven: Thx für den Code, ich werd mir den mal ansehen.
Aber ahnscheinend liegt der Hund im Display, denn wenn ich nur 
Betriebsspannung anlege dann sieht man nicht, wenn ich den Kontrast noch 
dazufüge dann sieht man immernoch das gleiche.

von Sven S. (Gast)


Lesenswert?

@gckoe

ich denke mal du hast am kontrast ein poti darn. kommt da nix wenn du 
daran drehst.
wär nicht schelcht wenn du mal deine schaltung herzeigen würdest.

von gckoe (Gast)


Lesenswert?

Am Kontrast ist ein Poti dran, genau. Wenn ich daran drehe siehts so 
aus:
voll offen: http://gianclaudio.muasch.com/DSC05657.JPG
und jetzt immer weniger: http://gianclaudio.muasch.com/DSC05658.JPG
http://gianclaudio.muasch.com/DSC05659.JPG
http://gianclaudio.muasch.com/DSC05660.JPG
Immer das gleiche Bild, einfach immer weniger.
Meine Schaltung? Ist im Prinzip das selbe wie
http://www.ulrichradig.de/site/atmel/avr_lcd/gfx/ConnectLCD_AVR.JPG
von Ulrich Radig. Das Controllerboard ist ein Mega32 Prototype Bausatz 
von embedit.de (http://shop.embedit.de/product__346.php). Sonst hängt da 
nichts dran.

von Matthias (Gast)


Lesenswert?

Hast Du die Taktfrequenz auch in der lcd.h Datei eingetragen?

#define XTAL 4000000

Der gute Mann scheint da wohl ein eigenes Süppchen zu kochen.

Wenn es im Makefile/Compiler Optionen und in der lcd.h richtig drin ist,
was passiert dann?

von Sven S. (Gast)


Lesenswert?

@gckoe

das ist für 4 bit modus angeschlossen. mein code ist für 8bit.
ich würd zuerst mal mit 8bit versuchen ist auch viel einfacher zu 
initialisieren.

von Hannes L. (hannes)


Lesenswert?

Sven S. wrote:
> @gckoe
>
> das ist für 4 bit modus angeschlossen. mein code ist für 8bit.
> ich würd zuerst mal mit 8bit versuchen ist auch viel einfacher zu
> initialisieren.

Ich lach' mich krank....

Dieses Zusammenkopieren von unverstandenen Schaltungen und Routinen 
unterschedlicher Herkunft kann ja auch nicht funktionieren.

Ja, ich schau' mir auch mal fremden Code und fremde Schaltungen an, aber 
nicht, um sie unverstanden zu benutzen, sondern um sie mit meinen 
eigenen Ideen zu vergleichen und ggf. die eine oder andere sinnvolle 
Einzelheit zu übernehmen.

Irgendwie erinnert mich das an die Anfangszeit des PC (DOS), da hatte 
ein Bekannter CONFIG.SYS und AUTOEXEC.BAT - Dateien gesammelt. Aber 
nicht, um die darin enthaltenen Befehle verstehen zu lernen, sondern um 
bei Rechnerproblemen eine nach der anderen auszuprobieren zu können.

...

von Sven S. (Gast)


Lesenswert?

@Hannes Lux

Da hast du wohl Recht. Am besten seine eigene Schaltung und sein eigener 
Code. Das mit dem 4Bit Modus hab ich halt nicht Gewust.

Hab mir mal den Code von Fleury angesehen und kann da nur sagen bis ich 
da zu 100% durchsteig schreib ich 10 mal einen neuen Code, den ich dann 
auch verstanden habe.

gruss sven

von gckoe (Gast)


Lesenswert?

Gibt es denn irgendwo ein Tutorial das die HD44780 ansteuert und das mit 
C und nicht mit Assembler macht?
Denn ich bin jederzeit auch bereit, das zu lernen. Aber das ganze in 
Assembler macht für mich keinen Sinn, da ich C ein bisschen kann und mit 
dem Projekt auch noch etwas C lernen will (oh, ich hör schon schreien 
"mit zusammenkopieren lernst du nix..."). Ich kann euch sagen, das 
Projekt geht anschliessend noch weiter, es soll mal eine Wetterstation 
werden. Und für die anderen Komponenten mag ich selber Proggen, aber für 
das Display wollte ich nicht.

von Hannes L. (hannes)


Lesenswert?

gckoe wrote:
> Gibt es denn irgendwo ein Tutorial das die HD44780 ansteuert und das mit
> C und nicht mit Assembler macht?

Im GCC-Tutorial wird es (vermutlich) auch ein Kapitel über LCDs geben.

In der Codesammlung solltest Du auch genügend Beispiele finden.

> Denn ich bin jederzeit auch bereit, das zu lernen. Aber das ganze in
> Assembler macht für mich keinen Sinn, da ich C ein bisschen kann und mit
> dem Projekt auch noch etwas C lernen will

Es ist nicht die Sprache, sondern das Auseinandersetzen mit der 
Hardware. Ich benutze ASM, weil es unmissverständlicher und eindeutiger 
ist und damit zuverlässiger als C, das man (ich) nicht (oder nur 
dürftig) kann.

> (oh, ich hör schon schreien
> "mit zusammenkopieren lernst du nix...").

Dann hörst Du Gespenster, ich schrei' da nicht. Ich habe dazu meine 
Meinung (etwas überspitzt) gesagt, nun ist gut.

> Ich kann euch sagen, das
> Projekt geht anschliessend noch weiter, es soll mal eine Wetterstation
> werden. Und für die anderen Komponenten mag ich selber Proggen, aber für
> das Display wollte ich nicht.

Dann ist vermutlich Dein Projekt für Deinen heutigen Wissensstand eine 
Nummer zu groß. Fang' etwas kleiner an, nur mit kleinen Schritten kommst 
Du vorwärts.

...

von Sven S. (Gast)


Lesenswert?

@Hannes Lux
> Es ist nicht die Sprache, sondern das Auseinandersetzen mit der
> Hardware.

Genau. Und Asm ist perfekt um sich mit dem Controller auseinander zu 
setzen.

> Ich benutze ASM, weil es unmissverständlicher und eindeutiger
> ist und damit zuverlässiger als C, das man (ich) nicht (oder nur
> dürftig) kann.

Na ja "zuverlässiger" in Asm muss man sich schon mit dem Controller gut 
auskennen um ein grösseres Projekt zu realisieren ohne dabei bugcode zu 
erzeugen.

Gerade bei so sachen wie Zeiger und Rechnungen jenseits der 8 bit 
programmiert man sich in asm auf die Dauer den Wolf ab und hält sich nur 
unnötig auf. Auch Funktionen mit übergabe Parametern würde ich in Asm 
stark vermissen.

gruss Sven

von gckoe (Gast)


Lesenswert?

Ich bin beim stöbern im Internet (jaa, ich kann google verwenen, sonst 
wär ich gar nicht hierhin gekommen) auf eine interessante Abbildung 
gestossen.
http://www.sprut.de/electronic/lcd/index.htm#4x20
Hier werden genau auch die ersten 8 Zeichen der ersten beiden Linien 
anders Dargestellt als die Anderen. Könnte das Problem eventuel hier 
sein?

Und noch: Das Display sollte, wenn man es nur an die Stromversorgung 
hängen, immernoch einen Strich in der ersten und dritten Linie machen, 
macht es aber nicht. Daher ist das Problem eher am Display als am Code.

von Karl H. (kbuchegg)


Lesenswert?

gckoe wrote:
> Ich bin beim stöbern im Internet (jaa, ich kann google verwenen, sonst
> wär ich gar nicht hierhin gekommen) auf eine interessante Abbildung
> gestossen.
> http://www.sprut.de/electronic/lcd/index.htm#4x20
> Hier werden genau auch die ersten 8 Zeichen der ersten beiden Linien
> anders Dargestellt als die Anderen. Könnte das Problem eventuel hier
> sein?

Eher nicht.

>
> Und noch: Das Display sollte, wenn man es nur an die Stromversorgung
> hängen, immernoch einen Strich in der ersten und dritten Linie machen,
> macht es aber nicht. Daher ist das Problem eher am Display als am Code.

Genau.

Wenn du nichts mit dem Display machst, keine Initialisierung,
dann sollte das Display in der ersten und dritten Zeile besagte
schwarze Balken anzeigen. Tut es das nicht, dann ist irgendetwas
faul: Kontrastspannung stimmt nicht oder du hast das Display
bereits gehimmelt.

von gckoe (Gast)


Lesenswert?

Da ich die Kontrastspannung mit einem Poti schön einstellen kann ist das 
wohl auszuschliessen. Shit, ich brauch ein neues Display :-(

von Recke (Gast)


Lesenswert?

Hallöchen. Ich habe die Software von Sven S. probiert. Funktioniert 
prima. Allerdings habe ich dazu folgende Frage:

Ich kann natürlich mit dem Befehl lcdprint("Zeile 4",4); Den Text "Zeile 
4" in Spalte 4 ausgeben. Jetzt möchte ich aber einen Variableninhalt 
(Zahlenraum von 0 - 255) auf dem Display ausgeben. Wie muss ich den 
entsprechenden Code ändern um dies zu erreichen?

Über Hilfe wäre ich sehr dankbar.

Gruß,

Recke

von Karl H. (kbuchegg)


Lesenswert?

Recke wrote:
> 4" in Spalte 4 ausgeben. Jetzt möchte ich aber einen Variableninhalt
> (Zahlenraum von 0 - 255) auf dem Display ausgeben. Wie muss ich den
> entsprechenden Code ändern um dies zu erreichen?

http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Recke (Gast)


Lesenswert?

Besten Dank!!! Funktioniert.

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.