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
voidlcd_init_ST7066U(void)
2
{
3
// verwendete Pins auf Ausgang schalten
4
uint8_tpins=(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
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
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.
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
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)
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.
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
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.
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.
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.
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!
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)
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:)
Du beschreibst als Fehlerbild die beiden schwarzen Balken. Woher weisst
Du, dass Dein Programm überhaupt anläuft oder der Atmega nicht ständig
rebootet?
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.
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.
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.
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!
Teo D. schrieb:> Steht aber erst nach den beiden ersten Function-Set Befehlen, der> Initialisierung zur Verfügung!
... und garantiert nicht als Interrupt-Leitung.
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
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).
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
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 :-)
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
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.
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.
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.
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
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 :)