Forum: Mikrocontroller und Digitale Elektronik (Re)Initialisierung von LCD (HD44780)


von Lamy (Gast)


Lesenswert?

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)

von Norbert (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

Vermutlich stimmt die Befehlsfolge für das Umschalten in den 4-Bit-Mode 
nicht.
Timingproblem?
Wie ist das LCD angeschlossen?
Mehr Input, bitte.

von Lamy (Gast)


Lesenswert?

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
    }

von eProfi (Gast)


Lesenswert?

> 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 );

von Lamy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.