Řízení grafického LCD s budiči ST8024 a ST8016
(bez řadiče)

[eng]

   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.
   Tento modul však má jeden dost vážný nedostatek - nemá řadič, ale pouze budiče "skla", které si samy negenerují ani potřebné hodinové signály. Pokud tedy na LCD něco chcete zobrazit, tak musíte obraz nustále obnovovat jako na CRT monitoru a to s obnovovací frekvencí v rozmezí 55-75Hz (podle datasheetu). Páni inženýři navíc šetřili na drátech, takže modul má pouze 4-bitovou sběrnici (budiče ale umí i 8-bit). Refresh tedy zabere i relativně výkonným MCU většinu výkonu. Další problém je, že obnovování musí probíhat co nejrovnoměrněji - intervaly mezi jednotlivými řádky musí mít odchylku maximálně asi 5%, jinak se na obrazu projeví interference (běžící pruhy apod.). Pozitivní na tomto modulu je že obsahuje měnič napětí pro budiče, takže není třeba přivádět externích 20V.


Čí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.

Vývod Název Funkce
1 FLM snímkový synchronizační vstup
2 M vstup pro takt budiče "skla"
3 CL1 vertikální hodinový vstup
4 CL2 horizontální hodinový vstup
5 D-OFF log.0 vypne budiče
6 DB0 data bit D0
7 DB1 data bit D1
8 DB2 data bit D2
9 DB3 data bit D3
10 Vdd napájení +5V
11 Vss GND
12 Vee vstup pro korekci kontrastu
13 Vss GND
14 NC nezapojovat
15 A anoda podsvětlení (Imax=150mA @ cca 3V)
16 K katoda podsvětlení

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.
   Postup zobrazování je tedy následovný: Nejprve se na FLM vstup přivede log.1, vygeneruje se tik na CL1 vstupu. Následně FLM do log.0, a pak postupně signálem CL2 naclockovat do vertikálního budiče 40B, tedy 80 4-bitových slov. Prvně odeslané slovo je umístěno na řádku vlevo bitem LSB vlevo. Po odeslání řádku se generuje tik na CL1 vstupu, což inkrementuje horizontální řádek (směrem shora dolů). Takto se postupně odešlou data pro celý displej.
   Celý obraz je třeba obnovovat na frekvenci 55-75Hz, jinak obraz bliká jako monitor s malý refreshem. Není však možné odeslat snímek za nějakých 5ms maximální rychlostí a pak třeba 15ms provádět jinou činnost, než nastane začátek další periody. Každý z řádků musí být zobrazen stejně dlouhou dobu s odchylkou tak 5%, takže po odeslání posledního nelze čekat, a je třeba odesílat hned první. Na době ponechání řádku na LCD velmi závisí kontrast každého jednotlivého řádku, takže proto stejné intervaly.
   Ideálním řešením by tedy byla dual-port RAM velikosti alespoň 9600B. Na jeden port by byl zapojen velmi rychlý jednočip (třeba ATtiny2313 na 24MHz), který by neustále obnovoval obraz LCD. Druhým portem by byla RAM připojena třeba k jednočipu na portu pro externí paměť. Pak by mohl jednočip naprosto neomezeně v RAM přepisovat obraz novými daty. Problém však je v dostupnosti takových pamětí. Celkem dostupné jsou RAM do asi 1kB, ale větší už se shánějí hůře (např Cypress nabízí i 64kB dual-port RAM). Jinou možností je vytvořit pomocí logiky pseudo dual-port RAM, ale to je záležitost relativně složitá a přístup by asi byl celkem pomalý.
   Po pár pokusech jsem se nakonec rozhodl pro vytvoření řadiče v podobě koprocesoru. Interní paměť nestačí, takže jsem se rozhodl pro nejmenší s interfacem pro externí paměť - ATmega64 na 16MHz.

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.
   Z řadiče lze jednotlivými instrukcemi vyčíst jednak přímo hodnoty měřené AD převodníkem odpovídající souřadnicím stisku, dále hodnoty korigované kalibračními koeficienty zapsanými patřičnými instrukcemi a pak ještě hodnoty filtrované s ošetřením "zákmitů".




   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.
Zdroják, bin a hex soubor, DPS 600dpi top, DPS 600dpi bottom, osazeni top, osazeni bottom.


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.
Zdroják, bin a hex soubor.


Poslední aktualizace: 16.12.2006