ATMEGA8 + řízení LCD MC1602E, 4-bitová komunikace

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 :slight_smile:

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 :smiley: …)
S LCD pracuji prvne tak prosim trpelivost :slight_smile:

Predem moc diky za rady a pripominky

:arrow_right: administrator: přejmenováno z "ATMEGA8 + rizeni LCD MC1602E"
LCDfinal.rar (8.14 KB)
lcd_atmega.png

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)
schema.png

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)

Vtom by chyba byt nemela - zkusil jsem to zmenit a porad to nechodi:-(
Delam to podle: doveda.byl.cz/lcd/index.htm (inicializaci 4bitove komunikace)

Postup:
po zapnuti napajeni cekej 15ms
1C = 0001 1100 -> DB5 = 1 , DB4 = 1 a E = 1
pote cekam 4,1ms
znova poslu 1C -> DB5 = 1 , DB4 = 1 a E = 1
cekam 100us
znova 1C -> DB5 = 1 , DB4 = 1 a E = 1
14 = 0001 0100 -> DB5 = 1 a R = 1

Itak moc diky za snahu :slight_smile:

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

Že se na toho Dovedu vždycky někdo nachytá… On měl asi nějakej rychlejší displej, nebo co… :smiley: O displejích se tu na fóru už napsalo hodně, třeba tady:

viewtopic.php?t=1333&postdays=0&postorder=asc&highlight=hd44780&start=0

https://forum.mcontrollers.com/t/import-programu-pro-lcd-hd44780-z-pic16f877a-na-pic18f4620/1318/1

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.

Ahoj, vsem diky za reakce a rady :slight_smile:

Koukal jsem do datasheetu ale, to časování mi moc jasné není , a nevim, jak ho zmenit… :frowning:

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…)

Snad jsem to napsal aspon trochu srozumitelne…

hm at mega beziaca na 8Mhz tj jedna instrukcia 0,125us myslim ze to v pohode staci…je to viac ako 100ns

Dokonca pic nar 16f628 Foscilatora /4 napr pri 4 Mhz jedna instrukcia 1us co je viac ako dost

jenže já mám krystal 16MHz -> jedna instrukce zabere 0,06us = 60ns

muze byt problem prave vtom?
pokud mezi SET E a RESET E hodim NOP, tak by to mohlo bejt…

jdu to zkusit :slight_smile:

hm, tak vtom asi problém není:-(…ikdyz jsem mezi to vlozil NOP a tim prodlouzil sirku toho “E pulzu”, tak to nefunguje :frowning:

Tak tam tych NOpov kludne vloz 20-50. Jeden NOP naozaj trva velmi kratko.

Ajo, sirka “E pulzu” ma byt 300ns (pokud dobre ctu v datasheetu - Enable pulse width min 300)…
pri 16MHz zabere jedna instrukce 0,060us = 60ns
->
SBI PORT,E ;60ns
6x NOP ;6x60ns = 360ns
CBI PORT,E ;60ns

Vecer to zkusim :slight_smile:

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 :frowning: …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 :frowning:
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 :frowning:
Jinak kod v C je sice fajn, ale ja bych to rad rozchodil v ASM :slight_smile:

Itak diky za reakci:-)

beriem spat malo by to byt dobre v tej kniznizi to len ja pouzivam nestandarnu inicializaciu :smiley:

Uz se asi nemusite snazit, asi to vyresil.
programujte.com/?akce=diskuze&kam=vlakno&tema=16467-atmega8-±rizeni-lcd-mc1602e-4-bitova-komunikace

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…)

Každopádně všem moc díky za rady :slight_smile: