Hallo zusammen, nach dem Neustart initialisiert der uC das LCD mit der Standard Initialisierungsroutine, LCD nimmt die Befehle an und zeigt die geschickten Zeichen. Was ist wenn der uC einen Reset macht (Fehler, EMV,..) aber das LCD bleibt weiterhin versorgt: nach diesem Reset initialisiert der uC wieder das LCD, der aber diesmal nur einen schwarzen Balken anzeigt.(anscheinend weil es für das LCD kein Neustart ist) Ist es normal oder habe ich irgendwas falsches bei der Initialisierung gemacht? Wenn das im Betrieb passiert dann muss der Anwender das ganze nochmal neu starten, oder muss das der uC selber tun: kostet dann einen Output. Wie macht man das am besten? (ok, am besten keinen Reset, aber für den Fall der Fälle muss sich alles wieder einfangen und funktionieren ohne das der Anwender was tut)
Wenn du den uC Neustartest wird doch das Programm von vorne begonnen und somit eigentlich das LCD frisch initialisiert. Dann musste es doch gehen ? Oder mit Watchdog arbeiten , wäre eine Lösung ! MFG
Vermutlich stimmt die Befehlsfolge für das Umschalten in den 4-Bit-Mode nicht. Timingproblem? Wie ist das LCD angeschlossen? Mehr Input, bitte.
Ok, dann stimmt die Initialsierugsroutine nicht 100%, nach dem Neustart funktioniert sie immer, nur eine Reinitialisierung geht nicht.
1 | // Set Display to 4Bit
|
2 | cmd = LCD_SET_FUNCTION_CMD | LCD_FUNCTION_4BIT_CMD; |
3 | WriteLcdCmd(cmd); |
4 | //Wait for 40us
|
5 | /* for(i=0; i<400; i++)
|
6 | {
|
7 | j++;
|
8 | }*/
|
9 | // Function Set
|
10 | cmd = LCD_SET_FUNCTION_CMD | LCD_FUNCTION_2LINE_CMD | LCD_FUNCTION_5X8_CMD; |
11 | WriteLcdCmd(cmd); |
12 | //Wait for 40us
|
13 | for(i=0; i<400; i++) |
14 | {
|
15 | j++; |
16 | }
|
17 | // Display On/Off Control
|
18 | cmd = LCD_SET_DISPLAY_CMD | LCD_DISPLAY_ON_CMD | LCD_CURSOR_OFF_CMD | LCD_BLINKING_OFF_CMD; |
19 | WriteLcdCmd(cmd); |
20 | //Wait for 40us
|
21 | for(i=0; i<400; i++) |
22 | {
|
23 | j++; |
24 | }
|
25 | // Display Clear
|
26 | cmd = LCD_CLEAR_DISPLAY_CMD; |
27 | WriteLcdCmd(cmd); |
28 | //Wait for 1.6ms
|
29 | for(i=0; i<10000; i++) |
30 | {
|
31 | j++; |
32 | }
|
33 | // Entry Set Mode
|
34 | cmd = LCD_SET_ENTRY_CMD | LCD_ENTRY_INCREASE_CMD | LCD_ENTRY_NOSHIFT_CMD; |
35 | WriteLcdCmd(cmd); |
36 | //Wait for 40us
|
37 | for(i=0; i<4000; i++) |
38 | {
|
39 | j++; |
40 | }
|
> Wie macht man das am besten? Am besten so, wie es im Datenblatt steht oder wie es 1000e andere machen: Den Softreset-Befehl dreimal schicken, damit der HD44780 sicher im richtigen Modus ist, egal, ob er vorher im 4- oder 8-bit-Mode war. Siehe http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung lcd_out( LCD_SOFT_RESET ); _delay_ms( LCD_SOFT_RESET_MS1 ); lcd_enable(); _delay_ms( LCD_SOFT_RESET_MS2 ); lcd_enable(); _delay_ms( LCD_SOFT_RESET_MS3 ); // 4-bit Modus aktivieren lcd_out( LCD_SET_FUNCTION | LCD_FUNCTION_4BIT ); _delay_ms( LCD_SET_4BITMODE_MS );
eProfi schrieb: > Den Softreset-Befehl dreimal schicken, damit der HD44780 sicher im > richtigen Modus ist, egal, ob er vorher im 4- oder 8-bit-Mode war. Das war's, vielen Dank
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.