Ahoj,
snazim se rozchodit 4 bitovou komunikaci s LCD. Program je psany v ASM a je vicemene prevzaty z knihy od Davida Matouska - Prace s ATMEGA16.
Info o LCD jsem cerpal predevsim odtud: doveda.byl.cz/lcd/index.htm
Jde konkretne o typ tento LCD: gme.cz/cz/mc1602e-sbl-h-p513-128.html
Prikladam projekt v AVRStudiu, ktery se sklada ze dvou casti - hlavni program lcdfinal.asm + lcd.inc = knihovnma pro praci s LCD.
Program jsem nekolikrat prochazel, krokoval,…ale porad nevim kde delam chybu(po nahrani do MCU se na LCD nic neukazuje:-( …)
Tak kdyby byl nekdo tak moc hodnej a prosel muj kod, abych vedel co delam spatne, tak bych byl moc vdecnej …
Program by mel postupovat tak, ze vola metodu LCDINI z knihovny lcd.inc, tam se natavi 4b komunikace,…
a pote by mel zobrazovat text…
Jinak LCD je urcite vporadku(po nahrani vzoroveho programu z doveda.byl.cz pro 16F84ku pracuje vporadku:-), takze chyba je nekde mezi stolem a zidli …)
S LCD pracuji prvne tak prosim trpelivost
Ahojky.
Tak koukam, ze uz jsi rozchodil podsviceni…
Ja pouzivam knihovnu odtud jump.to/fleury.
Zkus to zapojit podle meho obrazku a potom pouzit muj projekt. Nezapomen nastavit frekvenci na 8Mhz, nebo zmenit promenou F_CPU na frekvenci tveho procesoru. Zkus to nejprve s internim oscilatorem, ja externi vubec nepouzivam, funguje i pro RS232. LCD_Test.zip (71.4 KB)
Prohlédl jsem ten kód a soudím, že je chyba v té části lcd.inc. Zde je prográmek( je to pro AT90S2313, 8MHz) a funguje bez problémů. Zkus v tom tvém programu změnit v LCDINIT hodnotu $1C na $1B a $14 na $20. PROG_05.ASM (3.6 KB)
Obecně nejčastější chyba je, že se málo čeká, pak to nechodí. V tom druhém odkazu je to v komentářích programu od Honzy3 dobře popsané, tak to zkus podle toho (je to sice pro jiný procesor, ale časy pro displej budou zhruba stejné).
Tak jsem ten program zkusil nahrát do uProc. a s LCD(WC1602A) to bez problémů funguje. Pak jsem to ještě zkusil s LCD(AMC2004AR-B) a tam už to zobrazuje chybně znaky, pro správnou funkci jsem musel upravit časování v inicializační rutině. Pročti datasheet jaké je potřeba časování pro ten tvůj LCD.
Koukal jsem do datasheetu ale, to časování mi moc jasné není , a nevim, jak ho zmenit…
Jen me napada display command - writedata a readdata - 46us … ja mam zpozdeni jen 40us…mohlo by to byt tim?
ani mi neni moc jasny ten vysvetlujici obrazek u write timing:
(jednak jsou skoro necitelne popisky jednotlivych casu…)
chapu to tak, ze:
-nastavim RS podle toho zda se jedna o prikaz-data
-zaroven stim nastavim R/W na nulu(zapis)
-dale po case Tsu1(100ns) nastavim E na logickou jednicku
-E musi byt v logicke jednicce min cas Tw (300ns)
-data musi byt vystavena Tsu2(60ns) pred tim nez shodim E na nulu
-a musi byt vystavena este Th2(10) pote, co shodim E na logickou nulu
Treba to, ze sirka E pulzu musi byt 100ns je divne, v programu mam casto jen SET E a hned dalsi instrukce RESER E
i v ukazkovem programu pro PIC jsou to dve instrukce radek pod sebou…(ten program funguje a LCD zobrazuje…)
tak jsem zkusil program trochu upravit - snazil jsem se oto, aby sedelo casovani podle datasheetu(na nektera mista jsem pridal NOPy)…
snazil jsem se to udelat tak, ze:
nastavim RS , po case 100ns nastavim E na logickou jednicku
-sirku E pulzu mam min 300ns
-data mam vystavena 60ns pred tim nez shodim E na nulu
-a musi byt vystavena este 10ns pote, co shodim E na logickou nulu
a po nahrani do MCU porad nefunguje …displej se rozsviti a v prvnim radku jsou videt ctverecky(vsechny pixely cerne…)
zkousel jsem krokovat v simulatoru a casy mi sedi…
prikladam projekt s upravenym kodem…
Uz jsem ztoho pomalu zoufalej … LCDfinal.rar (8.45 KB)
v tej kniznici je zla inicializacia…podla mna odveci celkom… nahazdujes E a nedas tam ziadne data…
void wrdata (unsigned char data)
{ unsigned char a,i=0b10000000;
for (a=0;a<cmd;a++)
{bsf_E;
_delay_us(1);
bcf_DB4;
bcf_DB5;
bcf_DB6;
bcf_DB7;
if (i&data) bsf_DB7;
i>>=1;
if (i&data) bsf_DB6;
i>>=1;
if (i&data) bsf_DB5;
i>>=1;
if (i&data) bsf_DB4;
i>>=1;
bcf_E;
_delay_us(1);
}
_delay_us(40);
bsf_RS;
return;
}
void inilcd (void)
{ _delay_ms(15);
cmd=1; //toto je tu len preto ze sa posiela len jedna polovica z 8 bitov
wrcmd(0x20); //4 bit comunikacia
cmd=2; //uz sa posielaju obe polovice
wrcmd(0x28); //5x7,2 riadky
wrcmd(0x01); //zmaze displey
_delay_ms(4);
wrcmd(0x0C); //zapne displey
wrcmd(0x06); //normlny mod inkrement.
_delay_ms(4);
return;
}
nahazuju E a nedam tam data? jak to myslis? a kde konkretne vtom programu to tak mam?
Ja tam nic takoveho nevidim …
Jinak kod v C je sice fajn, ale ja bych to rad rozchodil v ASM
Ano, už je to vyřešené, LCD asi vážně jen nestíhal, ikdyž je mi to divné protože podle časů v simultárou to stíhat měl…(dokonce jsem měl časové rezervy…)