LCD Initialisierung funktioniert nur zu 90%

Gast #1492601
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
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
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?
> 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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.