Forum: Mikrocontroller und Digitale Elektronik LCD-Display (HD44780) keine Ausgabe


von Markus E. (opc)


Angehängte Dateien:

Lesenswert?

Ich habe anhand des AVR-GCC-Tutorial/LCD-Ansteuerung ein 4x20 Zeichen 
Display mit HD44780 Controller an einem ATmega8 mit 8MHz Schwingquarz 
angeschlossen.

Die Anschlüsse des Displays (Datenleitungen, EN, RW, etc) sind alle wie 
im Tutorial in der Datei lcd-routines.h standardmäßig angegeben 
angeschlossen.

R/W ist mit GND verbunden. Die Kontrastspannung liegt bei ~3V.

Ich habe im Anhang alle wichtigen Dateien angehängt unter anderem einen 
Screenshot von Atmel Studio 6.2 wo man die eingebundenen Dateien sieht 
und das Datenblatt des Displays.

Leider bekomme ich keine Ausgabe auf dem Display zustande.

Ich weiß nicht wieso, aber auf irgendeinem "mir unerklärlichem" Grund 
wurde der Cursor ein einziges mal beim Schreiben des Codes in den µC an 
die Position 0,2 gesetzt. Als ich danach einen String ausgeben wollte, 
bzw. seitdem sieht man gar keine Ausgabe mehr.

Sieht jemand einen offensichtlichen Fehler im Code o.ä.?

Grüße

Markus

von Karl H. (kbuchegg)


Lesenswert?

Markus E. schrieb:

> bzw. seitdem sieht man gar keine Ausgabe mehr.

Gar nichts?
Noch nicht mal die Balkenreihe, die auf ein uninitalisiertes Display 
hinweist?

> Die Kontrastspannung liegt bei ~3V.

Das kommt mir komisch vor.
Es sind zwar nicht alle LCD gleich und die Kontrsastspannung variiert 
schon mal, aber bei LCD die keine negative Spannung brauchen, bewegt 
sich die normalerweise in der Nähe vom GND-Level. Eine Konrastspannung 
von 3V hab ich so noch nie auch nur annähernd beobachtet.
Wenn du das LCD nicht initialisierst, sondern im Prinzip einfach nur die 
Spannungsversorgung einschaltest, siehst du dann die Blockreihen in der 
1. und 3. Zeile?

Wenn nicht, dann dreh mal am Kontrastpoti, bis du die siehst.

von Karl H. (kbuchegg)


Lesenswert?

1
int main(void)
2
{
3
  _delay_ms(100);
4
  
5
  //Konfiguration LCD
6
  lcd_init();    
7
  lcd_setcursor( 0, 2 );  
8
  lcd_string("Test");

lass den lcd_setcursor erst mal weg. Das ist nur wieder eine Funktion 
die schief gehen kann. Und genau das kannst du am Anfang überhaupt nicht 
brauchen.
Du willst so wenige Dinge wie möglich im Programm haben, die schief 
gehen können.
Du brauchst ihn auch nicht. Wenn das Display initialisiert ist, dann 
steht der Cursor links oben im Eck. Gibst du einen Text aus, und klappt 
das, dann beginnt der links oben im Ecke. Dann kannst du immer noch 
den Cursor versetzen. Denn dann weisst du, dass die Textausgabe erst mal 
klappt. Wenn dann nichts zu sehen ist, dann weisst du, dass bei der 
Cursorpositionierung was nicht stimmt.

Aber kontrollier erst mal deinen Kontrast.

: Bearbeitet durch User
von Markus E. (opc)


Lesenswert?

Hallo Karl Heinz,

ich habe das Poti mal hochgedreht und sehe nun die von dir genannten 
Blockreihen in Zeile 1 und 3 deutlich. Was mir dabei auffällt ist, dass 
diese garnicht verschwinden. Nach dem Initialisierungsvorgang sollten 
diese doch weg sein?

Habe auch die setcursor-Funktion entfernt. Bisjetzt sind nur die 
Balkenreihen zu sehen dauerthaft.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus E. schrieb:
> Die Kontrastspannung liegt bei ~3V.
Gegen GND gemessen? Das scheint mit recht hoch...

Und richtig: im Datenblatt steht VEE - Displayspannung 0..0,5V

Markus E. schrieb:
> an einem ATmega8 mit 8MHz Schwingquarz angeschlossen.
Hast du da auch noch irgendwelche Blockkondensatoren eingebaut?
Zeig doch mal deine Schaltung...

: Bearbeitet durch Moderator
von Markus E. (opc)


Lesenswert?

ja mit den 3V hatte ich mich vertan.

von Markus E. (opc)


Lesenswert?

Lothar M. schrieb:
> Hast du da auch noch irgendwelche Blockkondensatoren eingebaut?

ja habe ich. 100nF an VCC/GND und jeweils 22pF am Quarz.

von Karl H. (kbuchegg)


Lesenswert?

Markus E. schrieb:
> Hallo Karl Heinz,
>
> ich habe das Poti mal hochgedreht und sehe nun die von dir genannten
> Blockreihen in Zeile 1 und 3 deutlich. Was mir dabei auffällt ist, dass
> diese garnicht verschwinden. Nach dem Initialisierungsvorgang sollten
> diese doch weg sein?

Sollten sie.
Wenn sie nicht verschwinden sagt uns das, dass in deiner Initialisierung 
etwas nicht stimmt. Das LCD wurde nicht korrekt initialisiert.

Aber: zumindest siehst du jetzt wieder etwas.

von Karl H. (kbuchegg)


Lesenswert?

Markus E. schrieb:

> Die Anschlüsse des Displays (Datenleitungen, EN, RW, etc) sind alle wie
> im Tutorial in der Datei lcd-routines.h standardmäßig angegeben
> angeschlossen.

Das sagen sie alle.
Photo machen und posten.

von Markus E. (opc)


Lesenswert?

ein Foto an der Stelle wird nichts bringen. Es sieht auf dem Breadboard 
mit den Drahtbrücken (flexible Drähte) viel zu Wirr aus um Anfang und 
Ende zu erkennen.

Ich habe die Anschlüsse nochmals nachkontrolliert und denke, dass auch 
ansonsten nicht schonmal (aus welchem Grund auch immer) eine Ausgabe 
vorhanden war.

von Karl H. (kbuchegg)


Lesenswert?

Markus E. schrieb:

> Ich habe die Anschlüsse nochmals nachkontrolliert und denke, dass auch
> ansonsten nicht schonmal (aus welchem Grund auch immer) eine Ausgabe
> vorhanden war.

Dann kanns nur noch ein Wackelkontakt sein oder ein Kabel steckt nicht 
richtig.
Bei Steckbrettern kommt sowas schon mal vor.


Wenn der Drahtverhau wirr ist, dann bereinige das.
Das ist auch in deinem eigenen Interesse.

von Markus E. (opc)


Lesenswert?

Karl H. schrieb:
> Wenn der Drahtverhau wirr ist, dann bereinige das.
> Das ist auch in deinem eigenen Interesse.

Ich werd mal zum Bekannten gehen und mir seine starren Drahtbrücken 
leihen damit man den Aufbau besser erkennen kann.

Ich lade ein Foto hoch sobald ich die Schaltung umgebaut hab.

von beric (Gast)


Lesenswert?

Und blinkt dein Blinky an Port B?

von Markus E. (opc)


Angehängte Dateien:

Lesenswert?

Einen Schönheitspreis gewinnt der Aufbau mit Sicherheit nicht, es soll 
zweckmäßig sein. Leider waren nicht viele kurze Drahtbrücken dabei seht 
selbst (Anhang). Ich denke das Schema ist erkennbar, die Anschlüsse vom 
LCD sind vom unteren Rand des Breadboards beginnend 1-...

Gruß
Markus

von Tcf K. (tcfkao)


Lesenswert?

Wo sind denn da Blockkondensatoren???
Am Regler fehlen welche, direkt am µC, direkt am Display...!

von Markus E. (opc)


Lesenswert?

Tcf K. schrieb:
> Wo sind denn da Blockkondensatoren???

sitzt direkt einer am µC zw. VCC/GND

von Karl H. (kbuchegg)


Lesenswert?

Ich mag mich irren und es ist mit dem Bild schwer nachzuvollziehen. Aber 
ich denke du hast da einen Dreher in den Datenleitungen drinnen.

Plan B:
1
#define F_CPU 8000000UL
2
#include <avr/io.>
3
#include <util/delay.h>
4
5
int main()
6
{
7
  DDRB = 0xFF;
8
9
  while( 1 )
10
  {
11
    PORTB = 0x01;
12
    _delay_ms( 1000 );
13
    PORTB = 0x00;
14
    _delay_ms( 1000 );
15
  }
16
}

laufen lassen. Mit einem Voltmeter oder einer LED die 4 Datenleitungen 
am LCD durchgehen. Bei welcher blinkt es?
es sollte DB4 blinken (Pin 11 am LCD, dort wo das rote Kabel der 4 
Datenleitungen rauskommt).
Tut es das auch?

: Bearbeitet durch User
von Mitlesa (Gast)


Lesenswert?

Markus E. schrieb:
> Einen Schönheitspreis gewinnt der Aufbau mit Sicherheit nicht

Ja.

Und die Leitungen zum LCD sind zu lang.

Für mein Gefühl würde ich 10cm tolerieren. Dazu kommt die
erhöhte Fehlerwarscheinlichkeit durch die zusätzlichen
(doppelten) Steckverbindungen.

Auch ein Abblock-C direkt am LCD wäre sicherlich angebracht.

von Karl H. (kbuchegg)


Lesenswert?

Markus E. schrieb:

> LCD sind vom unteren Rand des Breadboards beginnend 1-...

Ich denke da hast du den Dreher eingebaut.
Die 4 Datenleitungen sind in aufsteigender Reihenfolge rot, orange, 
orange, orange
'Links' vom roten Kabel ist ein schwarzes - das letzte der 3 
Steuerleitungen.

Schau ich aufs Breadboard, dann finde ich das schwarze Kabel wieder. 
Aber das nächste Kabel in aufsteigender Reihenfolge scheint ein oranges 
zu sein. das Rote Kabel ist ganz am anderen Ende.

Ist durch die Perspektive von hier schlecht zu erkennen. Aber das/die 
orange Kabel scheint eindeutg vor dem roten zu kommen.

von Mitlesa (Gast)


Lesenswert?

Markus E. schrieb:
> Einen Schönheitspreis gewinnt der Aufbau mit Sicherheit nicht

Ja.

Und ich behaupte mal dass da jemand die Totsünde begangen hat
den Spannungsregler ohne die empfohlenen Abblock-Cs (zwei sind
zu setzen) zu betreiben. Mag funktioniern, aber ist reiner
Zufall, und hängt dann auch vom Wetter ab .....

von Mitlesa (Gast)


Lesenswert?

Mitlesa schrieb:
> Auch ein Abblock-C direkt am LCD wäre sicherlich angebracht.

Da die Stromversorgungs-Leitungen "induktiv werden".

von Gerhard O. (gerhard_)


Lesenswert?

Die LCD Init Funktion hier und im Artikelbeitrag scheint sich nicht an 
die Angaben des Datenblatts zu halten:

http://www.bipom.com/documents/appnotes/LCD%20Interfacing%20using%20HD44780%20Hitachi%20chipset%20compatible%20LCD.pdf

In 4-bit mode, the high nibble is sent before the low nibble and the E 
pin is toggled each time four bits is sent to the LCD. To initialize in 
4-bit mode:
1. Wait more than 15 msecs after power is applied.
2. Write 0x03 to LCD and wait 5 msecs for the instruction to complete
3. Write 0x03 to LCD and wait 160 usecs for instruction to complete
4. Write 0x03 AGAIN to LCD and wait 160 usecs (or poll the Busy Flag)
5. Set the Operating Characteristics of the LCD
o Write 0x02 to the LCD to Enable 4-Bit Mode
All following Instruction/Data Writes require two nibble writes.
o Write "Set Interface Length"
o Write 0x01/0x00 to turn off the Display
o Write 0x00/0x01 to Clear the Display
o Write "Set Cursor Move Direction" Setting Cursor Behavior Bits
o Write "Enable Display/Cursor" & enable Display and Optional Cursor



Mfg,
Gerhard

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Kannst du das etwas konkretisieren?
Wo siehst du Abweichungen?

von Karl H. (kbuchegg)


Lesenswert?

Karl H. schrieb:
> Kannst du das etwas konkretisieren?
> Wo siehst du Abweichungen?


Entscheidend ist der teil bis hier
1
2. Write 0x03 to LCD and wait 5 msecs for the instruction to complete
2
3. Write 0x03 to LCD and wait 160 usecs for instruction to complete
3
4. Write 0x03 AGAIN to LCD and wait 160 usecs (or poll the Busy Flag)
4
5. Set the Operating Characteristics of the LCD
5
o Write 0x02 to the LCD to Enable 4-Bit Mode
6
All following Instruction/Data Writes require two nibble writes.
7
o Write "Set Interface Length"

danach ist das Teil im 4 Bit Modus und die Blockzeilen sind weg.

Ob und welchen Cursor man einschaltet, ist uninteressant.
Ob das LCD während des ersten Clear SCreen eingeschaltet ist oder nicht, 
ist ebenfalls uninteressant.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Karl H. schrieb:
> Kannst du das etwas konkretisieren?
> Wo siehst du Abweichungen?

Beim nochmaligen Durchsehen fiel der Groschen. Konnte zuerst nicht 
gleich den Wert für SOFT RESET finden. Auch war es ungewohnt, nur einmal 
den Wert auf die Datenleitungen zu bringen und dann das LCD dreimal mal 
mit dem E-Strobe anzusteuern. Normalerweiser sende ich dreimal den Wert 
zusammen mit dem E-Strobe. Die hier gezeigte Methode ist eigentlich 
etwas eleganter wie ich das sonst mache;-(

Allerdings steuere ich seit jüngster Zeit meine LCDs nur mehr mit I2C 
an; das spart Datenleitungen und die Zeichenschreibgeschwindigkeit ist 
immer noch ausreichend.


Alles klar und ein schönes Wochenende,
Gerhard

: Bearbeitet durch User
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.