Jak na Busy v LCD 2x16 v 4bit módu?

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 20524
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

Jak na Busy v LCD 2x16 v 4bit módu?

#1 Příspěvek 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
Uživatelský avatar
nekmil
Příspěvky: 787
Registrován: 06 bře 2005, 00:00
Bydliště: Havířov

#2 Příspěvek 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.
Uživatelský avatar
Mendor
Příspěvky: 223
Registrován: 16 dub 2008, 00:00
Bydliště: Kladno

#3 Příspěvek 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.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#4 Příspěvek od Atlan »

Nejako ta nevidim ovladat RS bez toho nejde citat FLAG busy
Uživatelský avatar
Celeron
Příspěvky: 20524
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#5 Příspěvek 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
Uživatelský avatar
rnbw
Příspěvky: 37419
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#6 Příspěvek od rnbw »

Kod davaj to tagu [code]
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#7 Příspěvek od AB1 »

Uživatelský avatar
Celeron
Příspěvky: 20524
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#8 Příspěvek 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
Uživatelský avatar
judeware
Příspěvky: 2025
Registrován: 04 srp 2009, 00:00
Bydliště: okres Písek

#9 Příspěvek 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.
Přílohy
HD44780.png
(62.6 KiB) Staženo 90 x
Uživatelský avatar
Celeron
Příspěvky: 20524
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#10 Příspěvek od Celeron »

to judeware: Není to jinak. :) Ale máš pravdu s časováním. :prst: 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. :comppc:
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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“