Řízení grafického LCD s budiči ST8024 a ST8016
(bez řadiče)
Nedávno jsem v HW shopu zakoupil LCD PG320240WRM-HNNIS3 za cca 2kKČ. Jedná se o negativní modrobílé LCD
s LED podsvětlením. Původně jsem sice chtěl černobílý displej, ale ten stojí 3 a více kKČ.
Tento displej se prodává i v provedení s touchscreenem. Displej má rozlišení 320x240 pixelů, velikost bodu je 0,22mm.
Celá viditelná plocha je velká asi 8x6cm, takže se modul dá použít i pro zobrazení jednoduché 2 barevné grafiky v mřížkové
nebo chybové difuzi. Číslování a význam vývodů
Číslo 1 bývá označeno na desce LCD modulu v místě, kde je připojen páskový přívod.
Komunikace s displejem
Oba hodinové vstupy CL1 a CL2 reagují na sestupnou hranu, klidový satv je log.1. Vstup D-OFF v log.0
blokuje výstupy budiče LCD. Je třeba zajistit, aby bez neustálého obnovování LCD byl tento vývod
v log.0, jinak jsou tekuté krystaly buzeny stejnosměrně. Toto může LCD zničit!
Log.1 na FLM vstupu behem tiku na CL1 vstupu resetuje vertikalni budič na 1.řárek (začátek snímku).
Vstup M je takt budičů "skla". Měl by být v rozmezí 200-400Hz a je třeba ho nastavit s ohledem na
refresh LCD, protože mohou vznikat opět interference.
Pokusný řadič displeje
Jde o standardní připojení externí paměti k AVR jednočipům. Nejnižší bit adresy je však místo do RAM připojen do selektoru dat, který vybírá horní nebo dolní 4 bity dat pro LCD. CL2 vstup LCD není buzen zvláštním pinem procesoru, ale přímo RD signálem RAM interfacu AVRka. Obě tyto HW úpravy nahrazují znanou část SW a urychlují špičkovou přenosovou rychlost dat do LCD až na velmi solidních 2,66MB/sec při taktu 16MHz. Odeslání 1 řádku pak trvá jen asi 280 tiků MCU. Po každém řádku je generován timeout 800 tiků, během kterých je možné po volném portu portd přijímat data nebo instrukce. Řadič obnovuje obraz na frekvenci asi 55Hz, signál na pinu M je generován standardně na kmitočtu 150Hz (v obrazu nejsou při tomto kmitočtu vidět zádné interference), ale instrukcí ho lze měnit v rozsahu 130-1000Hz. Přenos dat je synchronní a je řízen pomocí 3 signálů. RS signál vybírá data=1/instrukci=0 jako u HD44780. Další 2 piny jsou vstupní a výstupní hodiny. Při přenosu dat do řadiče z master obvodu je hodinový vstup CK1 použit jako indikace dat na sběrnici. Výstup CK2 řadiče indikuje master obvodu načtení datového bytu. Hodinové signály nejsou impulzy, ale pro zvýšení přenosové rychlosti pouze změny úrovně. Při přenosu dat do master obvodu se funkce hodin obrátí. Sběrnice má asi takovou propustnost, že master obvod může zapsat cca 30 snímků za vteřinu (z interní RAM). Přenos probíhá vždy minimálně po 2B. NIKDY se však přenos nesmí zastavit během přenosu těchto 2B, jinak řadič bude čekat a dojde k zastavení buzení.
Mimo refresh LCD také ATmega64 zpracovává signál z touchscreenu a provádí korekci podle
zapasných korekčních koeficientů na rozsah x=0..319 a y=0..239. Pakliže není detekován dotyk, vrací řadič hodnoty 0xFFFF.
Navíc ještě řadič digitálně filtruje měřené hodnoty, protože ve chvíli dotyku a uvolnění není
výstupní hodnota přesně definována. Parametry filtru lze měnit instrukcemi.
Tabulku jednotlivých instrukcí, jejich kódů a parametrů naleznete přímo ve
zdrojovém kódu. Na začátku zdrojáku je také nastavení fuse-bitů. S připojením
vývodů touch screenu je třeba trochu experimentovat, protože nejsou nijak označeny.
Ukázkový program pro komunikaci s řadičem
Tento prográmek vypisuje několik textů upraveným fontem 10pt Arial a vyhodnocuje data z touchscreenu. Při stisku fólie se zobrazí souřadnice stisku a souřadnicový kříž. Kalibrační konstanty jsou nastaveny jen zkusmo, ale měly by pro většinu LCD vyhovět. Z výše zmíněných důvodů musí být při programování MCU resetován i budič, takže resety jsou spojeny.
Prográmek obsahuje jen základní rutiny pro výpis textu z FLASH a
jednotlivých znaků. Dál jsou tam rutiny pro výpis BCD čísel s potlačením nul na
začátku. Díky omezené RAM nelze naráz pracovat s více než jedním řádkem. Obraz s nejprve
zapisuje do pracovního bufferu a až nakonec se odesílá řadiči LCD. Vzhledem k organizaci
paměti řadiče se během odesílání zároveň musí vertikální osmice pixelů v pracovním bufferu
převrátit na horizontální. Zabírá to relativně dost času, ale vyhnout se tomu nelze,
protože generovat proporcionální text přímo do bytů "naležato" je časově ještě náročnější.
Jelikož se obraz neustále obnovuje (přepis celé obrazové RAM bílou barvou a následně nové vykreslení textu),
je třeba zajistit dvojité buffrování, jinak obraz bliká. Přeloženo do češtiny: Zapisuje se do
jednoho bufferu, zatímco se obraz vykresluje z druhého. Po kompletním přepisu nového obrazu
se buffery prohodí atd. Je však vhodné generovat před změnou bufferů zpoždění, protože
zobrazovací buffer se přepne vždy až s novým snímkem.
Poslední aktualizace: 16.12.2006 |