Stránka 1 z 1
Jak na Busy v LCD 2x16 v 4bit módu?
Napsal: 08 led 2014, 17:16
od Celeron
LCD s 2x16 v 8 bit módu používám už léta se všema funkcema, co řadič HD 44780 či ekvivalent umí. Protože mám tentokrát k dispozici jen málo portů, chtěl jsem zkusit 4bit řízení. Teorie je jasná, B7-B4 na GND. Pošlou se horní 4 bity, pak E do 1, pak 0, následně spodní 4 bity, znova E jako pro horní bity. Při inicializaci se posílá 1. instrukce pouze horní 4 bity konkrétně 0010 aby se interface převrátil na 4bit. Na netu je spousta příkladů, jak to naprogramovat v A51 či C51 ale všichni to dělají s pauzama za zápisem do řadiče. Jenže to je pro mě nepřijatelný, tlačí mě časování. Takže je nutný testovat BUSY. Na 8bit interface s tím nemám problém (i s tímto konkrétním displejem) ale jak se to dělá u 4bitu?? Nikde jsem to nenašel... Předpokládám, že se BUSY musí testovat po každým zapisu 4bit dat ale jak konkrétně, když je BUSY na 7 bitu stavovýho slova? Taky nadvakrát? Dýlku čtení píšou 0uS, takže předpokládat, že jakmile nastavím RW=1, tak při prvním E=1 je vždy ihned k dispozici horní půlka a po druhým E=1 spodní půlka stavovýho slova? Jestli to tak má být, tak mi to nechodí, stavový slovo mi stále vrací 00 a to i pokud je kurzor na pozici větší než 0 a tudíž DDRAM adresa by měla být ve stavovým slově větší než 0. Pokud to ale krokuju ručně, tak displej píše správně, pokud to jede v reálu, píše kraviny, nahodilý znaky z poslanýho textu.
Když tu není Andrea, jestlipak se tu najde někdo, kdo bude vědět v čem je dílo??
Díky
Jirka
Napsal: 08 led 2014, 18:14
od nekmil
"Teorie je jasná, B7-B4 na GND" no teď jsi mě poněkud vykolejil. Já dělám v BASCOMU a tam se při 4-bitovém řízení právě na B4-B7 posílají data.
Napsal: 08 led 2014, 18:20
od Mendor
nekmil píše:...Já dělám v BASCOMU a tam se při 4-bitovém řízení právě na B4-B7 posílají data.
Hlavně klid, máš to správně. On se asi jenom splet.
Napsal: 08 led 2014, 23:12
od Atlan
Nejako ta nevidim ovladat RS bez toho nejde citat FLAG busy
Napsal: 08 led 2014, 23:58
od Celeron
Atlan píše:Nejako ta nevidim ovladat RS bez toho nejde citat FLAG busy
Pleteš se, čtení stavu je vývod RW. RS je identifikace instrukce nebo data. RW a RS a E mám určitě dobře, psal jsem, že to v 8 bitu chodí. Viz zde pro 8 bitu AT98C4051 (normální je pro 8 bit, modrá je přidaná pro 4 bit, vlastní čtení DDRAM se jen simuluje, nepotřebuju ji). Musel jsem přidat tečky Nuke neumí TAB a víc mezer za sebou. E, RW a RS jsou na P3.
BUSY:
.....CLR......E_LCD..........;LCD DISABLE
.....MOV.....P1,#0FFH.....;PREVRACENI P1 NA CTENI
.....CLR......RS_LCD........;INSTRUKCE
.....SETB.....RW_LCD......;CTI STAV
.....NOP.........................;PRO UKLIDNENI
.....SETB.....E_LCD.........;LCD ENABLE
BUSY1:
.....JB.........P1.7,BUSY1...;CEKA NA 0
.....CLR.......E_LCD.........;LCD DISABLE
.....SETB.....E_LCD.........;LCD ENABLE, CTENI DRUHY PULKY
.....NOP..........................;PRO UKLIDNENI
.....CLR......E_LCD...........;LCD DISABLE
.....CLR......RW_LCD.......;VRAT NA ZAPIS
.....SETB.....RS_LCD.......;NASLEDUJI DATA
.....RET
Jirka
Napsal: 09 led 2014, 08:19
od rnbw
Kod davaj to tagu [code]
Napsal: 09 led 2014, 09:52
od AB1
Napsal: 09 led 2014, 10:52
od Celeron
Dík, je to sice AVR s kterým nedělám ale instrukce vypadají podobně jako A51, tak to snad s tabulkou instrukcí rozlousknu.
Jirka
Napsal: 09 led 2014, 23:32
od judeware
Jiří,
podle mě je to trochu jinak. Z datasheetu hlavně vyplývá, že:
- minimální perioda hodin na vstupu Enable je 1µs
- oba dílčí přenosy bajtu jsou strobované sestupnou hranou Enable
Jenže při čtení busy/not busy je jen D7 onen klíčový bit, zbytek bajtu je aktuální adresní ukazazel CGRAM! Takže správně by to mělo vypadat následovně:
[1] přečíst stav busy/not busy
[2] počkat, až bude stav not busy
[3] poslat (příkladně) zápisový bajt
[4] odchod z podprogramu
A vlastní přenos bajtu (je fuk jestli zápis čehokokoli, čtení, zjišťování stavu) provádět stylem:
[1b] přenos prvního nibble (strobovaný sestupnou hranou Enable)
[2b] pauza 1µs
[3b] přenos druhého nibble (viz [1b])
Platí i pro tu proceduru "Read busy flag". První nibble obsahuje busy bit a část adresy, druhý zbylou část adresy CGRAM, takže podle něj (toho druhého) nelze odhadovat okamžik, kdy je dovolený další přenos bajtu po částech. Viz výše.
Napsal: 10 led 2014, 01:29
od Celeron
to judeware: Není to jinak.

Ale máš pravdu s časováním.

Koukal jsem na obslužák LCD napsanej pro AVR, co sem dal odkaz AB1 a dělají to úplně stejně jako já akorát přidali 2 NOPy mezi čtení první a druhý půlky stavovýho slova.
1/ nastaví RW=1, RS=0, E=1
2/ počkají 1 x NOP
3/ načtou první půlku stavu
4/ nastaví E=0
5/ počkají 2 x NOP
6/ nastaví E=1
7/ počkají 1 x NOP
8/ načtou druhou půlku stavu
9/ nastaví E=0
10/ otestují bit Busy a pokud stále je, tak to čtou celý znova
Takže i když datašít ukazuje na sestupnou hranu, tak řadič reaguje už na úroveň E=1. Takhle to v 8bit režimu používám od roku 1992.
Ale nejpodstatnější je, že když jsem přidal už 1 NOP ( do bodu 5/) tak se to rozjelo!!! Jestli počítám správně, tak při krystalu 12MHz je dýlka vykonání NOP právě kolem 1uS a nejspíš řadič LCD nedokázal na ten "pulz do nuly" mezi dvěma E(nable) zareagovat.
Díky všem kdo se ozvali.
Jirka