DOPLNĚNÍ KNIHOVNY PRO GRAFICKÝ DISPLEJ

Drbohlav Lukáš, Frecer Petr, UREL, FEEC, VUT Brno
xdrboh01stud.feec.vutbr.cz, xfrece00stud.feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

Projekt navazuje na bakalářskou práci KNIHOVNA GRAFICKÝCH PRVKŮ PRO MIKROKONTROLERY ATMEL AVR A GRAFICKÉ DISPLEJE od Miroslava Skopala, rok 2008, vytvořené v jazyce C, viz [1]. Klade si za cíl tuto práci rozšířit o funkci pro vykreslování progress baru, funkci pro vykreslování grafické závislosti ze zadaných hodnot, funkci pro vykreslování bitmap a v neposlední řadě funkci pro automatický zápis.

Pro tento projekt byl využit školou zapůjčený monochromatický displej Everbouquet MG2406F s rozlišením 240x64 pixelů a žlutým podsvícením pomocí LED, jeho datasheet je možné nalézt na [2]. Modul displeje je osazen inteligentním řadičem Toshiba T6963C a 64 kb paměti SRAM. Řadič T6963C vyniká nad běžnými řadiči LCD displejů díky bohaté zásobě režimů a povelů, více na [3]. Na řídící mikrokontrolér tak nejsou kladeny takové nároky z hlediska velikosti paměti a výpočetního výkonu. Řadič umí pracovat v textovém, grafickém i kombinovaném režimu. Má vlastní generátor znakové sady. Při zápisu do paměti displeje je možné použít instrukce pro nastavování jen vybraných bitů z osmibitového slova, anebo komunikaci ještě více urychlit přepnutím displeje do automatického režimu.

Complete_pict

Realizace

Rozšiřovaná knihovna grafických prvků je koncipovaná jako třívrstvá. Nejnižší vrstvu tvoří definice funkcí řadiče (soubor t6963c.h) společně s funkcemi pro komunikaci s modulem LCD přes povelovou a datovou sběrnici (soubor MG2406F.h). Fyzické připojení jednotlivých datových vodičů definuje soubor avrldcd_conf.h. Druhou vrstvu knihovny tvoří funkce pro základní grafické útvary - kreslení čáry, obdélníku (soubor avrlcd.h). Na stejné úrovni se také nachází funkce pro vykreslování uživatelem definovaných fontů (soubor avrlcd_fonts.h). Nejvyšší úroveň knihovny obsahuje funkce pro zobrazení komplexních grafických prvků, které ke komunikaci s řadičem využívají nižší vrstvy knihovny.

Pro rozšíření fukčnosti knihovny byla využita modularita knihovny grafických prvků. Do nejvyšší vrstvy byly zařazeny funkce pro vykreslení Progress Baru, vykreslení grafu a zobrazení bimapy na displeji. Výsledný doplňkový modul je vyjádřen souborem avrlcd_my_module.h. Funkce pro komunikaci s displejem v automatickém módu byly naopak zařazeny do nejnižší vrstvy grafické knihovny (soubor MG2406F_autowrite.h).

1. Progress Bar
Funkci progress_bar() jsou předávány jako vstupní parametry souřadnice počátečního bodu, šířka a výška, počet zobrazených procent a nakonec styl prvku. Styl prvku udává, zda má být progress bar na výšku, nebo na šířku a také, zda má být zobrazena číselná hodnota procent.

Vlastní fuknce je koncipována tak, že je nejprve nakreslen prázdný obdelník pomocí fuknce rectangle(), jako obrys progress baru. Následuje rozhodování, jaký styl je požadován. V každém případě jsou vytvořeny dva vnitřní obdelníky, jeden plný a druhý průhledný, podle počtu zobrazovaných procent.

Při zobrazování číselné hodnoty je nejprve počet procent převeden na řetězec funkcí utoa() a dochází k přidání znaku procent funkcí strcat(). Poslední část fuknce pro vykreslení progress baru zavolá fuknci draw_text_ex(), která umožňuje vepsat řetězec do prostřed obdelníku. Zároveň je ve vstupních parametrech této fuknce nadefinován požadavek na změnu barvy řetězce zobrazujícího procenta, při počtu procent větších než 50. Tím je zajištěna viditelnost počtu procent ve všech případech zobrazení.

Progress_bar

2. Vykreslování grafů ze zadaných hodnot
Tato funkce se volá příkazem plot(). Vstupními parametry jsou počáteční souřadnice levého horního rohu, výška a šířka oblasti pro zobrazení grafu, ukazatele na pole s hodnotami pro x-ovou a y-ovou osu, počet hodnot zobrazovaných na osách a konečně řád zadávaných hodnot pro obě osy.

V prvním kroku dochází k vykreslení obdelníkové oblasti pro vykreslování grafu fukncí rectangle(). Okamžitě poté následuje vymezení zobrazovací oblasti a oddělení poznámkového řádku čárou od zobrazovací oblasti grafu. To je zajištěno funkcí line(). Touto funkcí se zobrazují i jednotlivé osy.

Dalším krokem je popis obou hlavních os. Nejprve se vyhledají nejnižší a nejvyšší hodnoty, které chceme zobrazit na osách. Z této znalosti jsou vypočtena měřítka pro jednotlivé osy. V zobrazovací oblasti grafu jsou potom vypsány u každé z os nejnižší a nejvyšší zobrazované hodnoty a pod grafem, v poznámkové liště, jsou vypsána měřítka. Díky tomuto zobrazení měřítek je možné vykreslovat, jak desetinná čísla, tak čísla vyšších řádů.

Samotné vykreslování je provedeno tak, že se vždy dva body na jednotlivých osách přepočítají pomocí měřítka a zobrazí se v oblasti grafu. Tyto body jsou pak spojeny funkcí line().

Graph

3. Vykreslování Bitmap
Pro zobrazení obrázku (bitmapy) na monochromatickém displeji je nutné nejprve obrázek převést do správného datového formátu. V následujících řádcích je uveden stručný postup, jak toho dosáhnout:

1) Libovolný obrázek (formáty .jpg, .gif, .png,...) upravte v grafickém editoru (postačí Malování z Windows (c) Microsoft Corp.) tak, aby měl výsledný obrázek rozměry v pixelech stejné, jaké požadujeme na LCD displeji. Například pro displej s rozlišením 240 x 64 px to bude obrázek šířky 240 px a výšky 64 px. Rozměry mohou být samozřejmě i menší. Výsledný obrázek uložte do formátu .bmp typu černobílý rastr.

2) Pomocí programu LCD Assistent ((c) Radoslav Kwiecien) načtěte vytvořený .bmp obrázek a zvolte volby: horizontální orientace, rozměry obrázku, velký endián a 8 px na byte. Uložte obrázek jako textový soubor. LCD Assistent je možné stáhnout na stránce viz. [4].

3) Z vytvořeného textového souboru zkopírujte kód do zdrojového souboru C vašeho programu. Jedná se o pole 8 bitových hodnot. Název pole pojmenujte dle libosti a umístěte ho do programové paměti mikrokontroléru direktivou PROGMEM. Nezapomeňte vložit hlavičkový soubor pgmspace.h.

S obrázkem převedeným na datové pole pracuje nově vytvořená funkce bitmap(), které jako parametry předáme rozměry obrázku, jeho polohu na displeji a ukazatel na datové pole s obrázkem. Funkce vyčítá data z pole hodnot a volá funkci pixel() z nižší vrstvy pro zápis na displej. Pokud chceme zobrazit bitmapu velikosti celého displeje, je výhodné použít funkci screen_autowrite(), o které se zmiňuje následující odstavec.

Bitmap

4. Funkce automatického zápisu
Automatický režim je specifická vlastnost řadiče T6963C. Umožňuje nepřetržitě zapisovat data do paměti displeje bez zasílání jakýchkoli příkazů mezi jednotlivými datovými slovy. Díky tomu se komunikace mezi mikrokontrolérem a řadičem výrazně zrychlí. Jednodušší řadiče LCD displeje (např. KS0108) možnost automatického režimu postrádají.

V původní grafické knihovně, na kterou tento projekt navazuje, nebyl automatický režim implementován. Bylo to nejspíš z důvodu variability zápisu, kterou požadují vyšší vrstvy knihovny. Automatický režim je výhodné použít především při překreslování celého displeje. Knihovna grafických prvků je ale postavena na využití funkce pixel(), která umožnuje měnit libovolný pixel displeje a tím vytváří účinný nástroj pro menší změny v obraze. Narozdíl od funkce pixel(), která může být implemenována i pro jiné řadiče a umožňuje použití grafické knihovny pro displeje s různými řadiči, jsou funkce automatického režimu vázány jen na LCD moduly s řadičem T6963C.

Pro využití automatického režimu byly vytvořeny funkce autowrite_on(), autowrite_off() a lcd_write_aw(), které slouží k zapnutí a vypnutí a k samotnému zápisu v automatickém režimu. Dále byla vytvořena funkce pro mazání displeje lcd_clear_aw() a funkce pro kreslení obrázků screen_autowrite(). Druhá jmenovaná funkce je obdobou funkce bitmap(). Ovšem nenabízí takovou rozmanitost vstupních parametrů, protože zobrazovaná bitmapa může mít velikost jen celé obrazovky.

Po vytvoření výše zmíněných funkcí bylo možné srovnat výhodnost použití automatického režimu. Srovnání bylo prováděno měřením času potřebného pro vykonání funkce. Byla použita vývojová deska s mikrokontrolerem ATmega32 s taktovacím kmitočtem 16 MHz a čas se měřil osciloskopem na výstupním pinu mikrokontroleru. Funkce lcd_clear_aw() potřebovala asi o čtvrtinu menší dobu na provedení než původní lcd_clear(). Zlepšení není nikterak výrazné, protože i samotná funkce lcd_clear() je poměrně jednoduchá. Úsporu času tvoří fakt, že se v automatickém režimu nemusí každé datové slovo při zápisu potvrzovat příkazem. Při využití zápisu bitmapy bylo již předem očekáváno výrazné zlepšení, protože se obrázek nezapisuje do paměti displeje po pixelech, ale po celých datových slovech. Měřením bylo zjištěno, že funkce screen_autowrite() se provede 15x rychleji než funkce bitmap(), což je monumentální rozdíl. Pomalý zápis na displej funkcí bitmap() je patrný i okem, když se displej překresluje a působí velmi rušivě. V tomto případě platíme za univerzálnost funkce pixel(), kterou funkce bitmap() volá, poměrně velkou daň.

Závěr

Ze zadání projektu byly úspěšně realizovány všechny body. Okomentované zdrojové kódy včetně projektu jsou dostupné ke stažení. Projekt byl vytvořen v AVR Studiu 4.18 pro mikrokontroler ATmega32, viz. [5]. Zdrojové kódy využívají knihovny z balíku AVR Libc 1.6.7., z [6]. Knihovnu grafických prvků je dále možné doplňovat o uživatelské moduly podobně jako v tomto projektu. Při využití grafické knihovny se ale musí programátor rozhodnout, kdy je ještě únosné používat funkce pro grafické prvky umístěné ve vyšší vrstvě a založené na funkci pixel() a kdy je lepší napsat pro danou aplikaci vlastní funkci využívající alespoň z části automatický režim displeje. Tento projekt poskytl základy pro další využití automatického režimu a implementoval do knihovny praktické prvky jako Progress Bar, vykreslení grafů a obrázků.

Zdrojové kódy projektu obsahující všechny zmíněné knihovny a demoaplikaci jsou ke stažení zde.

Literatura

[1] SKOPAL, M. Knihovna grafických prvků pro mikrokontrolery Atmel AVR a grafické displeje. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, 2008. 47 s. Vedoucí bakalářské práce Ing. Zbyněk Fedra, Ph.D. Dostupná z WWW: https://www.vutbr.cz/studium/zaverecne-prace?zp_id=14617
[2] T6963C datasheet from TOSHIBA [online]. 2002 [cit. 2011-04-22]. Datasheetcatalog.com. Dostupný z WWW: http://www.datasheetcatalog.com/datasheets_pdf/T/6/9/6/T6963C.shtml
[3] MG2406 SERIES (240 * 64 DOTS) [online]. 2002 [cit. 2011-04-22]. Everbouquet.com. Dostupný z WWW: http://www.everbouquet.com.tw/MG2406F.htm
[4] LCD Assistant [online]. [cit. 2011-04-24]. En.radzio.dxp.pl. Dostupné z WWW: http://en.radzio.dxp.pl/bitmap_converter/
[5] AVR Studio 4 [online]. 2011 [cit. 2011-04-27]. Atmel. Dostupné z WWW: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
[6] AVR Libc Home Page [online]. 2011 [cit. 2011-04-27]. AVR Libc. Dostupné z WWW: http://www.nongnu.org/avr-libc/