Forum: Mikrocontroller und Digitale Elektronik LCD lässt sich nicht initialisieren


von Steve (Gast)


Angehängte Dateien:

Lesenswert?

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

von Steve (Gast)


Lesenswert?

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

von Pete K. (pete77)


Lesenswert?

Die 40ms in der ersten Zeile bei init könnten zu viel sein (siehe 
delay.h).
Versuch mal 15ms.

von Pete K. (pete77)


Lesenswert?

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);

von Steve (Gast)


Lesenswert?

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.

von Pete K. (pete77)


Lesenswert?

Die delay_h routinen sind nicht für alle Werte valide. Schau mal in die 
Deklaration.

von Spess53 (Gast)


Lesenswert?

Hi

Lt. Datenblatt:

Technische Daten:
Betriebsspannung: 5 V
...

MfG Spess

von Steve (Gast)


Lesenswert?

> 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... ?(

von Gerhard. (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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);

von Steve (Gast)


Lesenswert?

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

von Steve (Gast)


Lesenswert?

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

von Steve (Gast)


Lesenswert?

_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

von Frank Z. (frankovic)


Lesenswert?

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);

von Steve (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.