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?
Moin, Timing. Poste mal die Initialisierungssequenz. MfG
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); }
Moin,
> Sorry ist bissl kryptisch
Ja... macht aber nichts.
Hat ein 4x20 Zeichen LCD nicht üblicherweise 2 EN Eingänge?
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.
Habe jetzt aus den 200ms 2000ms Wartezeit gemacht. Leider ist das Verhalten immer noch wie vorher.
Gibt es eine Möglichkeit zu überprüfen, ob das Display richtig initialisiert hat? wenn ja wie?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.