Přestože jsme se připojení displeje k procesoru již věnovali, myslím si, že je to vděčné a dosti široké téma. V našem seriálu článků jsme si ukázali připojení běžného VGA monitoru k vyvíjenému zařízení i připojení malého displeje s vlastním řadičem. Jelikož poslední dobou cena TFT displejů o větších velikostech klesá, lze je proto s úspěchem zakomponovat i do našich zařízení. Ukážeme si tedy připojení displejů s rozlišením od 320×240 pixelů, přes 640×480 pixelů až po 800×600 pixelů v 65536 barvách. Celé zapojení bude koncipováno tak, aby takový displej šel připojit jak k některému malému procesoru za pár korun (AVR, PIC,TI), tak i k výkonnějšímu procesoru. I když se vývoji elektroniky věnuji nějaký ten čas a tuším, na co člověk může narazit, nečekal jsem, že řešení zamýšlené úlohy bude tak snadné.
Při hledání různých možností řešení jsem se dostal až k integrovanému obvodu S1D13748 od firmy Epson. Tato firma má v ČR zastoupení, a proto bylo snadné tento obvod v ceně asi 250 Kč získat během jednoho týdne. Jelikož jsem už měl barevný TFT displej s rozlišením 640×480 pixelů s dotykovým panelem a rozměrem o úhlopříčce 5,7 palce v šuplíku, pokusy mohly začít.
Řadič S1D13748 obsahuje kompletní obvody pro řízení pasivních i aktivních displejů až do rozlišení 800×600 pixelů.
Obr. 1 Blokové schéma připojení procesoru a displeje k řadiči
Dále obsahuje 1 MB paměti RAM pro uložení zobrazované informace. Tento obvod umí dokonce posílat zobrazované informace na 2 různé displeje současně, ale já nepředpokládám v našich konstrukcích časté využití této možnosti. Součástí obvodu je také PLL obvod pro generování požadovaných frekvencí. Ze vstupního kmitočtu o určité frekvenci si nastavením PLL vygeneruje požadovanou frekvenci. Já sám jsem měl krystalový oscilátor 2 MHz a tak jsem si vygeneroval řídicí frekvenci asi 57 MHz pro řízení displeje. Tento řadič se vyrábí jak v pouzdře BGA, tak v pouzdře TQFP. Z pochopitelných důvodů jsem si zvolil pouzdro TQFP se 144 vývody s roztečí 0,5 mm.
Z elektrického hlediska velmi snadno. Připojení k procesoru je přes datovou sběrnici o šířce 16 bitů a adresovou sběrnici o šířce 3 bity. Dále potřebujeme samozřejmě signál zápisu WR, signál pro reset řadiče a signál pro čtení dat z řadiče RD, bez kterého se ale obejdeme, pokud nepotřebujeme číst nastavenou barvu pixelu na některých souřadnicích. Řadič takto připojíme snadno bez dalších pomocných obvodů i k branám 8bitového procesoru bez dodatečných obvodů. Jelikož obvod využívá nepřímou adresaci, tak nám opravdu stačí jen 3 adresové bity, jak si ještě ukážeme. Obvod se tedy chová jako připojená paměť RAM o velikosti 8 slov a šířce 16 bitů.
Připojení displeje je také snadné. Většina dostupných displejů má 18 nebo 24 signálů pro nastavení barvy (vždy 6 nebo 8 bitů pro každou složku barvy – červená, zelená a modrá). Kvalitní displeje mají vyvedeno všech 24 bitů. Dalším signálem je horizontální synchronizace HSYNC, vertikální synchronizace VSYNC, hodinový impuls DCK a signál povolení funkce CS\. Obvod vyžaduje 2 napájecí napětí – jedno o hodnotě 3,3 V pro řídicí signály a druhé 1,5 V pro napájení jádra, jak je znázorněno na blokovém schématu.
Každý má jistě zažitý vlastní postup jak takové věci dělat. Protože jsem neměl s kým se poradit a nechtěl jsem hned zničit materiál, zvolil jsem si následující postup. Nakreslil jsem desku plošných spojů s řadičem, zdroji napájecího napětí, řadičem dotykové plochy a 34pinovým konektorem DIL pro samořezný kabel pro připojení k desce procesoru a s konektorem pro plochý kabel, který používají výrobci displejů. Při prohlížení katalogových listů jsem zjistil, že většina z nich používá 40pinový tenký plochý kabel, ale každý z nich volí jiné zapojení vývodů. Z tohoto důvodu jsem také připájel na desku plošného spoje odpovídající konektor. Piny řadiče a piny konektoru displeje jsem však nepropojil, ale vyvedl na kontaktní pole na desce plošného spoje. Propojení řadiče s displejem provádím barevnými vodiči. Touto úpravou mi vznikla vývojová deska pro experimenty s různými displeji. V katalogovém listu displeje se také vždy dočteme, že jeden vstup do displeje je PWM signál pro nastavení intenzity podsvícení.
Obr. 2 Experimentální deska pro připojení řadiče displeje k procesoru a displeji
Na tuto otázku není snadné odpovědět, protože záleží na tom, co budeme od displeje požadovat. Pokud budeme chtít zobrazovat jednoduchou informaci, tak nastavíme registry PLL a registry pro daný displej. Pro vlastní zobrazení stačí vždy nastavit registr adresy a každý zápis nám nastaví příslušný pixel na požadovanou barvu.
Ale řadič, který zde popisujeme, toho umí mnohem více. Umí v paměti vytvořit 2 hlavní okna (MAIN) a 2 podokna (PIP). Jednotlivá okna lze umístit na plochu displeje do různých míst a nastavit jejich velikost a průhlednost a dokonce zvětšení či zmenšení. Pokud budeme chtít této možnosti využít, potom budeme muset řadič nastudovat celkem podrobně. Možnost využití podokna se mi jeví celkem reálně. Když budeme chtít přes hlavní zobrazení displeje zobrazit nějakou informaci, tak je to snadné. Zapneme druhé okno, nastavíme v něm informaci a zase ho vypneme. Bez této možnosti jsme nuceni vyčíst data v místech, kde chceme informaci zobrazit, potom zobrazit novou informaci. Po jejím zrušení musíme uložená data zapsat zpět.
Obr. 3 Umístění oken na displeji a v paměti
Jednou z dalších implementací je zobrazení kurzoru např. s pomocí myši. Zapneme druhé okno, nastavíme průhlednost a potom jenom měníme souřadnice druhého okna. Náročnost procesorového výkonu nám tímto klesne řádově. Na obr. 3 je tato situace znázorněna.
Jednou z možností je pečlivé prostudování katalogových listů a nastavení příslušných registrů na správné hodnoty.
Obr. 4 Konfigurační program pro nastavení registrů
Je zde však mnohem pohodlnější možnost. Od výrobce čipu lze stáhnout zdarma program 13748CFG. V tomto programu vyplníme frekvence krystalového oscilátoru, data od displeje a požadované vlastnosti oken. V programu je také přednastaveno několik nejčastěji dostupných displejů na trhu. Program nám vygeneruje hlavičkový zdrojový kód v jazyku C s hodnotami příslušných registrů, který pak můžeme dále použít.
Nejjednodušeji se vždy zobrazuje bod. Nejdříve se musí nastavit indexové registry a teprve potom lze zapisovat vlastní zobrazovaná data. Jelikož se používá nepřímé adresování, tak si ho musíme rozdělit na 2 části. Jako první zapisujeme vždy číslo registru, do kterého se data ukládají, a následně do něho zapisujeme jeho obsah. Dva registry také obsahují ukazatel (indexy) do paměti pro zápis dat zobrazení. Registr adresy má také autoinkrementaci.
Pokud tedy chceme zobrazit červený bod na souřadnicích (10,0), potom postupujeme takto: Potřebujeme nastavit desáté slovo v paměti na hodnotu 0xf000. Do index registru zapíšeme hodnotu 0x182, což je spodní registr adresy a do data registru zapíšeme 10. Dále do index registru zapíšeme hodnotu 0x184, což je horní registr adresy. Do data registru zapíšeme 0. Až nakonec zapíšeme do index registru hodnotu 0x18C, což je registr dat, kam potom zapíšeme hodnotu barvy tedy 0xf000. Pokud budeme zapisovat další data do data registru, tak se bude měnit postupně i barva následujících pixelů. Toho se využívá při kreslení obdélníkových ploch.
Zobrazení složitějších útvarů je zde také zjednodušeno. Lze např. nastavit obdélník, pro který platí následující zápisy. Nastavíme souřadnice obdélníku, jeho velikost, zrcadlení a rotaci. Potom všechny zápisy, které jdou do datového registru, postupně správně vyplňují obdélník. Pokud potřebujeme zobrazit text, tak nastavíme obdélník čili jeho polohu, velikost, rotaci a zrcadlení. Pokud chceme text zobrazit třeba zrcadlově, tak nám pouze stačí změnit 1 registr a celá procedura zůstane stejná. Pokud chceme text zobrazit svisle místo vodorovně, tak opět stačí přepsat 1 registr. A jako vždy platí: Vše je složeno z jednotlivých bodů.
Mám již určité zkušenosti s vývojem elektroniky a tak mohu říci, že vše kolem zde popsaného návrhu se mi zdálo celkem intuitivní. Katalogový list řadiče je velmi dobře provedený a lze z něj vyčíst potřebné informace. Velkou výhodou se mi jeví konfigurační program, který výrobce dodává zdarma a bez kterého by bylo správné nastavení registrů velmi zdlouhavé. Navíc lze na webu výrobce také stáhnout ovladače pro Linux. Výsledkem toho všeho bylo, že po obdržení experimentální desky a zapájení řadiče a konektorů se mi povedlo po asi 3 hodinách pokusů zobrazit 1 pixel na správném místě a o správné hodnotě barvy. Následný text na displeji byl potom už jenom dílem několika desítek minut. Zobrazení překrývajících se oken s nastavením průhlednosti chce trochu více studia, ale i to je schůdné.
Obr. 5 Zobrazení na displeji jako kombinace 3 oken vstupních dat
Na úplný závěr si ještě ukážeme schopnosti řadiče. V paměti nastavíme data do hlavního okna (Main) a do podoken 1 a 2 (PIP1, PIP2), celkem tedy 3 obrázky. Potom nastavíme umístění oken a jejich průhlednost. Na obr. 5 vidíme výsledek tak, jak bude na displeji.