Forum: Mikrocontroller und Digitale Elektronik LCD4x40-KS0066 Probelm


von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

bin schon seit einigen Tagen daran ein 4x40 LCD (DEM40491SYH-LY) im 
4-Bit Modus in Betrieb zu nehmen. Benutze eine abgeänderte Version der 
Lib von Peter Fleury, die auf die Zeiten für einen KS0066 Controller 
umgeschrieben ist. Möchte nun einen von diesen zwei Controllern zum 
laufen bringen, also zwei Zeilen des Displays.
Bisher schaffe ich es einige Zeichen am Display auszugeben, allerdings 
beginnen die Wörter nicht beim Anfang des Displays. (siehe Bild)
Weiters ist es mir nicht möglich in die zweite Zeile des Displays zu 
schreiben.

Hardware:
Controller: ATMEGA 8 @ 8MHz
LCD: DEM40491SYH-LY

Könnt ihr mir helfen?

Danke im Voraus.

Gruß Philipp

von Klaus W. (mfgkw)


Lesenswert?

Philipp schrieb:
> abgeänderte

inwiefern abgeändert?

Vorschlag: probiere doch erst mal die Originalversion.
Wenn die geht, liegt es an deinem Programm.
Wenn nicht, evtl. an der HW - die hier niemand kennt.

Das Bild kann ich nicht sehen, weil ich kein rar anfasse.
Wahrscheinlich stimmen einfach die Anfangsadressen nicht.

von Jens (Gast)


Lesenswert?

Ich kenne die verwendete Lib nicht, doch meistens sind die für die 44780 
gemacht. Auch wenn im Datenblatt dieser Displays was von 
HD44780-kompatibel steht, so sind es die Dinger oft nicht. Schreibe dir 
einfach eine eigene Lib für das Display, so schwer ist das nicht und 
schaue als erstes ins Datenblatt bezüglich Timingverhalten, 
Initialsierung und Adressen... Wenn du halbwegs in der µC-Programmierung 
drin steckst, ist das in ASM eine Sache von ca. 2 Stunden. In C (pfui) 
dürfte es noch schneller gehen.

von Klaus W. (mfgkw)


Lesenswert?

Initialisierung und Timing scheinen ja zu gehen, wenn er seinen Text 
sieht.

von Spess53 (Gast)


Lesenswert?

Hi

Wie sieht es denn bei einem kürzeren Text (<20 Zeichen) aus?

MfG Spess

von Philipp (Gast)


Lesenswert?

Danke für die Antworten!

Bei einem kürzeren Text verhällt es sich gleich wie bei einem längeren.
Es schreibt zwar Zeichen aufs Display allerdings beginnt es nicht beim 
Displayanfang.

Bei der lib handelt es sich um eine umgeschriebene Version eines 
Forenbenutzers für KS0066 Controller.

Möglicherweise liegt es ja tatsächlich an den Anfangsadressen des 
ddr-ram.

Danke!

von Philipp (Gast)


Lesenswert?

Was mir auch aufgefallen ist ist, dass es an der ersten Stelle des 
Displays andere Zeichen ausgibt als es sollte!

Könnt Ihr euch erklären warum?

von Spess53 (Gast)


Lesenswert?

Hi

>Möglicherweise liegt es ja tatsächlich an den Anfangsadressen des
>ddr-ram.

Die DDRAM-Adressen findest du im Datenblatt. Setze doch mal den Cursor 
auf per Befehl auf die Adresse 0.

MfG Spess

von Philipp (Gast)


Lesenswert?

Danke für eure Antworten.

Ich habe jetzt anstatt der umgeschriebenen Lib die offizielle Lib von 
Peter Fleury in Verwendung.
Bin jetzt soweit, dass ich den Curser auch in die zweite Zeile an jede 
Position versetzen kann.(DDR Adressen stimmen)

Mein Problem liegt jetzt noch dabei, dass ich den Curser bei mehreren 
Resets nicht immer in die gewünschte Position bringe.
Daraus schließe ich, dass bei der Initialisierung noch etwas nicht 
stimmt, bin aber noch nicht darauf gekommen, was fehlerhaft ist.

Hier meine Initialisierung:

void lcd_init(uint8_t dispAttr)
{
#if LCD_IO_MODE
    /*
     *  Initialize LCD to 4 bit I/O mode
     */

    if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == 
&LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
      && ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == 
&LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
      && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN 
== 2) && (LCD_DATA3_PIN == 3)
      && (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
    {
        /* configure all port bits as output (all LCD lines on same 
port) */
        DDR(LCD_DATA0_PORT) |= 0x7F;
    }
    else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT 
== &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
           && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && 
(LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
    {
        /* configure all port bits as output (all LCD data lines on same 
port, but control lines on different ports) */
        DDR(LCD_DATA0_PORT) |= 0x0F;
        DDR(LCD_RS_PORT)    |= _BV(LCD_RS_PIN);
        DDR(LCD_RW_PORT)    |= _BV(LCD_RW_PIN);
        DDR(LCD_E_PORT)     |= _BV(LCD_E_PIN);
    }
    else
    {
        /* configure all port bits as output (LCD data and control lines 
on different ports */
        DDR(LCD_RS_PORT)    |= _BV(LCD_RS_PIN);
        DDR(LCD_RW_PORT)    |= _BV(LCD_RW_PIN);
        DDR(LCD_E_PORT)     |= _BV(LCD_E_PIN);
        DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
        DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
        DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
        DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
    }
    delay(15000);        /* wait 16ms or more after power-on       */

    /* initial write to lcd is 8bit */
    LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);  // _BV(LCD_FUNCTION)>>4;
    LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);  // _BV(LCD_FUNCTION_8BIT)>>4;
    lcd_e_toggle();
    delay(5000);         /* delay, busy flag can't be checked here */

    /* repeat last command */
    lcd_e_toggle();
    delay(100);           /* delay, busy flag can't be checked here */

    /* repeat last command a third time */
    lcd_e_toggle();
    delay(100);           /* delay, busy flag can't be checked here */

    /* now configure for 4bit mode */
    LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);   // 
LCD_FUNCTION_4BIT_1LINE>>4
    lcd_e_toggle();
    delay(100);           /* some displays need this additional delay */

    /* from now the LCD only accepts 4 bit I/O, we can use lcd_command() 
*/
#else
    /*
     * Initialize LCD to 8 bit memory mapped mode
     */

    /* enable external SRAM (memory mapped lcd) and one wait state */
    MCUCR = _BV(SRE) | _BV(SRW);

    /* reset LCD */
    delay(16000);                           /* wait 16ms after power-on 
*/
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit 
interface */
    delay(4992);                            /* wait 5ms 
*/
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit 
interface */
    delay(64);                              /* wait 64us 
*/
    lcd_write(LCD_FUNCTION_8BIT_1LINE,0);   /* function set: 8bit 
interface */
    delay(64);                              /* wait 64us 
*/
#endif

#if KS0073_4LINES_MODE
    /* Display with KS0073 controller requires special commands for 
enabling 4 line mode */
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
  lcd_command(KS0073_4LINES_MODE);
  lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
#else
    lcd_command(LCD_FUNCTION_DEFAULT);      /* function set: display 
lines  */
#endif
    lcd_command(LCD_DISP_OFF);              /* display off 
*/
    lcd_clrscr();                           /* display clear 
*/
    lcd_command(LCD_MODE_DEFAULT);          /* set entry mode 
*/
    lcd_command(dispAttr);                  /* display/cursor control 
*/

}/* lcd_init */


Wisst Ihr was man beim Betrieb mit dem KS0066 ändern muss?
Timing?

Danke!

von Philipp (Gast)


Lesenswert?

Okey mittlerweile habe ich alles zum Laufen gebracht.
Danke für eure Bemühungen.

Gruß Philipp

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.