Knihovna pro barevný grafický displej ITDB02

Pavel Matyáš, UREL, FEEC, VUT Brno
xmatya07stud.feec.vutbr.cz

Petr Hrach, UREL, FEEC, VUT Brno
xhrach01stud.feec.vutbr.cz

Obsah:

  1. Úvod
  2. Popis displeje ITDB02
  3. Možnosti knihovny
  4. Vývojové kity
  5. Porovnání výkonu
  6. Závěr
  7. Literatura

Úvod

S rozvojem mikroprocesorové techniky zároveň rostou i požadavky na kvalitu podání výstupní informace z mikroprocesoru. Nejčastěji používané monochromatické textové, případně grafické LCD displeje již přestávají mnohdy stačit. Pro náročnější aplikace je často vhodnější použít grafické TFT displeje, které v porovnání s monochromatickými grafickými LCD displeji disponují větším rozlišením, při zachování malých rozměrů. Další velkou výhodou je možnost využít více barev. Nevýhodou těchto displejů by mohla být jejich vyšší cena, která se v českých obchodech pohybuje od tisíce korun a výš, což je dvojnásobek o proti ceně za monochromatické grafické LCD displeje.

Z tohoto hlediska se jako zajímavý jeví barevný grafický TFT displej s rozlišením 320x240 pixelů, který nabízí čínský e-shop iteadstudio.com. Svou cenou 18$ +3$ poštovné, což je pří současném kurzu asi 320 Kč, je tento displej cca 3x levnější, než srovnatelné displeje prodávané v českých obchodech.

Tento projekt si klade za cíl upravit již existující knihovnu určenou pro 32bitové mikroprocesory STM32, tak aby bylo možné displej provozovat na 8bitových mikroprocesorech ATmega od firmy AVR. Dále se nabízí srovnání rychlostí obou mikroprocesorů.

Popis displeje ITDB02

IDTB02 modul, který obsahuje TFT LCD displej, konektor pro SD kartu. Komunikace s displej a SD kartou je zajištěna přes 40pinový konektor, který umožňuje snadné připojení přes 40žilový IDE kabel. Tento modul je bez dotykové vrstvy, ale existuje i varianta s dotykovou vrstvou viz. položka 2.4" TFT LCD Screen Module: ITDB02-2.4D.
Na Obr. 1 a Obr. 2 jsou fotky samotného modulu.
displejdisplej

 Obr. 1: Fotografie displeje ITDB02 [1]						Obr. 2: Fotografie spodní strany displeje ITDB02 [1]


LCD displej na modulu ITDB02 má označení 240374PQ (datasheet). Jde o 2,4" displej o rozlišení 320x240 px s podporou zobrazení 65 000 barev. Displej obsahuje řadič ILI9325 (datasheet) , který podporuje 8 nebo1 6bitovou datovou komunikaci. Provoz v 8bitovém režimu je výhodný u MCU s menším počtem I/O pinů. Nevýhodou je, že zobrazování dat na displeji trvá dvojnásobnou dobu, než v případě provozu v 16bitovém režimu. Ve výchozím stavu je displej provozován v 8bitovém režimu, kdy jsou využívány datové piny DB08 až DB15. Nevyužité datové piny DB0 až DB07 se mají připojit ke GND, ale v případě nutnosti je možné displej provozovat i bez toho. Mimo datové piny potřebuje ke svému provozu ještě piny RS (Register Select), WR (Write), CS (Chip Select), RST (reset) a RD (Read Data), který je nutno držet stále v log. 1, takže jeho připojení mcu není potřeba. V součtu pro svůj provoz potřebuje displej ITDB02 na mikroprocesoru 12 I/O pinů. Rozložení I/O pinů displeje ITDB02 je znázorněno na Obr. 3.
Napájecí napětí je 3.3 V.

displej

  Obr. 3: Zapojení vstupních/výstupních pinů displeje ITDB02 [1]

Možnosti knihovny

Námi vytvořená knihovna pro 8bitové MCU ATmega vychází z knihovny pro 32bitové mikroprocesory STM32Fxxx [4], která vychází z knihovny od Henning Karlsena [5]. Knihovna [5] je určena pro 8bitové MCU řady ATmega, ale kompletně celá napsána v jazyce C++, což nemusí všem vyhovovat, navíc kompilace ve vývojovém prostředí AVR Studio není úplně bez problémů a vyžaduje dodatečné nastavení. Naše knihovna je psána v jazyce C.
Knihovna je poměrně paměťově náročná a tak tedy byla upravena tak, aby ji bylo možno provozovat i na procesorech nižší řady s menší pamětí. Díky tomu byla z knihovny odstraněna podpora provozu displeje v landscape módu.

Seznam všech knihovních funkcí:

/* P R O T O T Y P Y   F U N K C I  */

/* GRAFICKE OBJEKTY */

void drawRect(int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b);		// Vykresli obdelnik
void fillRect(int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b);		// Vykresli plny obdelnik
void fillCircle(int x, int y, int radius, unsigned char r, unsigned char g, unsigned char b);			// Vykresli vyplnenou kruznici
void drawHLine(int x, int y, int l, unsigned char r, unsigned char g, unsigned char b);				// Vykresli horizontalni linku
void drawVLine(int x, int y, int l, unsigned char r, unsigned char g, unsigned char b);				// Vykresli vertikalni linku
void drawCircle(int x, int y, int radius, unsigned char r, unsigned char g, unsigned char b);			// Vykresli kruznici
void drawLine(int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b);		// Vykresli linku z bodu [x1,y1] do bodu [x2,y2]
void drawRoundRect(int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b);		// Vykresli obdelnik se zaoblenymi rohy
void fillRoundRect(int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b);		// Vykresli vyplneny obdelnik se zaoblenymi rohy
void drawBitmap(int x, int y, int sx, int sy, unsigned int* data);						// Vykresli bitmapový obrázek

/* VYPIS TEXTU */

void printChar(unsigned char c, int x, int y);				// Vykresli jeden znak
void print(char *st, int x, int y, int deg);				// Vykresli text
void printNumI(long num, int x, int y);					// Vykresli cele cislo
void fontSize(unsigned char size);					// Nastavi velikost pisma
void printNumF(double num, unsigned char dec, int x, int y);		// Vykresli desetinne cislo

/* OSTATNI FUNKCE */

void InitLCD(void);									// Inicializace displeje
void clrScr(void);									// Vymazání obsahu displeje
void setColor(unsigned char r, unsigned char g, unsigned char b);			// Nastavi barvu objektu ve formatu RGB
void setBackColor(unsigned char r, unsigned char g, unsigned char b);			// Nastavi barvu pozadi ve formatu RGB
void setPixel(unsigned char r, unsigned char g, unsigned char b);			// Nastavi barvu pixelu
void fillScr(unsigned char r, unsigned char g, unsigned char b);			// Vyplni displej zvolenou barvou						
void drawPixel(int x, int y, unsigned char r, unsigned char g, unsigned char b);	// Vykresli jeden pixel
void GPIO_Config(void);
void LCD_Writ_Bus(unsigned char H, unsigned char L);
void LCD_Write_COM(char VH,char VL);
void LCD_Write_DATA(char VH,char VL);
void main_W_com_data(int com1,int dat1);
void setXY(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);

Vývojové kity

Knihovna pro displej ITDB02 byla testována na vývojovém kitu s MCU ATmega16 s 16 MHz krystal, který je uveden na Obr. 3. Mikroprocesor disponuje 16kB Flash paměti a 32 I/O piny. Podrobný popis celého kitu je dostupný na adrese [2]

Dále jsme měli k dispozici vývojový kit STM32 Discovery kit s MCU STM32F100RB viz. Obr. 4. Jedná se o 32bitový mikroprocesor s jádrem ARM Cortex M3. Kit obsahuje 8 MHz krystal, ze kterého se pomocí PLL odvozuje frekvence jádra. Použitý MCU podporuje maximální frekvenci jádra 24 MHz, ale při testování zvládl běžet i na 48 MHz. Podrobný popis je dostupný na [3].
avr kit				discovery kit

 Obr. 3: Vývojový kit EvB 4.3 s MCU ATmega16						Obr. 4: Vývojový kit STM32VLDISCOVERY kit s mcu STM32F100RB


Vzhledem k tomu, že jsme měli k dispozici 2 různé vývojové kity, na kterých bylo zároveň možné displej provozovat, tak jsme se rozhodli pro porovnání výkonu obou mikroprocesorů.

Porovnání výkonu

Pro tyto účely byla sestavena testovací sada obrazců, která obsahuje výpis textu, vykreslení série grafických objektů. Výsledné testovací demo je zobrazeno na následujícím videu. Ve videu jsou mezi jednotlivými testovacími obrazci vloženy čekací smyčky, které během testování nebyly aktivní. Na konci video je zobrazeno i vykreslení bitmapového obrázku, které však nebylo součástí výsledného dema, protože MCU ATmega16 disponuje pouze 16kB paměti, což je velikost samotné knihovny.


Vid. 1: Ukázka možností knihovny pro displej ITDB02


Na tomto demu byly testovány rychlosti vykreslení na MCU Atmega16 a STM32F100RB pro různé optimalizace kompilace. Výsledné časy a velikosti výsledného kódu jsou uvedeny v Tab. 1. V případě Atmega16 byla frekvence 16 MHz. V případě STM32F100RB bylo vykreslení testovacích obrazců testováno pro 3 frekvence (16, 24 a 36 MHz). U MCU Atmega byl využíván kompilátor AVR-GCC a u STM32F100 byl použit kompilátor MicroLib od firmy Keil.
tabulka

Tab. 1: Porovnání časů vykreslení demo obrazců a velikost přeložené knihovny u procesorů Atmega16 a STM32F100RB pro různé optimalizace


Výsledky měření jsou poměrně překvapivé, protože v případě stejné frekvence 16 MHz pro oba MCU a optimalizaci -O3 je rychlejší ATmega16, která dokázala vykreslit testovací demo za 1,8s, kdežto STM32F100 to zvládl za rovné 4s. Abychom s STM32F100 dosáhli stejného času, při optimalizaci -O3, tak jej musíme provozovat na frekvenci 36 MHz. V případě optimalizace na čas (-Ot) dosáhneme stejné rychlosti při 24 MHz, ale velikost kódu naroste o 3kB. V případě optimalizace na co nejmenší velikost kódu je rychlost vykreslení na Atmega16 5,6s a velikost kódu knihovni se zmenšila o 3kB na výsledných 12 448b.
Další zajimavostí je, že optimalizace -O1 až -O3 nemají v případě STM32F100 žádný výrazný vliv na rychlost výkonu kódu a ani jeho velikost.

Závěr

Tento projekt se zabýval upravením knihovny pro displej ITDB02 tak, aby ji bylo možné provozovat na 8bitových MCU ATmega. Knihovnu se podařilo upravit a otestovat s MCU ATmega16. Dále jsme provedli porovnání rychlosti vykreslovaní mezi MCU ATmega16 a STM32F100. Výsledky měření jsou poměrně překvapivé, protože původní předpoklad byl, že rychlejší bude STM32F100. Rychlejší je však MCU Atmega16. Důvodem může být kompilátor AVR-GCC, který provádí účinější optimalizace, než kompilátor MicroLib , který je použit u STM32F100. Předností kompilátoru MicroLib je totiž co nejmenší velikost výsledného kódu, což se mohlo nepříznivě podepsat na rychlosti výkonu kódu. Daleko zajimavější mohlo být srovnání, kdyby mezi kompilátory byl zařazen kompilátor ARM-GCC, který je dostupný ve vývojovém prostředí Atollic TrueSTUDIO. Zde se nám však nepodařilo zapnout optimalizace, takže tento kompilátor nebyl do srovnání vůbec zařazen.

Zdrojové kódy knihovny jsou ke stažení zde

Bitmapa

Obr. 5: Ukázka vykreslení bitmapového obrázku na displeji ITDB02

Literatura

[1] ITead Studio [online]. 2011 [cit. 2011-04-30]. 2.4" TFT LCD : ITDB02-2.4DWOT (without touch). Dostupné z WWW: <iteadstudio.com>.
[2] OnPa [online]. 2010 [cit. 2011-04-30]. Kit EvB 4.3. Dostupné z WWW: <onpa.cz>.
[3] STMicroelectronics [online]. 2011 [cit. 2011-04-30]. STM32VLDISCOVERY Discovering board for STM32F100 (128KB Flash) MCUs. Dostupné z WWW: <http://www.st.com/internet/evalboard/product/250863.jsp>.
[4] ITead Studio [online]. 2010 [cit. 2011-04-30]. ITDB02 Display Lib For STM32 GCC. Dostupné z WWW: <http://iteadstudio.com/>.
[5] Henning Karlsen [online]. 2011 [cit. 2011-04-30]. Library: ITDB02_Graph. Dostupné z WWW: <http://www.henningkarlsen.com>.