jednoradkovy LCD zobrazuje jen 8 znaku

Připojil jsem k ATMega8 jednořádkový 16znakový LCD pomocí 4 datových vodičů a použil Fleuryho knihovnu (homepage.hispeed.ch/peterfleury/ … .html#libs). Funguje to, ale zobrazuje se na displeji jen prvních 8 znaků. Protože s LCD dělám poprvé, nevím, jestli je chyba v tom, že jsem zapomněl něco nastavit v lcd.h nebo mám displej s avr špatně prodrátovaný.
LCD připojuji na port D
data4 - pin0
data5 - pin1
data6 - pin2
data7 - pin3
RS - pin4
RW - pin5
E - pin6

[code]#include <avr/io.h>
#include <avr/pgmspace.h>
#include “lcd.h”

int main(void)
{
lcd_init(LCD_DISP_ON);
lcd_command(LCD_FUNCTION_4BIT_1LINE );
lcd_clrscr();

for(;:wink:
{
lcd_clrscr();
lcd_puts(“1234567890123456”);
// dalsi kod
}

}
[/code]
Po připojení displeje k napájení bez AVR se na něm objevuje na prvních 8 pozicích 8 čtverečků a na dalších pozicích už nic. Je potřeba pro aktivaci všech 16 pozic nějaká softwarová inicializace nebo to vypadá spíš na vadný displej? V dokumentu “http://www.dbzoo.com/_media/livebox/how_to_use_cdm_1.pdf” se píše “When powered up, the display should show a series of dark squares, possibly only on part of the display.”.

Když to něco píše, tak to je zapojený správně.
Můžeš zkusit nastavit definice v .h souboru na displej 16x4 a zapsat něco do každýho řádku. Kdyby měl tvůj displej jinak namapovanou paměť, nejspíš by se ti něco povedlo dostat i na druhou osmici.
Když to nerozjedeš, vlož sem aktuální .h soubor a typ lcd. Na 16x2 mi tento modul pracuje bez problému.

Displeje 16x1 bývají organizované jako dva řádky po osmi znacích.
Takže v lcd.h napiš

#define LCD_LINES 2 /**< number of visible lines */ #define LCD_DISP_LENGTH 8 /**< visibles characters per line */

V lcd.h jsem pro zkoušku nastavil

#define LCD_WRAP_LINES      1     /**< 0: no wrap, 1: wrap at end of visibile line */

a posílám do LCD sekvence
11223344556677889900aabbccddeeffgghhiijjkkllmmnn
i
11223344556677889900aabbccddeeffgghhiijjkk
zobrazí
gghhiijj

11223344556677889900aabbccddeeffgghh
zobrazí
gghhaabb

lcd_puts("12345678"); _delay_ms(1000); lcd_puts("90abcdef"); _delay_ms(1000); lcd_puts("ghijklmn"); _delay_ms(1000); lcd_puts("opqrstuv"); _delay_ms(1000);

zobrazuje
12345678
ghijklmn

když

#define LCD_LINES           4     /**< number of visible lines of the display */

a když přidám řádky

lcd_puts("wxyz,*-/"); _delay_ms(1000);
zobrazí
12345678
čeká 4s a zobrazí
wxyz,*-/

Mám z toho dojem, jakoby do 5. až 16. pozice zapisoval, ale nezobrazuje - jakoby HW chyba (?)

čip
S6A0069
dle datasheetuřádka začíná 0x00,
kdyby byl dvouřádkový, čip by začal druhou řádku na 0x40 - stejně jako 44780
lcd.h (10.9 KB)

AB: dík, psal jsem příspěvek, laboroval a nerefrešoval okno tak jsem si Tvého nevšiml. Jdu to zkusit.

JO!

#define LCD_LINES 2 /**< number of visible lines */ #define LCD_DISP_LENGTH 8 /**< visibles characters per line */
a

lcd_command(LCD_FUNCTION_4BIT_2LINES ); 

to vyřešilo.
Díky.
Pavel

Je ten lcd_command() v programe vôbec potrebný?
Vždy používam 4 bitovú komunikáciu, lcd displej 16x2 a zatiaľ som tento príkaz na správnu funkciu nepotreboval - všetko potrebné som nastavil v #define súborov knižnice.

Popravdě řečeno, nevím, když jsem nastavil pouze

#define LCD_LINES 2 #define LCD_DISP_LENGTH 8, tak mi pořád LCD zobrazoval jen 8 znaků. První, co jsem zkusil bylo právě

lcd_command(LCD_FUNCTION_4BIT_2LINES ); a rozběhlo se všech znaků 16.
Má to malou nevýhodu, při zapisování řádku s 16 znaky se nejdříve ukáže prvních 8 a po malé chvilce teprve zbylých 8. Nevadí to, ale působí to divně. Je-li tedy jiná možnost nastavení ne LCD commandem ale v define, sem s ní.

Neskúšal si to takto?

#define LCD_LINES 1 #define LCD_DISP_LENGTH 16

sqad: Ano, toto nastavení jsem zkoušeljako jedno z prvních, ale při nastavení právě jedné řádky s 16 znaky se zobrazí jen prvních 8 znaků. Mám v LCD nějaký čip od Samsunga, který je sice kompatibilní s 44780, ale asi ne zcela.

Jak jsem psal, displej 16x1 je dvouřádkový takže musíš napsat 8 znaků do prvního a 8 do druhého řádku.
Jde zapsat i 16 znaků najednou, když nastavíš LCD_WRAP_LINES.
Aspoň u mne to tak funguje bez nějakého zpoždění.

lcd_command(LCD_FUNCTION_4BIT_2LINES );
Tento příkaz už byl provedený ve funkci lcd_init(), takže by neměl nic ovlivnit.

Ospravedlňujem sa, tvoj príspevok som prehliadol…