Hallo Leute, ich arbeite zur Zeit an der Ansteuerung eines LCD-Displays von Pollin (LCD-Modul HMC16223SG). Betreibe das Display (sowie den Rest der Schaltung) mit 3.3V aus einem Step-Up-Converter bis 200mA (AS1320 von austria microsystems). Zum Ansteuern benutze ich einen Atmega8 bei 4MHz. Display ist mit EN an PortB5 und RS an PortB4, RW ist auf Masse, Busy-Flag lässt sich also nicht abfragen. Datenleitungen liegen auf PortC0:5 (DB0:5) und PortD0:1 (DB6:7). Schaltung ist bereits geätzt und fertig bestückt, soll also nicht verändert werden, da auch für die RW-Leitung kein Pin mehr frei wäre! Nun mein Problem: Der Versuch einer Initialisierung auf 2-zeiligen Betrieb mit 8-bit-Ansteuerung funktioniert nicht und nur die obere Zeile zeigt einen schwarzen Balken. Vor ein paar Wochen hat das Display schon mal mit 3V funktioniert, nur hat es dann bei sinkender Batteriespannung irgendwann auch nichts mehr gemacht, deshalb der Step-Up-Converter für eine zuverlässige Spannungsversorgung auf 3.3V. Sämtliches Experimentieren mit den Wartezeiten brachte keinen Erfolg. Einen falsch eingestellten Kontrast als Fehlerquelle kann ich ausschließen. Ich hoffe es hat jemand eine Idee zur Lösung, da ich auch in diversen Foren keine funktionierende Lösung gefunden habe. Grüße Steve
PS: bei Spannungsmessung der Eingangspins am Display erhält man dann auch das zuletzt gesendete Muster aus High- und Low-Pegeln, Portpins des Controllers scheinen also auf den ersten Blick ihren Dienst ordnungsgemäß zu tun. Grüße St
Die 40ms in der ersten Zeile bei init könnten zu viel sein (siehe delay.h). Versuch mal 15ms.
Und versuch mal 3ms Pause zwischen den Befehlen zu machen. Hier meine Init Sequence für 4-bit Ansteuerung: _delay_ms(15); // Wait LCD Ready // Initialize LCD SetIOLCD(0b00000011); // 8 Bit _delay_ms(5); SetIOLCD(0b00000011); // 8 Bit _delay_ms(1); SetIOLCD(0b00000011); // 8 Bit _delay_ms(1); SetIOLCD(0b00000010); // 4 Bit _delay_ms(2); SetDataLCD(0b00101000, LCD_CMD); // Mode: 4-Bit, 2-line, 5x7 _delay_ms(3); SetDataLCD(0b00001000, LCD_CMD); // Clear Display memory _delay_ms(3); SetDataLCD(0b00000001, LCD_CMD); // Clear Display memory _delay_ms(3); SetDataLCD(0b00000010, LCD_CMD); // Set cursor to move no shifting of LCD display _delay_ms(3); SetDataLCD(0b00001100, LCD_CMD); // Enable Display/Cursor _delay_ms(3);
15ms hab ich auch schon probiert ... nichts. bin sogar bis 1000ms hochgegangen. zusätzlich hatte ich auch die anderen delays proportional angepasst da das Display ja eigentlich für 5V ausgelegt ist und somit bei 3.3V theoretisch nur noch in etwa halb so schnell läuft.
Die delay_h routinen sind nicht für alle Werte valide. Schau mal in die Deklaration.
Hi Lt. Datenblatt: Technische Daten: Betriebsspannung: 5 V ... MfG Spess
> Lt. Datenblatt: > > Technische Daten: > Betriebsspannung: 5 V das mit den 5V ist mir klar, allerdings hat es ja auch schon bei frischen Batterien mit zusammen ca. 3.1V funktioniert... ?(
Hallo Steve, warum die Verzoegerung vor der Instruktion? Normalerweise sendet man zuerst die Instruktion und dann wartet man wie im Datenblatt beschrieben. Mit einem normalen HD44780 ist die Clear Display Instruktion die einzige die 15ms+ an Verarbeitungszeit braucht. Alle anderen genuegen sich mit 20us. //_delay_ms(40); send_display(0,0x30); //_delay_ms(4); //_delay_us(100); send_display(0,0x30); //_delay_us(100); send_display(0,0x30); send_display(0,0x30); send_display(0,0x38); send_display(0,0x08); // Die LCD CLEAR instruction braucht mindestens 20ms send_display(0,0x01); _delay_ms(40); send_display(0,0x06); send_display(0,0x0C); Versuch es mal so wie abgeaendert. Uebrigens ist es nicht todsicher dass das LCD noch bei 3V funktioniert. Mit der Kontrasteinstellung koennte es zumindestens Probleme geben. MFG Gerhard
Das ist schon mal völlig daneben: #include "util/delay.h" #define F_CPU 4000000UL /* Quarz mit 4.0 Mhz */ So rum gehört das #define F_CPU 4000000UL /* Quarz mit 4.0 Mhz */ #include "util/delay.h" Optimierung einschalten hilft dabei den Code klein zu halten ;) Also wenigstens -O1 Laut Pollin Datenblatt ist das ein KS070. Da würde ich folgende Init probieren: _delay_ms(10); _delay_ms(10); _delay_ms(10); _delay_ms(10); send_display(0,0x38); // two line, 8 bit _delay_us(25); _delay_us(25); send_display(0,0x0C); // display on _delay_us(25); _delay_us(25); send_display(0,0x01); // display clear _delay_ms(5); send_display(0,0x06); // entry mode set _delay_us(25); _delay_us(25);
Vielen Dank schon mal für all die Tipps, leider hat bisher nichts geholfen. Ich hab alle Hinweise ausprobiert, auch Kombinationen, nichts brachte Erfolg. @Gerhard: die Kontrasteinstellung macht keine Probleme, da der Kontrastpin ohnehin ca. -1.2V braucht, also an einer Ladungspumpe hängt. Die erste Verzögerung sollte laut Datenblatt als Wartezeit während der Stabilisierung der Spannungsversorgung dienen. Ich bin leider immer noch ratlos. MfG Steve
hallo leute, hab grad ein erfolgserlebnis gehabt: ich hatte das ganze projekt bereits in mehrfacher ausführung aufgebaut (3 geräte mit jeweils identischen Teilen) und nun einfach mal probiert den code auf einem anderen teil zum laufen zu bringen und siehe da das display lässt sich initialisieren und zeigt nun auch zu testzwecken immerhin schon ein "A" an. schein also ein hardwareproblem zu sein, muss ich nochmals alle pins checken und ggf nachlöten. ich denke nicht, dass der atmega defekt ist da er sich problemlos programmieren lässt und auch alle anderen dinge umsetzt die im aufgetragen werden. nun geht also die fehlersuche erneut los, falls jemand eine idee hat.... mfg steve ps: ich versuche trotzdem das timing nochmal zu verändern, sodass ich kürzest mögliche wartezeiten habe, falls es jemanden interessiert welches timing das display bei 3.3V braucht kann ich das ja einfach noch posten. grüße steve
_delay_ms(40); send_display(0,0x30); _delay_ms(5); send_display(0,0x30); _delay_us(200); send_display(0,0x30); send_display(0,0x30); send_display(0,0x38); send_display(0,0x08); send_display(0,0x01); _delay_ms(5); send_display(0,0x06); send_display(0,0x0C); und in der void send_display(...): ... _delay_us(250); PORTB |= (1<<EN); _delay_ms(2); PORTB &= ~(1<<EN); _delay_ms(2); funktioniert anscheinend zuverlässig
ist der Controller sicher ein echter HD44780? Beim oft als kompatibel bezeichneten KS0066 z.B. sieht die Initialisierung nämlich ganz anders aus. Beginnt z.B. mit 3 mal 0x03 und nicht 0x30... Unten ein Code für 4-Bit-Ansteuerung der bei mir funktioniert (Du machst es ja mit 8 Bit). Frank // Initialisierung fuer KS 0066 4-Bit RS = 0; E = 0; E = 1; delay_ms(10); E = 0; delay_ms(230); Send_ByteLCD(0x03,0); delay_ms(5); Send_ByteLCD(0x03,0); delay_ms(1); Send_ByteLCD(0x03,0); delay_ms(1); Send_ByteLCD(0x02,0); // ab hier 4 Bit Send_ByteLCD(0x2C,0); Send_ByteLCD(0x01,0); Send_ByteLCD(0x00,0); Send_ByteLCD(0x00,0); Send_ByteLCD(0x01,0); Send_ByteLCD(0x0C,0); Send_ByteLCD(0x01,0);
Ja, ich bin sicher, dass es zumindest ein HD44780 kompatibler controller auf dem display ist, schließlich funktioniert ja jetzt die initialisierung und somit auch die komplette restliche Ansteuerung. Danke trotzdem. Grüße steve
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.