přepnutí displeje MC1602E-SYL/H na jednořádkový mód

Zdravím,

mám problém se svojí knihovnou na dvouřádkový inteligentní displej… Použitý řadič je S6A0069. Na displeji je ze zadní strany napsáno ATM1602B. Problém je následují, po douhém ladění programu již konečně vypíši na displej co mám (tedy číslo 10 na první řádek a nápis ahoj na druhý řádek).

Ovšem po chvilce se displej přepne znovu do jednořádkového módu a nápis ahoj zmizí.

Ovšem není mi vůbec jasná příčina, na konci programu mám nekonečný cyklus while. Optimalizaci kódu mám jako Os. Jako procesor mám použit ATmega16. Setkali jste se njěkdy s tímto problémem? V inicializaci jsem vynechal poslání kódu 0x03, které je u původního řadiče Hitachi HD44780. Tento řadič začíná až kódem 0x02. Je mi to záhadou, asi mi nezbude než to ověřit na logickém analyzátoru…

Pokud jste se s tím někdo setkal, budu vděčný za jakoukoli radu!

V příloze posílám inicializaci displeje.

void Inicializace_LCD(unsigned char podsviceni)
{

unsigned char zaloha_DDR,zaloha_PORT;
volatile unsigned char maska;

sbi(DDR_LCD_ridici,RS_PIN);
sbi(PORT_LCD_ridici,RS_PIN);

sbi(DDR_LCD_ridici,E_PIN);
cbi(PORT_LCD_ridici,E_PIN);
  	

outp(0x00, PORT_LCD_data);	// výstup do log "0"
maska=0x0f;
maska=(DDR_LCD_data)|(maska<<prvni_bite_nibblu);
outp(maska, DDR_LCD_data);         // datove bity datového portu jako výstupní

dlouhe_zpozdeni(150);		// cekame 150ms na nabeh napajeciho napeti

// rezim 4 bitu

Posli_nibble(0x02);
_delay_ms(1);

Posli_prikaz(0x28);				// dva řádky
_delay_ms(2);
Posli_prikaz(0x0C);				//zapni displej
_delay_ms(2);
Posli_prikaz(0x01);				//smaž displej
_delay_ms(2);
Posli_prikaz(0x06);				//režim inkrementace
_delay_ms(2);

}

Ještě přikládám video s tím jak se to chová po zapnutí napájení. Jak je vidět, někdy vše funguje korektně, někdy jsou problémy a přepne se to zpět do jednořádkového režimu.

youtube.com/watch?v=pzP9W8mB … e=youtu.be

Na videu je vidět, že když po vypnutí necháš dostatečně dlouhou pauzu, tak to funguje, jak má. Při kratších vypnutí se nestačily vybít kondenzátory a displej se nevypnul. Proto ty problémy při novém zapnutí. Problém je v inicializaci LCD - konkrétně ve přepnutí na 4-bitovou komunikaci. Pokud v ní už je, pak příkaz Posli_nibble(0x02); společně s dalším zápisem způsobuje onen problém.

Tohle by to mělo vyřešit :

Posli_nibble(0x03); // Přepnutí do 8-bitové komunikace
_delay_ms(1);
Posli_nibble(0x03); // Přepnutí do 8-bitové komunikace
_delay_ms(1);
Posli_nibble(0x03); // Přepnutí do 8-bitové komunikace
_delay_ms(1);
Posli_nibble(0x02); // Přepnutí do 4-bitové komunikace
_delay_ms(1);

Pokud chceš vědět, proč posílám nibble 0x03 a to hned 3x, přečti si tento můj příspěvek : https://forum.mcontrollers.com/t/vlastna-kniznica-pre-hd44780-4-bit-mod-a-specificke-upravy/2825/12

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Balů díky moc za radu! Na toto bych určitě jen tak brzy nepřišel. Zajímavé že u řadiče HD44780U je sekvence 0x03 zmíněna, ale u S6A0069 tomu tak není… Navíc jim chybí zpoždění mezi znaky 0x02 a následujícím přkazem 0x28, k tomu již někdo něco psal v jedné diskusi.

Teď vše funguje naprosto bezchybně. Stejně jsem ale zmatený jakto, že přepnutí do 1 řádkového módu nastalo až po výpisu řetězce “ahoj” na displeji. Zřejmě došlo špatným příkazem ke ztrátě synchronizace.

To se Ti jenom zdá. Tím, že nedošlo k dostatečnému vybití kondenzátorů nedošlo k vypnutí LCD. Tím pádem zůstal LCD ve stavu, jako kdyby jsi jenom restartoval mcu. Z toho důvodu, jakmile jsi vyslal nibble 0x02 došlo k tomu, že LCD očekával druhou polovinu příkazu (protože byl ve 4-bitovém režimu) - v tomto případě horní část bytu 0x28 - tudíž dostal příkaz 0x22 = 4-bit. komunikace, 1 řádek, znaky 5x10 bodů. Druhá polovina bytu 0x28 už se ale interpretovala v LCD jako 0x80 (z dalšího bytu 0x0C - zapni displej), což je set DDRAM address atd. Prostě byla ztracena synchronizace. Dvojitým vysláním nibble 0x3 (= command 0x33, pokud byl v synchronizaci) se LCD přepne do 8-bitové komunikace, následuje příkaz 0x30 (nibble 0x03+nulový stav na dolních datových pinech LCD). Pokud nebyl synchronní, tak první vyslání nibble 0x03 dokončí rozpracovaný příkaz a 2. a 3. vyslání nibble 0x03 odešle do LCD příkaz 0x33 - tedy přepnutí do 8-bitové komunikace. V případě, že tato sekvence proběhla po zapnutí se LCD 3x přepne do 8-bitového režimu. Následující nibble 0x02 (= 8-bitově 0x20, protože nibble je na horních bitech a dolní bity by měly být uzemněny) pak způsobí přepnutí do 4-bitové komunikace - 1řádek, znaky 5x8. A dále už následuje 4-bitová komunikace.