Initialisierung 204b LCD mit ST7066U

Gast #6663169
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
Gast #6663252
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
Gast #6663271
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.
(Firma: matzetronics) #6663283
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.
Gast #6663298
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.
Gast #6663308
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.
#6663315
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!
Gast #6663316
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)
Gast #6663337
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.
Gast #6663349
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.
Gast #6663415
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
Angehängte Dateien:
#6663522
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).
#6665051
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
Gast #6671067
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 :-)
#6671146
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
Angehängte Dateien:
Gast #6671173
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.
#6671193
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren