Forum: Mikrocontroller und Digitale Elektronik LCD Initialisierung funktioniert nur zu 90%


von Axel (Gast)


Lesenswert?

Hallo Leute,

ich habe schon im Forum nach ähnlichen Beiträgen gesucht, bin aber nicht 
so recht fündig geworden.

Mein Problem ist, daß zwar meine LCD(4x20 Zeichen) Initialisierung 
grundsätzlich funktioniert, aber das es immer mal wieder vorkommt, das 
entweder nicht der 4 Bit Modus erkannt wird, oder das alle Zeichen um 
eine Stelle verschoben sind. In 9 von Zehn Fällen funktioniert es. Aber 
leider nicht immer.
Weiterhin ist mir aufgefallen, daß dieses Phänomen häufiger auftritt, 
wenn ich die Schaltung resete und nicht die komplette 
versorgungsspannung trenne. Sprich nach nem "warmstart" ist es öfters 
als nach nem "coldstart"
Wenn es allerdings richtig initialisiert hat läuft es fehlerfrei.

Habt ihr noch eine Ahnung woran das liegen könnte?

von Sauger (Gast)


Lesenswert?

Moin,

Timing.
Poste mal die Initialisierungssequenz.

MfG

von Axel (Gast)


Lesenswert?

Hier der Code. Sorry ist bissl kryptisch, da ich das LCD aus Mangel an 
freien Anschlüssen am Controller über mehrere Ports verteilen mußte.
Wie gesagt es funktioniert nur halt nicht immer!;)

void lcd_init(void)
{
   //PORTs initialisieren
   LCD_DDR_DATAPORT|=(1<<LCD_DDR_DATA1);
   LCD_DDR_DATAPORT|=(1<<LCD_DDR_DATA2);
   LCD_DDR_DATAPORT|=(1<<LCD_DDR_DATA3);
   LCD_DDR_DATAPORT|=(1<<LCD_DDR_DATA4);

   LCD_DDR_SIGNALPORT|=(1<<LCD_DDR_RS);
   LCD_DDR_SIGNALPORT|=(1<<LCD_DDR_RW);
   LCD_DDR_SIGNALPORT|=(1<<LCD_DDR_EN);

   _delay_ms(200);
   LCD_SIGNALPORT &=~((1<<LCD_RS) |(1<<LCD_RW));//RS,RW=0
   LCD_DATAPORT &= ~((1<<LCD_DATA3)|(1<<LCD_DATA4));//0011 D4D3D2D1 8bit 
Modus
   LCD_DATAPORT |=(1<<LCD_DATA1)|(1<<LCD_DATA2);
   lcd_enable();
   _delay_ms(60);
   lcd_enable();
   _delay_ms(60);
   lcd_enable();
   _delay_ms(60);

   LCD_DATAPORT &= 
~((1<<LCD_DATA3)|(1<<LCD_DATA4)|(1<<LCD_DATA1));//0010 4Bit Modus
   LCD_DATAPORT |=(1<<LCD_DATA2);//0010 4Bit Modus

   lcd_enable();
   _delay_ms(60);
  lcd_enable();
   _delay_ms(60);
  lcd_enable();
   _delay_ms(60);

     // 4Bit  2 Zeilen  5x7
   LCD_DATAPORT &= ~((1<<LCD_DATA3)|(1<<LCD_DATA4)|(1<<LCD_DATA1));
   LCD_DATAPORT |=(1<<LCD_DATA2);
   lcd_enable();
   LCD_DATAPORT &= ~((1<<LCD_DATA3)|(1<<LCD_DATA2)|(1<<LCD_DATA1));
   LCD_DATAPORT |=(1<<LCD_DATA4);
   lcd_enable();
    _delay_ms(40);

   // Display ein  Cursor aus  kein Blinken
   LCD_DATAPORT &= 
~((1<<LCD_DATA4)|(1<<LCD_DATA3)|(1<<LCD_DATA2)|(1<<LCD_DATA1));
   lcd_enable();
   LCD_DATAPORT &= ~((1<<LCD_DATA2)|(1<<LCD_DATA1));
   LCD_DATAPORT |=(1<<LCD_DATA4)|(1<<LCD_DATA3);
   lcd_enable();

   // inkrement / kein Scrollen
   LCD_DATAPORT &= 
~((1<<LCD_DATA4)|(1<<LCD_DATA3)|(1<<LCD_DATA2)|(1<<LCD_DATA1));
   lcd_enable();
   LCD_DATAPORT &= ~((1<<LCD_DATA4)|(1<<LCD_DATA1));
   LCD_DATAPORT |=(1<<LCD_DATA3)|(1<<LCD_DATA2);
   lcd_enable();
   lcd_clear();
}


void lcd_enable(void)
{
   LCD_SIGNALPORT |= (1<<LCD_EN);
   _delay_us(35);                   // kurze Pause 35us
   LCD_SIGNALPORT &= ~(1<<LCD_EN);
}

von Sauger (Gast)


Lesenswert?

Moin,
> Sorry ist bissl kryptisch
Ja... macht aber nichts.

Hat ein 4x20 Zeichen LCD nicht üblicherweise 2 EN Eingänge?

von Axel (Gast)


Lesenswert?

Also laut meinem Datenblatt besitzt es definitiv nur einen enable 
Eingang. Hab das Timing noch bissl geändert. Es ist daraufhin etwas 
besser geworden, doch es funktioniert immer noch nicht perfekt. Hat noch 
jemand eine Idee?

von Karl H. (kbuchegg)


Lesenswert?

> Weiterhin ist mir aufgefallen, daß dieses Phänomen häufiger
> auftritt, wenn ich die Schaltung resete und nicht die komplette
> versorgungsspannung trenne. Sprich nach nem "warmstart" ist es
> öfters als nach nem "coldstart"

Klingt für mich danach, als ob du das LCD etwas zu früh ansprichst. Lass 
dem LCD nach dem Start von main() etwas mehr Zeit, damit es seine 
bordeigene Initialisierung abschliessen kann, ehe du dann zum Zug 
kommst.

von Axel (Gast)


Lesenswert?

Habe jetzt aus den 200ms 2000ms Wartezeit gemacht. Leider ist das 
Verhalten immer noch wie vorher.

von Axel (Gast)


Lesenswert?

Gibt es eine Möglichkeit zu überprüfen, ob das Display richtig 
initialisiert hat? wenn ja wie?

von Peter D. (peda)


Lesenswert?

Axel schrieb:
> Hier der Code. Sorry ist bissl kryptisch

Nun untertreibst Du aber, er ist schlichtweg unlesbar.

Deutlich übersichtlicher wird es, wenn man sich erstmal ne 
Nibble-Funktion bastelt und darauf aufbauend die Initialisierung und die 
Byteausgabe.

Und noch schöner wirds dann mit Bitnamen:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

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.