Forum: Mikrocontroller und Digitale Elektronik Initialisierung 204b LCD mit ST7066U


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von eagled (Gast)


Lesenswert?

Servus!

Ich versuche schon seit Tagen mein LCD im 4 Bit/Pin Modus (ohne 
Busy-Flag) zu initialisieren :/
Dabei benutze ich einen ATMEGA328P mit interne  Oszillator.
Leider klappt es nicht. Ich habe mich aller Anfangs an dem LCD Tutorial 
von Mikrocontroller.net orientiert.
Doch schnell war klar, dass ich etwas ändern muss. Zunächst habe ich die 
Verdrahtung kontrolliert und keine Fehler feststellen können.

Daraufhin habe ich mir die Datenblätter genauer angeschaut und 
festgestellt, dass die Initialisierungssequenz bei dem ST7066U eine 
andere ist als die des HD44780.
Also habe ich die Sequenz und die Wartezeiten (mehr als doppelt so viel 
wie im Datenblatt empfohlen) angepasst...
Dennoch war kein Unterschied vermerkbar. Jedes mal sehe ich die 
schwarzen Balken in der ersten und zweiten Zeile. Immerhin ist die 
Kontrastspannung richtig ;-).

Auch ein Wechsel der Bibliotheken (zu der von Peter Fleury) führte zu 
keiner Veränderung. Natürlich habe ich die Belegung der Pins 100mal 
kontrolliert. Auch habe ich es mit anderen Ports/Pins versucht.
Eine Initialisierung im 8 Bit/Pin Modus hat auch nicht funktioniert. DB0 
- DB3 liegen bei mir auf GND.

Meine Initialisierungssequenz (nach Datenblatt) mit der Bibliothek aus 
dem LCD Tutorial sieht bei mir wie folgt aus:
1
void lcd_init_ST7066U( void )
2
{
3
  // verwendete Pins auf Ausgang schalten
4
  uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
5
  (1<<LCD_RS) |                // R/S Leitung
6
  (1<<LCD_EN);                 // Enable Leitung
7
  LCD_DDR |= pins;
8
  
9
  // initial alle Ausgänge auf Null
10
  LCD_PORT &= ~pins;
11
  
12
  
13
  
14
  
15
  _delay_ms(100);  
16
  lcd_out(0x30);         //Function set
17
  
18
  _delay_us(100); 
19
  lcd_command(0x28);     //Function set
20
  
21
  _delay_us(100); 
22
  lcd_command(0x28);     //Function set
23
  
24
  _delay_us(100); 
25
  lcd_command(0x0C);     //Display ON/OFF control
26
  
27
  _delay_us(100); 
28
  lcd_command(0x01);     //Display clear
29
  
30
  _delay_ms(4);
31
  lcd_command(0x06);     //Entry mode set
32
  
33
  
34
  
35
  _delay_us(100);
36
}

Ich bin am Verzweifeln, vor allem da mir von einem Kollegen berichtet 
wurde, dass er so gut wie immer die Bibliothek von Peter Fleury nimmt 
und ggf. die Wartezeiten ändert sonst nichts (scheint bei mir ja eher 
semi-gut zu funktionieren). Den habe ich selbstverständlich schon nach 
einem Rat gefragt, jedoch weiß er auch nicht weiter.

Vielen Dank für eure Aufmerksamkeit :D

von Teo D. (teoderix)


Lesenswert?

eagled schrieb:
> Zunächst habe ich die
> Verdrahtung kontrolliert und keine Fehler feststellen können.

Da las doch noch mal Andere drüber gugen!

von eagled (Gast)


Lesenswert?

Hey,

das ging ja sehr zügig mit der ersten Antwort ^^

Teo D. schrieb:
> Da las doch noch mal Andere drüber gugen!

Soll ich dazu einen Schaltplan machen? Der würde aber wohl nichts 
anderes ergeben. Ist dann eine Bildaufnahme nützlicher? So ein schöner 
Maurerplan? :D

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

eagled schrieb:
> DB0
> - DB3 liegen bei mir auf GND.

Das ist unnötig und verbraucht nur Strom, weil es gegen interne Pullups 
des LCD arbeitet. Lass die Pins einfach frei.
Denke dran, bei der Fleury Lib den Typ des Controllers richtig 
anzugeben. Die ist nämlich eigentlich narrensicher.

von Teo D. (teoderix)


Lesenswert?

eagled schrieb:
> Ist dann eine Bildaufnahme nützlicher?

Natürlich die Realität. Schaltplan unnötig, sind eh nur ein paar 
Verbindungen.

von eagled (Gast)


Lesenswert?

Matthias S. schrieb:
> Das ist unnötig und verbraucht nur Strom, weil es gegen interne Pullups
> des LCD arbeitet. Lass die Pins einfach frei.

Wieder was gelernt :)
Ich habe meine Verdrahtung umgeändert:
1
/*
2
Bezeichnung-LCD    Pin-µC
3
1   Vss             GND
4
2   Vcc             5V
5
3   Vee             Poti
6
4   RS              PD4 am AVR
7
5   RW              GND
8
6   E               PD5 am AVR
9
7   DB0             offen (unbenutzt)
10
8   DB1             offen (unbenutzt)
11
9   DB2             offen (unbenutzt)
12
10  DB3             offen (unbenutzt)
13
11  DB4             PD0 am AVR
14
12  DB5             PD1 am AVR
15
13  DB6             PD2 am AVR
16
14  DB7             PD3 am AVR
17
*/

Matthias S. schrieb:
> Denke dran, bei der Fleury Lib den Typ des Controllers richtig
> anzugeben. Die ist nämlich eigentlich narrensicher.


Als Kontroller habe ich den HD44780 ausgewählt, da der ST7066U 
kompatibel zu ihm ist (laut Datenblätter):
1
#ifndef LCD_CONTROLLER_KS0073 
2
#define LCD_CONTROLLER_KS0073 0  /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
3
#endif

Mit dem KS0073 als ausgewähltem Controller hat es auch nicht 
funktioniert

von Teo D. (teoderix)


Lesenswert?

eagled schrieb:
> Als Kontroller habe ich den HD44780 ausgewählt, da der ST7066U
> kompatibel zu ihm ist

Nach einem Gerücht bei Sprut (er glaubs scheinbar selbst nicht so 
richtig dran), soll es nur bei der Bussy-Flag abfrage Probleme geben. 
Wird angeblich früher gelöscht.
(http://www.sprut.de/electronic/lcd/#st7066u)

von Der müde Joe (Gast)


Lesenswert?

Du schreibst, daß du das Busy-Flag nicht auswertest. Es wäre aber 
trotzdem nicht verkehrt, zu prüfen, ob das Display etwas am busy-Pin 
macht. Wenn das Display prinzipiell antwortet, wird die Verdrahtung und 
das Display in Ordnung sein, und man wird die Initialisierung genauer 
betrachten müssen.

von eagled (Gast)



Lesenswert?

Teo D. schrieb:
> Natürlich die Realität. Schaltplan unnötig, sind eh nur ein paar
> Verbindungen.

Ich habe mal drei Bildaufnahmen getätigt. Hoffe es passt so :-D

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn ich was gelernt habe in all den Jahren mit diesen LCD, dann ist es, 
das Sch**$$ Busy Flag nicht zu benutzen.
Man muss mit diesen Display eben im Oma Tempo reden, dann klappts.
Übrigens, wenn man die Fleury Lib nicht benutzt - das Function Set muss 
dreimal ausgeführt werden. Einmal mit langer Pause danach und zweimal 
mit kürzerer Pause.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Ich sehe (mal wieder) keine Abblockkondensatoren.

von Der müde Joe (Gast)


Lesenswert?

Denkbar wäre auch eine klitzekleine Lötbrücke, eine haarfeine, die man 
mit bloßem Auge fast nicht sieht.

von Bedau Erer (Gast)


Lesenswert?

Pete K. schrieb:
> Ich sehe (mal wieder) keine Abblockkondensatoren.

Das ist wirklich traurig und schrecklich mit welcher Ignoranz
manche Anleitungen ausgestattet sind bzw. die (korrekten, nicht
ignorierenden) Anleitungen von den Benutzern umgesetzt werden.

Ja, Abblock-Kondensatoren sind zum sparen da, die sind so teuer
dass man sie tunlichst weglassen sollte.

von Bedau Erer (Gast)


Lesenswert?

eagled schrieb:
> Verdrahtung_AVR_mit_LCD_2.jpeg

Das Verbinden mittels DIL-Stecker ist sehr fehleranfällig,
da vertauscht man schon mal die Pins oder Reihen ....

Ausserdem wird der DIL-Stecker möglicherweise nicht sehr
gut mit den Kontakten des Steckbretts harmonisieren.

von Pete K. (pete77)


Lesenswert?

Hast Du debug-Ausgaben von Deinem Programm verfügbar? Bitte das 
komplette Programm einmal als Anhang beifügen.

von Teo D. (teoderix)


Lesenswert?

Der müde Joe schrieb:
> Denkbar wäre auch eine klitzekleine Lötbrücke, eine haarfeine, die man
> mit bloßem Auge fast nicht sieht.

Dito
Ich bin aber auch schon froh, das die Kabel am LCD angelötet und nicht 
nur gesteckt sind. ;)
Durchgeklingelt ob die Steckverbinder, auch das verbinden wie gedacht?!
Ich würde dem µC auf alle Fälle auch noch 1-2 Abblockkondensatoren 
spendieren!

von eagled (Gast)


Lesenswert?

Pete K. schrieb:
> Ich sehe (mal wieder) keine Abblockkondensatoren.

Ich habe leider keine passenden Kondensatoren hier :/
Kann dies allein der Grund für meine Probleme sein?

Teo D. schrieb:
> Nach einem Gerücht bei Sprut (er glaubs scheinbar selbst nicht so
> richtig dran), soll es nur bei der Bussy-Flag abfrage Probleme geben.
> Wird angeblich früher gelöscht.
> (http://www.sprut.de/electronic/lcd/#st7066u)

Ich habe mal etwas mit der Wartezeit herumexperimentiert.
Leider auch hier keine Veränderung.

Der müde Joe schrieb:
> Du schreibst, daß du das Busy-Flag nicht auswertest. Es wäre aber
> trotzdem nicht verkehrt, zu prüfen, ob das Display etwas am busy-Pin
> macht. Wenn das Display prinzipiell antwortet, wird die Verdrahtung und
> das Display in Ordnung sein, und man wird die Initialisierung genauer
> betrachten müssen.

Gibt es da eine einfache Möglichkeit? Mir persönlich fällt da gerade 
nichts ein, vllt. habe ich aber auch ein Brett vorm Kopf

Matthias S. schrieb:
> Wenn ich was gelernt habe in all den Jahren mit diesen LCD, dann ist es,
> das Sch**$$ Busy Flag nicht zu benutzen.
> Man muss mit diesen Display eben im Oma Tempo reden, dann klappts.
> Übrigens, wenn man die Fleury Lib nicht benutzt - das Function Set muss
> dreimal ausgeführt werden. Einmal mit langer Pause danach und zweimal
> mit kürzerer Pause.

Eigentlich wollte ich es auch ohne Busy-Flag initialisieren, habe jedoch 
in einem anderen Beitrag gelesen, dass die Fluery Lib nicht ohne geht.
Mit der Tutorial Lib  hab ich die Fuunction set auch dreimal ausgeführt. 
Einmal mit 100ms Pauuse und zweimal mit 100us pause (siehe oben)

von Teo D. (teoderix)


Lesenswert?

Matthias S. schrieb:
> Wenn ich was gelernt habe in all den Jahren mit diesen LCD, dann ist es,
> das Sch**$$ Busy Flag nicht zu benutzen.

Quatsch, das funst prima.
(Wenn man im 4Bit Mod. nicht vergisst, das man zweite Nibbel auslesen 
muss:)

von Pete K. (pete77)


Lesenswert?

Du beschreibst als Fehlerbild die beiden schwarzen Balken. Woher weisst 
Du, dass Dein Programm überhaupt anläuft oder der Atmega nicht ständig 
rebootet?

von Der müde Joe (Gast)


Lesenswert?

Ich würde das busy-flag auf einen Interrupt geben, der wiederum eine LED 
einschaltet. Kann man eine Sekunde eingeschaltet lassen, dann wieder 
abschalten und das nächste Initialisierungs-Byte/nibble senden.

von Bedau Erer (Gast)


Lesenswert?

Der müde Joe schrieb:
> Ich würde das busy-flag auf einen Interrupt geben, der wiederum eine LED
> einschaltet. Kann man eine Sekunde eingeschaltet lassen, dann wieder
> abschalten und das nächste Initialisierungs-Byte/nibble senden.

Käse, das geht nicht. Denn das Busy Flag wird als Datenbit
beim Lesen des LCDs bereitgestellt, wird also nicht unabhängig
erreichbar sein.

von Der müde Joe (Gast)


Lesenswert?

Laut Datenblatt vom Chip-Hersteller Sitronix, wird "DB7" als busy-flag 
verwendet.

von Bedau Erer (Gast)


Lesenswert?

Der müde Joe schrieb:
> Laut Datenblatt vom Chip-Hersteller Sitronix, wird "DB7" als busy-flag
> verwendet.

Immer noch nicht kapiert? Dann mach was anderes und labere
hier nicht rum.

Bedau Erer schrieb:
> wird also nicht unabhängig erreichbar sein.

von Teo D. (teoderix)


Lesenswert?

Der müde Joe schrieb:
> Laut Datenblatt vom Chip-Hersteller Sitronix, wird "DB7" als busy-flag
> verwendet.

Steht aber erst nach den beiden ersten Function-Set Befehlen, der 
Initialisierung zur Verfügung!

von Bedau Erer (Gast)


Lesenswert?

Teo D. schrieb:
> Steht aber erst nach den beiden ersten Function-Set Befehlen, der
> Initialisierung zur Verfügung!

... und garantiert nicht als Interrupt-Leitung.

von eagled (Gast)


Angehängte Dateien:

Lesenswert?

Bedau Erer schrieb:
> Das Verbinden mittels DIL-Stecker ist sehr fehleranfällig,
> da vertauscht man schon mal die Pins oder Reihen ....
>
> Ausserdem wird der DIL-Stecker möglicherweise nicht sehr
> gut mit den Kontakten des Steckbretts harmonisieren.

Teo D. schrieb:
> Durchgeklingelt ob die Steckverbinder, auch das verbinden wie gedacht?!

Der DIL-Stecker ist als Fehlerquelle ausgeschlossen. Hatte ich zwar 
bereits geprüft, gerade nochmals (lieber einmal mehr als einmal zu 
wenig).

Pete K. schrieb:
> Bitte das
> komplette Programm einmal als Anhang beifügen.

Wird erledigt. :-)

Pete K. schrieb:
> Du beschreibst als Fehlerbild die beiden schwarzen Balken. Woher weisst
> Du, dass Dein Programm überhaupt anläuft oder der Atmega nicht ständig
> rebootet?

Wieso sollte er das tun? (Bin neu auf dem Gebiet)



Im Anhang sind alle Dateien die ich benutze:main, Fleury Lib. und die 
Tut Lib

von Pete K. (pete77)


Lesenswert?

eagled schrieb:
> Wieso sollte er das tun? (Bin neu auf dem Gebiet)

Z.B. Spannungsversorgung unzureichend, falsche Fuses gesetzt, 
Programmierfehler, nicht nach Datenblatt beschaltet, etc.

Das F_CPU ist besser in den Compile-Flags (Makefile) und nicht in *.h 
oder sogar *.c Files aufgehoben.
In main.c hast Du:
1
#define F_CPU 1000000
und in lcdroutines.h:
1
#ifndef F_CPU
2
#define F_CPU 8000000
3
#endif
Mach mal in das Hauptprogramm ein lcd_string("Hello World!") und danach 
ein while(1).

Besser wäre es, eine uart_library mitzunehmen und debug-Ausgaben zu 
generieren (z.B. in der Init-Sequenz und dem Hauptprogramm).

: Bearbeitet durch User
von Bernd N. (_bn_)


Lesenswert?

Wenn du dem Datenblatt folgst dann kann deine Initialisierung nicht 
passen, siehe https://www.newhavendisplay.com/app_notes/ST7066U.pdf

Ich habe es gerade mal ausprobiert und bei mir funktioniert es mit 
folgender Sequenz, kannst ja mal testen...
3x 0x33
1x 0x20  4 BIT mode
1x 0x28  4 BIT mode  2 Zeilen  5x7 Dots
1x 0x01  clear display
1x 0x06 Cursor nach rechts / kein Shift
1x 0x0C Display An  Cursor Aus  Blink Aus

von eagled (Gast)


Lesenswert?

Vielen Dank für all eure Vorschläge :-D
Am Ende des Tages war es doch simpler als gedacht (umso ärgerlicher).
Ja, es waren die Abblockkondensatoren...

Immerhin weiß ich jetzt, was ich nie wieder vergessen werde :-)

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

eagled schrieb:
> Immerhin weiß ich jetzt, was ich nie wieder vergessen werde :-)

Hi,
falls garnichts geht,
erst einmal alles löschen im Programm.
Solche Sachen mache ich lieber in ASM.
Die Routine oben muss an den tatsächlichen AVR angepasst werden.
(Adresse des SRAM evtl. bei 100 nicht 60)

Und wenn es dann später einmal erweitert werden muss, ist es besser, man 
nimmt von vorne herein schon die richtige LCD-Init-Sequenz.
Peter Danegger hat da schon was Passendes vorbereitet:

https://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001

ciao
gustav

: Bearbeitet durch User
von Karl Theodor (Gast)


Lesenswert?

Karl B. schrieb:
> erst einmal alles löschen im Programm.

Ja klar, bisschen Esoterik kann nicht schaden.

Karl B. schrieb:
> Solche Sachen mache ich lieber in ASM.

Geht völlig an den Bedürfnissen und Fähigkeiten des TO vorbei.
Daher: kein hilfreicher Beitrag für sein Problem.

von Karl B. (gustav)


Lesenswert?

Karl B. schrieb:
> Peter Danegger hat da schon was Passendes vorbereitet:
>
> https://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001
Schöne Makros. Sehr flexibel.
Und C nicht ASM

ciao
gustav

von eagled (Gast)


Lesenswert?

Ich bin mir nicht sicher ob meine letzte Nachricht bei allen richtig 
ankam, deshalb nochmal ein Nachtrag.

Mein Problem wurde durch die Abblockkondensatoren gelöst. Jetzt 
funktioniert alles!

Hatte das LCD nochmal per Arduino betrieben. Da dort alles funktionierte 
habe ich mir die Lib angeschaut, die der Arduino benutzt. Ab da war 
klar, dass es mit der Initialisierungssequenz vom HD44780 funktioniert.

Sobald ich die Abblockkondensatoren zur Verfügung hatte, habe ich diese 
in meine Verdrahtung integriert und siehe da, es funktionierte.

von Karl B. (gustav)


Lesenswert?

Hi,
nur für später einmal,
falls Bedarf bestehen sollte:
Suchbegriff: Danni's LCD driver.zip.
Da ist auch makefile etc.pp. mit drin.

ciao
gustav

von Karl Theodor (Gast)


Lesenswert?

eagled schrieb:
> Ich bin mir nicht sicher ob meine letzte Nachricht bei allen richtig
> ankam

Ich auch nicht. Gustav hat da so seine ganz eigene Traumwelt.

von Karl B. (gustav)


Lesenswert?

eagled schrieb:
> Mein Problem wurde durch die Abblockkondensatoren gelöst. Jetzt
> funktioniert alles!

Hi,
lüg nicht. Bei mir gehen die auch mit 30 cm Flachbandkabel.
Da hast du noch was anderes falsch verdrahtet.
Merke: Gerät kann Flöhe und Läuse haben.
Was überhaupt kritisch ist, dass ist der Enableimpuls.
Die Flanke muss sauber rüberkommen.

ciao
gustav

von eagled (Gast)


Lesenswert?

Karl B. schrieb:
> lüg nicht. Bei mir gehen die auch mit 30 cm Flachbandkabel.
> Da hast du noch was anderes falsch verdrahtet.

Tut mir leid dich zu enttäuschen, ich lüge nicht :')
Bei mir lag es wirklich nur an den Kondensatoren!
Ob du es glaubst oder nicht :)

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]
  • [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.

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