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
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.
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.
Initialisierung und Timing scheinen ja zu gehen, wenn er seinen Text sieht.
Hi Wie sieht es denn bei einem kürzeren Text (<20 Zeichen) aus? MfG Spess
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!
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?
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.