LCD Initialisierung funktioniert nur zu 90%

Gast #1492601
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?
Gast #1493703
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);
}
Gast #1495705
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?
#1495710
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.

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