mikrocontroller.net

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


Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Timing.
Poste mal die Initialisierungssequenz.

MfG

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
> Sorry ist bissl kryptisch
Ja... macht aber nichts.

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

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Axel (Gast)
Datum:

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

Autor: Axel (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.