eské vysoké u£ení technické v Praze Fakulta elektrotechnická Katedra po£íta£·
Bakalá°ská práce
Knihovna pro ovládání grackého displeje pro mikrokontroléry AVR
Petr Adamec
Vedoucí práce:
Ing. Josef Hlavá£
Studijní program: Elektrotechnika a informatika, strukturovaný, Bakalá°ský
Obor: Výpo£etní technika
26. kv¥tna 2010
iv
v
Pod¥kování Rád bych pod¥koval vedoucímu této práce Ing. Josefu Hlavá£ovi za jeho ochotu a £as a také v²em, kte°í mi s její tvorbou pomáhali.
vi
vii
Prohlá²ení Prohla²uji, ºe jsem práci vypracoval samostatn¥ a pouºil jsem pouze podklady uvedené v p°iloºeném seznamu. Nemám závaºný d·vod proti uºití tohoto ²kolního díla ve smyslu 60 Zákona £. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zm¥n¥ n¥kterých zákon· (autorský zákon).
V Praze dne 26. 5. 2010
.............................................................
viii
Abstract This bachelor thesis is about connecting the graphical display EL12864 to AVR microcontroller family. It contains comparation of current solutions and implementation of graphical and control library with minimal requirments for RAM memory, applicable in projects written in assembler or C language.
Abstrakt Tato práce se zabývá problematikou p°ipojení grackého displeje EL12864 k mikrokontroler·m AVR. Obsahuje srovnání existujících °e²ení a implementaci gracké a ovládací knihovny s minimálními poºadavky na pam¥´ RAM, pouºitelnou v projektech psaných v assembleru i jazyku C.
ix
x
Obsah 1 Úvod
1
1.1
Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1
Systémové poºadavky
. . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.2
Podpora vy²²ího jazyka
. . . . . . . . . . . . . . . . . . . . . . . . . .
1
2 Analýza problému
3
2.1
Displej EL12864
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
P°íkazy °adi£e displeje
3
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2.1
Display ON / OFF . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2.2
Set X address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2.3
Set Y address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.2.4
Set Z address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.3
Stavové slovo
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.4
ivotní cyklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.4.1
Reset
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.4.2
Odesílání a p°ijímání dat a p°íkaz· . . . . . . . . . . . . . . . . . . . .
6
2.4.3
Zapnutí displeje a vymazání obsahu
. . . . . . . . . . . . . . . . . . .
6
2.4.4
Modikace obsahu displeje . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.4.5
Vypnutí displeje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.5
Formát dat displeje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.6
Srovnání existujících °e²ení
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.6.1
Graphical LCD Driver and Educational LCD Primer . . . . . . . . . .
8
2.6.2
Procyon AVRlib
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.6.3
AVRgcc - KS0108 Library . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.6.4
Universal C library for KS0108 based LCD displays . . . . . . . . . . .
8
2.6.5
Graphical User Interface (GUI) libraries . . . . . . . . . . . . . . . . .
8
2.6.6
KS0108 Graphics LCD library . . . . . . . . . . . . . . . . . . . . . . .
8
2.6.7
Graphics Primitives Functions Library for ATMEL AVR . . . . . . . .
9
2.6.8
easyGUI Graphical User Interface Tool For Embedded Systems . . . .
9
Problematika framebueru . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.7
2.7.1
Framebuer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7.2
Read-modify-write
2.7.3
Vyuºití cache
9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
xi
xii
OBSAH
3 Realizace
11
3.1
Pouºité nástroje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.2
Verze v assembleru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.3
3.4
3.2.1
Pouºité I/O porty
3.2.2
Komunika£ní funkce
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.2.3
Gracké funkce s p°ímým p°ístupem
3.2.4
Funkce pro modikaci pixelu
. . . . . . . . . . . . . . . . . . . . . . .
12
3.2.5
Kreslení £ar a obdélník· . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.2.6
Kreslení kruh·
13
3.2.7
Vykreslování bitmap
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.2.8
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Výpis textu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
Verze v jazyku C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.3.1
Problematika názvové konvence . . . . . . . . . . . . . . . . . . . . . .
13
3.3.2
GLCD_wrap.c
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.3.3
GLCD_wrap.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Formáty dat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4.1
Bitmapy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4.2
Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4.3
Fonty
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4.4
Styl kreslení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4 Popis pro programátory 4.1
17
Dostupné funkce
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.1.1
LCDreset
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.1.2
LCDcacheFlush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.1.3
LCDcls
4.1.4
LCDpixel
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.1.5
LCDline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
4.1.6
LCDrect / LCDllRect
. . . . . . . . . . . . . . . . . . . . . . . . . .
19
4.1.7
LCDcircle / LCDllCircle . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.1.8
LCDputChar
4.1.9
LCDprint / LCDprintP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.10 LCDbmp
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
21
. . . . . . . . . . . . . . . . . . . . . . . . . .
22
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
4.1.11 LCDfullBmp 4.2
12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
Dostupná nastavení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
4.2.1
Datový port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
4.2.2
ídící port
24
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 Testování
27
6 Záv¥r
29
Literatura
31
A Seznam pouºitých zkratek
33
B Obrazová p°íloha
35
OBSAH
C Obsah p°iloºeného CD
xiii
37
xiv
OBSAH
Seznam obrázk· 2.1
Blokové schéma displeje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2
ivotní cyklus displeje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3
Formát dat displeje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.4
Blokové schéma metody framebueru . . . . . . . . . . . . . . . . . . . . . . .
9
2.5
Blokové schéma metody read-modify-write . . . . . . . . . . . . . . . . . . . .
10
2.6
Blokové schéma p°i pouºití cache
. . . . . . . . . . . . . . . . . . . . . . . . .
10
3.1
Model funk£ních vrstev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.2
Formát bitmap
3.3
Formát fontu
5.1
Schéma zapojení
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xv
27
xvi
SEZNAM OBRÁZK
Seznam tabulek 2.1
Význam signál· displeje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
Význam kombinací signál· D/I a R/W . . . . . . . . . . . . . . . . . . . . . .
4
2.3
Význam bitu D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
xvii
xviii
SEZNAM TABULEK
Kapitola 1
Úvod Displej EL12864 pat°í do rodiny £ernobílých grackých displej· s paralelním rozhraním. Díky jednoduché konstrukci a p°íznivé cen¥ se displeje tohoto typu stále více prosazují v zapojení s jedno£ipovými mikrokontrolery, kde nahrazují velké a energeticky náro£né segmentové LED displeje, nebo °ádkové LCD displeje omezené malým po£tem zobrazitelných znak·. Displej EL12864 obsahuje navíc integrovaný násobi£ nap¥tí a LED podsvícení, které dále sniºují poºadavky na podp·rné obvody cílového za°ízení.
1.1 Motivace 1.1.1 Systémové poºadavky Pro platformu Atmel AVR existuje v sou£asné dob¥ °ada knihoven pro °ízení tohoto displeje, ale je zde je²t¥ dostate£ný prostor pro vývoj nových °e²ení, p°eváºn¥ sm¥rem k minimalizaci systémových poºadavk·. V¥t²ina sou£asných °e²ení vyuºívá tzv. framebuer v pam¥ti RAM, kde zabírá nezanedbatelný prostor. Tato práce si klade za cíl vytvo°it knihovnu základních gracký funkcí pro tento displej, která by p°i akceptovatelném výkonu zabírala pouze minimální mnoºství pam¥ti RAM a byla tak pouºitelná v men²ích a levn¥j²ích mikrokontrolerech AVR.
1.1.2 Podpora vy²²ího jazyka Dal²ím cílem této práce je knihovnu p°izp·sobit tak, aby poskytovala své funkce nejen program·m v assembleru, ale i program·m psaným v jazyku C. To umoºní programátorovi svobodn¥ se rozhodnout, v jakém jazyce bude sv·j projekt realizovat, aniº by musel pouºít rozdílné knihovny.
1
2
KAPITOLA 1.
ÚVOD
Kapitola 2
Analýza problému Informace v podkapitolách 2.1 aº 2.5 byly £erpány z [2, 14].
2.1 Displej EL12864 Displej EL12864 je gracký displej s rozli²ením 128x64 pixel· a rozm¥ry aktivní plochy 72x40mm. Displej je °ízen dv¥ma nezávislými °adi£i KS0108, z nichº kaºdý °ídí jednu polovinu displeje o rozm¥rech 64x64 pixel·. Blokové schéma zapojení je na obr. Figure 2.1.
Obrázek 2.1: Blokové schéma displeje, p°evzato z [2] a upraveno Pro správnou funkci displeje je krom¥ napájecího nap¥tí 5V mezi vývody Vdd a Vss pot°ebné je²t¥ záporné nap¥tí -12,6V mezi vývody Vo a Vdd. Díky zabudovanému násobi£i lze toto nap¥tí získat p°ipojením potenciometru na vývody Vdd a Vee, s jezdcem na vývodu Vo. Drobnou zm¥nou tohoto nap¥tí lze také regulovat kontrast displeje. Jedno z moºných
3
4
KAPITOLA 2.
ANALÝZA PROBLÉMU
zapojení je na obrázku Figure 5.1. Dal²í sou£ástí displeje je LED podsvícení s nezávislými vývody A a K (anoda a katoda) pro p°ipojení zdroje 3,3V s odb¥rem 60mA. Displej je ovládán osmibitovým paralelním rozhraním se samostatnými °ídícími vodi£i. Význam jednotlivých signál· je v tab. Table 2.1.
Signál
Sm¥r
Význam
D0 aº D7
Vstup / výstup
Datové signály pro p°enos osmibitového slova
CS1
Vstup
Volba levé poloviny displeje
CS2
Vstup
Volba pravé poloviny displeje
D/I
Vstup
Rozli²ení dat od p°íkazu
R/W
Vstup
Rozli²ení vstupu a výstupu dat
E
Vstup
Provedení p°íkazu / zapsání dat
RST
Vstup
Reset aktivní v nule
Tabulka 2.1: Význam signál· displeje Význam signál· D0 aº D7 a interpretace na nich obsaºených dat závisí na kombinaci signál· D/I a R/W dle tabulky Table 2.2.
D/I R/W
Význam
0
0
D0 aº D7 jsou vstupy a obsahují instrukci pro °adi£
0
1
D0 aº D7 jsou výstupy a obsahují stavové slovo
1
0
D0 aº D7 jsou vstupy a obsahují data
1
1
D0 aº D7 jsou výstupy a obsahují data
Tabulka 2.2: Význam kombinací signál· D/I a R/W
2.2 P°íkazy °adi£e displeje adi£ displeje p°ijímá následující sadu p°íkaz·:
2.2.1 Display ON / OFF Opera£ní znak: D7
D6
D5
D4
D3
D2
D1
D0
0
0
1
1
1
1
1
D
P°íkaz
Display ON/OFF
vypne nebo zapne zobrazení obrazu na displeji v závislosti
na nastavení bitu D, podle tabulky Table 2.3. Obsah interní pam¥ti VRAM displeje není zm¥n¥n.
2.2.2 Set X address Opera£ní znak:
2.3.
5
STAVOVÉ SLOVO
D
Význam
0
Zobrazení vypnuto
1
Zobrazení zapnuto
Tabulka 2.3: Význam bitu D
D7
D6
D5
D4
D3
D2
D1
D0
0
1
X
X
X
X
X
X
Pomocí p°íkazu
Set X address
lze nastavit horizontální polohu ukazatele do pam¥ti dis-
pleje (sloupcovou pozici). Rozsah parametru X je 0 - 63, bit s nejniº²í d·leºitostí je na signálu D0.
2.2.3 Set Y address Opera£ní znak: D7
D6
D5
D4
D3
D2
D1
D0
1
0
1
1
1
Y
Y
Y
Pomocí p°íkazu
Set Y address
lze nastavit vertikální polohu ukazatele do pam¥ti displeje
(°ádkovou pozici). Rozsah parametru Y je 0 - 7, bit s nejniº²í d·leºitostí je na signálu D0.
2.2.4 Set Z address Opera£ní znak: D7
D6
D5
D4
D3
D2
D1
D0
1
1
Z
Z
Z
Z
Z
Z
Pomocí p°íkazu
Set Z address
lze nastavit posunutí obrazu zobrazeném na displeji po
svislé ose. Rozsah parametru Z je 0 - 63, bit s nejniº²í d·leºitostí je na signálu D0. Hodnota udává o kolik °ádk· pixel· bude obraz posunut sm¥rem nahoru.
2.3 Stavové slovo Nastavením °ídících signál· D/I do log. 0 a R/W do log. 1 zp·sobí, ºe p°i aktivním signálu E se na datových vodi£ích objeví tzv. stavové slovo, které obsahuje klí£ové informace o stavu displeje. Struktura stavového slova je následující: D7
D6
D5
D4
D3
D2
D1
D0
B
0
A
R
0
0
0
0
P°íznak B neboli BUSY zna£í, ºe displej je zaneprázdn¥n vnit°ní operací a p°íznak R neboli RESET, ºe stále probíhá resetování displeje. Pokud je kterýkoli z nich aktivní, displej není p°ipraven p°ijímat ºádné p°íkazy ani data, s výjimkou £tení stavového slova. P°íznak A neboli ACTIVE znamená, ºe zobrazování na displeji bylo aktivováno p°íkazem
ON/OFF
(viz. subsection 2.2.1). V²echny p°íznaky jsou aktivní v log.1.
Display
6
KAPITOLA 2.
ANALÝZA PROBLÉMU
2.4 ivotní cyklus ivotní cyklus displeje se skládá z resetu, vymazání obsahu a samotné práce s displejem, kterou tvo°í £tení, modikace a zápis.
Obrázek 2.2: ivotní cyklus displeje
2.4.1 Reset Reset displeje se provede nastavením signálu RST do log. 0 po dobu minimáln¥ 1000 ns, po zbytek práce z·stává tento signál v log. 1. Opakovaným £tením stavového slova testujeme p°íznaky RESET a BUSY - displej je p°ipraven pokud jsou oba v logické nule. Protoºe displej obsahuje dva nezávislé °adi£e, je nutné provést reset pro kaºdý z nic zvlá²´, pomocí signál· CS1 a CS2.
2.4.2 Odesílání a p°ijímání dat a p°íkaz· P°ed kaºdým odesláním dat nebo p°íkaz· je nutné zjistit, zda displej není zaneprázdn¥n p°edchozí operací. Toto se provádí opakovaným £tením stavového slova a £ekáním na návrat p°íznaku BUSY do logické nuly. Následn¥ je moºné £íst a zapisovat do displeje. Pro zápis je nutné vystavit poºadovaný byte dat nebo opera£ní kód p°íkazu na datovou sb¥rnici, nastavit °ídící signály, zejména CS1 a CS2, a odeslat kladným impulzem signálu E s délkou min 450ns. Displej za£ne poºadovanou operaci provád¥t okamºit¥ a do jejího dokon£ení nastaví p°íznak BUSY do log. 1. tení z displeje probíhá obdobn¥ - po nastavení °ídících signál· a nastavení signálu E do log. 1. se na datové sb¥rnici objeví poºadovaná data a vydrºí zde aº do sestupné hrany signálu E. I v tomto p°ípad¥ je nutné s následující operací po£kat na vymazání p°íznaku BUSY.
2.4.3 Zapnutí displeje a vymazání obsahu Po provedení resetu je zobrazování na obou polovinách displeje vypnuté a je nutné ho povolit odesláním p°íkazu
Display ON/OFF. Obsah pam¥ti displeje je nedenovaný a je tedy dobré,
nicmén¥ nepovinné, jeho vymazání opakovaným zasíláním prázdných sloupc· pro v²echny pozice na displeji.
2.5.
7
FORMÁT DAT DISPLEJE
2.4.4 Modikace obsahu displeje Aktuální pozici ukazatele v pam¥ti displeje lze nastavit p°íkazy
dress,
Set X address
a
Set Y ad-
poté z této pozice na£íst aktuální data, ta modikovat a op¥t zapsat zp¥t. Displej
má zabudovanou autoinkrementa£ní funkci, kde sloupcová pozice v rámci jednoho °ádku je automaticky po kaºdém £tení i zápisu zvý²ena o jedna. To usnad¬uje hromadný zápis a £tení.
2.4.5 Vypnutí displeje Displej nevyºaduje ºádné speciální zacházení p°i vypínání, lze ho jednodu²e odpojit od napájecího nap¥tí. Pro do£asné skrytí obsahu displeje lze pouºít p°íkaz
Display ON/OFF.
2.5 Formát dat displeje Displej se skládá ze dvou nezávislých polovin, kaºdá o rozm¥ru 64x64 pixel·. V rámci kaºdé poloviny se displej d¥lí na °ádky, osm pixel· vysoké, p°i£emº kaºdý °ádek obsahuje 64 sloupc·.
Obrázek 2.3: Formát dat displeje, p°evzato z [2] a upraveno Ur£ení sloupce z poºadované polohy pixelu je jednoduché, sta£í brát v úvahu pouze spodních 6 bit· sou°adnice X a dle sedmého ur£it p°íslu²nou polovinu displeje. Pro ur£ení °ádku lze pouºít bity <6:3> ze sou°adnice Y. Polohu zvoleného pixelu v osmici pak ur£ují bity <2:0> ze sou°adnice Y. Je nutné zd·raznit, ºe displej neumoº¬uje adresaci po jednotlivých pixelech, nejmen²í adresovatelná jednotka je osmice pixel·. Nalezení a p°ípadná zm¥na pixelu v osmici je výhradn¥ v kompetenci mikrokontroleru.
2.6 Srovnání existujících °e²ení Existuje °ada knihoven pro práci s tímto displejem a dal²í lze v tomto sm¥ru modikovat. Níºe je uveden vý£et n¥kterých z nich.
8
KAPITOLA 2.
ANALÝZA PROBLÉMU
2.6.1 Graphical LCD Driver and Educational LCD Primer Graphical LCD Driver and Educational LCD Primer
je ²kolní projekt popisující p°ipojení
displeje s °adi£em KS0108 k mikrokontroléru Atmega32. Projekt popisuje hardwarovou i softwarovou stránku problému, zabývá se ²iroce problémem zasílání základních p°íkaz· a dat displeji. Sou£ástí je i kód v jazyku C schopný nastavovat jednotlivé pixely a zobrazit statickou bitmapu z pam¥ti. Autor nespecikuje ºádnou licenci, nebo podmínky ²í°ení a pouºití jeho kódu [3].
2.6.2 Procyon AVRlib Procyon AVRlib
je soubor knihoven pro mikrokontrolery Atmel, zaji²´ující komunikaci s
rozli£nými periferiemi, v£etn¥ displej· s °adi£em KS0108. Knihovna psaná v jazyku C pak umoº¬uje vykreslovat body, £áry, obdélníky, kruhy a jednoduchý text. Celý projekt je ²í°en pod licencí GNU GPL [10].
2.6.3 AVRgcc - KS0108 Library AVRgcc - KS0108 Library
je knihovna jazyka C ú£elov¥ psaná pro °ízení °adi£e KS0108.
Umoº¬uje vykreslovat £áry, obdélníky, obdélníky se zaoblenými rohy, kruhy a to v²e v £erné nebo bílé barv¥, prázdné nebo vypln¥né, p°ípadn¥ invertující obsah nacházející se pod t¥mito tvary. Pro vykreslování textu je moºné pouºít n¥kolik font·. Projekt je moºné vyuºívat zdarma pro nekomer£ní ú£ely [11].
2.6.4 Universal C library for KS0108 based LCD displays Universal C library for KS0108 based LCD displays
je knihovna jazyka C umoº¬ující p°i-
pojení displeje s °adi£em KS0108 k °ad¥ mikrokontroler· v£etn¥ AVR. Umoº¬uje vykreslit £áru, prázdný obdélník a kruh, p°ípadn¥ text s xním fontem 5x8 pixel·. Licence není specikována [7].
2.6.5 Graphical User Interface (GUI) libraries Graphical User Interface (GUI) libraries
je kompletní balík pro vývoj a pouºití graky v mi-
krokontrolerech a podporuje °adu za°ízení v£etn¥ AVR. Knihovny psané v jazyku C umoº¬ují provád¥t kompletní sadu grackých operací (£ára, obdélník, kruh, text, fonty) v²e v módu £erná, bílá a invertovat. Balík dále obsahuje nástroje pro vývoj vlastních font· a bitmapové graky vhodné pro pouºití v t¥chto procesorech. Jedná se o komer£ní °e²ení s cenou od cca. 400 eur [6].
2.6.6 KS0108 Graphics LCD library KS0108 Graphics LCD library
je knihovna jazyka C pro ovládání displeje s °adi£em KS0108.
Umoº¬uje vykreslovat £áry, obdélníky, kruhy a text za pouºití více font·. Dále je moºné invertovat obdélníkovou oblast displeje a vykreslovat bitmapy. Knihovna je k dispozici zdarma [9].
2.7.
9
PROBLEMATIKA FRAMEBUFFERU
2.6.7 Graphics Primitives Functions Library for ATMEL AVR Graphics Primitives Functions Library for ATMEL AVR
je knihovna v assembleru pro vy-
kreslování základních tvar·, primárn¥ ur£ená pro sériové displeje. Umoº¬uje vykreslit £áru, text a bitmapu, dále obdélník, elipsu a kruh, v²e prázdné nebo vypln¥né £ern¥, bíle a inverzn¥. Program vyuºívá framebuer v pam¥ti a následn¥ odesílá data na display. Licence nebo omezení pouºití není specikováno [8].
2.6.8 easyGUI Graphical User Interface Tool For Embedded Systems easyGUI Graphical User Interface Tool For Embedded Systems
je kompletní balík pro vývoj
GUI na mikroprocesorových systémech, obsahující knihovny jazyka C pro kompletní sadu grackých operací (£ára, obdélník, kruh, text, fonty). Kreslit lze £ern¥, bíle nebo inverzn¥. Podporuje více druh· displej· a procesor· v£etn¥ KS0108 a AVR. Jedná se o komer£ní °e²ení, cena za£íná na 795 eurech [1].
2.7 Problematika framebueru V²echna °e²ení uvedená v sekci section 2.6 vyuºívají ke své funkci tzv. framebuer, tedy obraz grackých dat v pam¥ti RAM mikrokontroleru. e²ení uvedené v této práci naopak vyuºívá metodu read-modify-write, která na£ítá pouze nezbytn¥ nutnou oblast pam¥ti displeje.
2.7.1 Framebuer P°i pouºití framebueru je po celou dobu práce s displejem udrºována kopie obsahu jeho pam¥ti VRAM ve standardní pam¥ti RAM mikrokontroleru. P°i grackých operacích je modikována pouze pam¥´ RAM a teprve po skon£ení jejich provád¥ní je celý obsah displeje p°epsán t¥mito daty. Výhodou tohoto p°ístupu je vysoká rychlost, nebo´ p°ístup do pam¥ti RAM, která je sou£ástí mikrokontroleru, je podstatn¥ rychlej²í neº p°ístup do pam¥ti displeje a p°i v¥t²in¥ grackých operací se tedy vyplatí p°ená²et aº hotový obraz. Dal²í výhodou je absence viditelného, £áste£n¥ vykresleného obrazu p°i vytvá°ení sloºit¥j²ích struktur na displeji. Zásadní nevýhodou je mnoºství pot°ebné pam¥ti RAM - v p°ípad¥ displeje EL12864 se jedná o 1kB dat, coº p°i celkové velikosti této pam¥ti v mikrokontrolerech niº²ích °ad tvo°í nezanedbatelný objem.
Obrázek 2.4: Blokové schéma metody framebueru
10
KAPITOLA 2.
ANALÝZA PROBLÉMU
2.7.2 Read-modify-write Metoda read-modify-write jde cestou minimalizace systémových prost°edk· - v mikrokontroleru je udrºováno pouze minimální mnoºství grackých dat a celý obraz je uchováván pouze ve VRAM displeje. Pokud je nutné modikovat daný pixel na displeji, je t°eba ho na£íst, modikovat a zapsat zp¥t (odtud tedy název read-modify-write). Výhodou je úspora místa v pam¥ti RAM, kde p°i pouºití mikrokontroler· AVR s dostatkem pracovních registr· není pot°ebné alokovat ºádné místo. Zásadní nevýhodou tohoto p°ístupu je rychlost, s jakou lze provád¥t gracké operace. Komunikace s displejem je ve srovnání s RAM zna£n¥ pomalej²í a navíc autoinkrementa£ní funkce pozice na displeji, kterou °adi£e KS0108 realizují, tento p°ístup zt¥ºuje. P°i modikaci jednoho pixelu je tedy nutno zaslat dva p°íkazy pro ur£ení sou°adnic (X a Y), na£íst a modikovat p°íslu²nou osmici pixel· (nejmen²í alokovatelná jednotka), op¥t zaslat ur£ení sou°adnice Y a aº poté zapsat výsledek. Dal²í nevýhodou je p°ítomnost £áste£n¥ dokon£ené graky na displeji, coº p·sobí p°i £astém p°ekreslování nep°íjemným dojmem.
Obrázek 2.5: Blokové schéma metody read-modify-write
2.7.3 Vyuºití cache V této práci je spolu s metodou read-modify-write vyuºita i malá cache, která podstatn¥ zvy²uje výkon p°i zachování v¥t²iny pozitiv. S výhodou je zde pouºit fakt, ºe displej umoº¬uje adresovat data ve VRAM po osmicích pixel· a velké mnoºství grackých operací £asto upravuje více pixel· jedné osmice. Po na£tení a zm¥n¥ jednoho pixelu tak není výsledek okamºit¥ zapsán do displeje, ale £eká se na dal²í p°íkaz k modikaci pixelu. Pokud je umíst¥n ve stejné osmici sta£í pouze znovu modikovat cache. V opa£ném p°ípad¥, je obsah cache vypláchnut na p°íslu²nou adresu a na jeho místo je na£tena nová osmice z VRAM. Tímto p°ístupem lze u grackých operací, které m¥ní v²echny pixely osmice (vypln¥ný obdélník, svislá £ára, £ásti kruhu), dosáhnout aº tém¥° osminásobného zrychlení. Pouºití tohoto p°ístupu vyºaduje pouhé 3B pam¥ti RAM (pro obsah cache a polohu tohoto obsahu), coº je únosné i pro nejniº²í °ady mikrokontroler· AVR.
Obrázek 2.6: Blokové schéma p°i pouºití cache
Kapitola 3
Realizace P°i realizaci této práce byl kladen d·raz zejména na pouºitelnost knihovny v rozmanitých projektech, proto bylo krom¥ verze v assembleru vytvo°eno i rozhraní umoº¬ující propojení s programem v jazyku C.
3.1 Pouºité nástroje K implementaci byly pouºity tyto nástroje a vývojová prost°edí:
•
AVR Studio 4.17
•
WinAVR-20090313
Pro tvorbu font· a bitmap byly pouºity tyto programy:
•
LCD Font Generator ver. 1.10
•
FastLCD designer ver. 1.2.0
3.2 Verze v assembleru Assemblerovská verze gracké knihovny p°edstavuje st¥ºejní £ást této práce - obsahuje funkce pro p°ístup k displeji, gracké funkce i ve²kerá nastavení. Strukturu a závislosti jednotlivých funk£ních celk· oz°ejmuje obrázek Figure 3.1 a následující odstavce.
3.2.1 Pouºité I/O porty Pro komunikaci s displejem jsou pouºity dva standardní porty mikrokontroleru AVR - jeden pro p°enos dat a druhý pro p°enos °ídících signál·. Datový port zabírá celou ²í°ku volitelného I/O portu (tj. 8 bit·) a je nutné zachovat po°adí bit· na stran¥ mikrokontroleru i displeje (tedy vodi£ D0 displeje je spojen s bitem 0 daného portu, atd.). V p°ípad¥ °ídících signál· je moºné p°i°adit význam jednotlivých bit· I/O portu libovolným signál·m displeje. Jedinou podmínkou tak z·stává, ºe v²echny °ídící signály musí sdílet jeden zvolený I/O port. Volbu port· a p°i°azení signál· lze snadno provést zm¥nou konstant v souboru knihovny, viz. section 4.2.
11
12
KAPITOLA 3.
REALIZACE
Obrázek 3.1: Model funk£ních vrstev
3.2.2 Komunika£ní funkce Komunika£ní funkce pro p°ístup k displeji na základ¥ zadaných parametr· nastaví °ídící signály a provedou v²echna nezbytná opat°ení pro odeslání nebo p°ijetí p°íkaz· £i dat. Mezi nedílnou sou£ást pat°í také kontrola p°ipravenosti displeje (podle p°íznaku BUSY, viz. subsection 2.4.2). Pokud displej není p°ipraven, £ekají funkce ve smy£ce na jeho uvoln¥ní.
3.2.3 Gracké funkce s p°ímým p°ístupem N¥které jednodu²²í funkce, které manipulují s celými byte pam¥ti displeje, obcházejí p°i své funkci mechanismus cache a zapisují data prost°ednictvím komunika£ních funkcí p°ímo na displej. Nejvýznamn¥j²í funkcí z této kategorie je
LCD_cls
- vymazání displeje.
3.2.4 Funkce pro modikaci pixelu Funkce pro modikaci jednotlivých pixel·
LCD_pixel
je nejen sou£ástí dostupného reper-
toáru grackých funkcí, ale je zárove¬ vyuºívána v²emi sloºit¥j²ími funkcemi (£ára, obdélník, kruh, ...). Její schopnost kreslit £ernou, bílou nebo inverzní barvou se tak p°ená²í na v²echny závislé funkce. Jak jiº bylo vysv¥tleno v sekci subsection 2.7.3, tato funkce vyuºívá cache se zpoºd¥ným zápisem pro zvý²ení výkonu - mnoho vy²²ích grackých funkcí totiº modikuje pixely na podobných sou°adnicích a tak £asto odpadne nutnost znovu na£ítat a ukládat stejnou osmici pixel· z pam¥ti displeje. Drobným problémem z·stává nutnost vypláchnout cache po posledním voláním této funkce, v p°ípad¥
LCD_pixel
toto z·stává na uºivateli, ostatní funkce
°e²í tento problém automaticky.
3.2.5 Kreslení £ar a obdélník· Pro kreslení £ar je vyuºit Bresenham·v algoritmus, upravený pro pouºití v prost°edí osmibitových mikrokontroler· [12]. Na tuto funkci pak navazuje kreslení obdélník· - v p°ípad¥ nevypln¥ných je jednodu²e volána funkce kreslení £áry pro v²echny £ty°i st¥ny obdélníku. Pokud je poºadován obdélník vypln¥ný, je vykreslován cyklem jako mnoºství svislých £ar. Díky tomu je maximáln¥ vyuºit mechanismus cache, nebo´ pixely v osmicích jsou uspo°ádané pod sebou.
3.3.
13
VERZE V JAZYKU C
3.2.6 Kreslení kruh· Vykreslování kruh· je realizováno algoritmem Midpoint circle (£asto myln¥ p°isuzovanému také Bresenhamovi) [13]. Pro vykreslování vypln¥ných kruh· je pouºita obdobná metoda jako pro kreslení vypln¥ných obdélník· - po výpo£tu horní a dolní hranice je vykreslena svislá £ára a kombinací více r·zn¥ dlouhých £ar vznikne vypln¥ný kruh.
3.2.7 Vykreslování bitmap Standardní funkce pro vykreslování bitmap podporuje pouze bitmapy uloºené v pam¥ti ROM, které musí obsahovat vlastní rozm¥r a obrazová data uspo°ádaná po osmicích stejn¥ jako v pam¥ti displeje (viz. subsection 3.4.1). Vykreslování probíhá po sloupcích, aby byla optimáln¥ vyuºita cache. Naopak funkce
LCD_fullBmp
pro vypln¥ní celého displeje bitmapou
nepoºaduje rozm¥ry v datech bitmapy a vykreslování zcela obchází cache.
3.2.8 Výpis textu Podle pouºité funkce se text m·ºe nacházet v pam¥ti RAM i ROM, v kaºdém p°ípad¥ v²ak musí být font uloºen v pam¥ti ROM. Na základ¥ £íselné hodnoty písmene je zvolena p°íslu²ná bitmapa z dat fontu a je vykreslena obdobným zp·sobem, jako jakákoli jiná bitmapa.
3.3 Verze v jazyku C Pro pouºití v projektech, kde je vyuºit vy²²í programovací jazyk C bylo vytvo°eno jednoduché rozhraní s hlavní assemblerovskou knihovnou.
3.3.1 Problematika názvové konvence Pro vloºení assemblerovských soubor· do projektu v jazyku C realizovaným v AVR Studiu pomocí WinAVR je nutné zm¥nit p°íponu souboru na .s místo standardního .asm. Obsah souboru m·ºe z·stat nezm¥n¥n. Dále je nep°ípustné pouºití dvou globálních funkcí se stejným jménem, coº vede k nutnosti p°ejmenovat obalovací funkce rozhraní, aby bylo zabrán¥no kolizi. V assemblerovské £ásti je dodrºováno pravidlo, ºe v²echny funkce displeje za£ínají LCD (nap°. LCDcls), v jazyku C proto bylo pouºito LCD_ (nap°. LCD_cls).
3.3.2 GLCD_wrap.c Soubor
GLCD_wrap.c
obsahuje pouze obalovací funkce pro správné zp°ístupn¥ní assemble-
rovských funkcí do jazyka C. Kaºdá funkce provede namapování p°edaných argument· na registry procesoru poºadované jejím assemblerovským prot¥j²kem a provede její volání. P°i volání n¥kterých funkcí v assembleru dochází k modikaci registr· se vstupy, aby bylo umoºn¥no jednoduché kreslení dal²í graky. V jazyku C a zejména v jeho rozhraní s assemblerem nelze toto jednodu²e implementovat, a proto ºádná funkce nevrací ºádný výsledek jakýmkoli zp·sobem.
14
KAPITOLA 3.
REALIZACE
3.3.3 GLCD_wrap.h Soubor
GLCD_wrap.h
denuje nejen prototypy obalovacích funkcí, ale také denuje styly
kreslení (viz. subsection 3.4.4) a p°ímo zp°ístup¬uje n¥kolik funkcí bez parametr·, které nevyºadují sloºité obalování.
3.4 Formáty dat 3.4.1 Bitmapy Kaºdá bitmapa sestává z dvou byte hlavi£ky a °et¥zce dat odpovídající délky. První byte hlavi£ky udává horizontální rozm¥r bitmapy v pixelech, druhý pak rozm¥r vertikální. Následná data jsou organizována obdobným zp·sobem jako pam¥´ displeje - jeden byte reprezentuje osm pixel· ve sloupci, p°i£emº nejniº²í bit odpovídá hornímu pixelu. Tyto sloupce jsou °azeny za sebe do °ádk·, jednotlivé °ádky jsou pak z°et¥zeny za sebe. Pokud není vertikální rozm¥r bitmapy p°esným násobkem osmi, jsou vy²²í bity sloupc· posledního °ádku ignorovány. Velikost bitmapy v bytech pak lze odvodit z následujícího vzorce:
v y´sˇka velikost = 2 + sˇ´ırˇka ∗ 8
S výjimkou hlavi£ky, která v²ak m·ºe být snadno generována ru£n¥, lze tento formát dat snadno vytvá°et °adou nástroj· - b¥hem vývoje této knihovny byl pouºit nap°. FastLCD designer [5].
Obrázek 3.2: Formát bitmap
3.4.2 Text Text je reprezentován jako °et¥zec znak· v pam¥ti zakon£ený nulou. Velikost kaºdého znaku je 8-bit·, ºádný druh vícebytového kódování (Unicode, UTF-8,...) není podporován. Význam jednotlivých hodnot znak· je interpretován fontem, pouºití znakových sad je moºné jako nezávazná konvence. Pouºitelné jsou v²echny hodnoty v rozmezí 1-255 (tedy v£etn¥ netisknutelných znak·) a kaºdý znak má xní velikost (neexistuje nap°. tabelátor).
3.4.3 Fonty Kaºdý font tvo°í t°íbytová hlavi£ka a sada bitmap pro kaºdý zobrazitelný znak. Obsahem hlavi£ky jsou rozm¥ry znaku, uloºené stejným zp·sobem, jako rozm¥ry bitmapy (první byte ²í°ka, druhý byte vý²ka v pixelech) a posun £íslování znak·. Ten ur£uje £íslo znaku, který je v datech fontu uloºen jako první. Nap°íklad hodnota posunu 32 ur£uje, ºe pokud pouºijeme
3.4.
15
FORMÁTY DAT
kódování ASCII, bude prvním znakem v datech fontu mezera a ve²keré netisknutelné znaky s kódem 1-31 tak nemusíme v datech fontu interpretovat. Jednotlivé znaky jsou uloºeny jako nezávislé bitmapy z°et¥zené za sebou, nemají v²ak vlastní hlavi£ku s rozm¥ry, místo ní se pouºívá hlavi£ka celého fontu. Tento °et¥z lze p°ed£asn¥ ukon£it a nezat¥ºovat tak pam¥´ obrazy znak· s vy²²ími £ísly. V takovém p°ípad¥ je pak samoz°ejm¥ nutné nepouºívat v textu znaky s t¥mito hodnotami.
Obrázek 3.3: Formát fontu Díky mechanismu posunu a moºnosti p°ed£asného ukon£ení °et¥zu bitmap lze efektivn¥ implementovat pouze vyuºitou podmnoºinu znak· (nap°. pouze velká písmena), p°i zachování moºnosti pouºít aº 255 r·zných znak·. Je t°eba zd·raznit, ºe pouºití znakových sad (ASCII, Windows-1250,...) je zcela v rukou tv·rce fontu a textu, knihovna pouze realizuje p°evod z hodnoty znaku na pozici bitmapy ve fontu a její vykreslení a to podle následujícího vzorce:
pozice = 3 + sˇ´ırˇka ∗
v y´sˇka ∗ (znak − posun) 8
Tato pozice je pak p°edána spolu s rozm¥ry fontu k vykreslení obrazu znaku. B¥hem vytvá°ení této práce byl pouºit program LCD Font Generator [4] s tím, ºe hlavi£ka fontu byla dopln¥na ru£n¥.
3.4.4 Styl kreslení Pro gracké funkce, které styly kreslení podporují, lze specikovat t°i r·zné módy:
• Normální
- Kreslení probíhá £ernou barvou, tj. v²echny pixely modikované funkcí
jsou nastaveny do log. 1. V p°ípad¥ bitmapy jsou cílové pixely nastaveny shodn¥ s jejím obsahem. Pro tento styl je denována konstanta
LCD_STYLE_NORMAL
s
hodnotou 1.
• Inverzní
- Kreslení probíhá bílou barvou, tj. v²echny pixely modikované funkcí jsou
nastaveny do log. 0. V p°ípad¥ bitmapy jsou cílové pixely nastaveny na obrácenou hodnotu jejího obsahu. Pro tento styl je denována konstanta
LCD_STYLE_INVERT
s hodnotou 0.
• XOR
- P°i kreslení jsou pixely modikované funkcí nastaveny na opa£nou hodnotu
(£erné na bílé a bílé na £erné). V p°ípad¥ bitmapy jsou invertovány ty cílové pixely, jimº v bitmap¥ odpovídá £erná barva. Pro tento styl je denována konstanta
LCD_STYLE_XOR s hodnotou -1.
16
KAPITOLA 3.
REALIZACE
Kapitola 4
Popis pro programátory 4.1 Dostupné funkce Knihovna obsahuje dv¥ °ídící a dvanáct grackých funkcí dostupných uºivateli a n¥kolik nastavení, zahrnující zejména specikaci komunika£ních port· pro p°ipojení displeje. Pokud není uvedeno jinak, je pouºitá cache transparentní a nevyºaduje zásah uºivatele.
4.1.1 LCDreset Funkce
LCDreset
slouºí pro restart a inicializaci displeje.
Volání v assembleru call LCDreset
Prototyp v jazyku C extern void LCD_reset(void); Funkce nevyºaduje ºádné parametry a nem¥ní obsah ºádných registr·.
4.1.2 LCDcacheFlush Funkce
LCDcacheFlush
slouºí pro vypláchnutí obsahu cache na displej. Její volání je nutné
pouze po posledním pouºití funkce
LCDpixel, ostatní gracké funkce ji volají automaticky
Volání v assembleru call LCDcacheFlush
Prototyp v jazyku C extern void LCD_cacheFlush(void); Funkce nevyºaduje ºádné parametry a nem¥ní obsah ºádných registr·.
17
18
KAPITOLA 4.
POPIS PRO PROGRAMÁTORY
4.1.3 LCDcls Funkce
LCDcls
slouºí pro vymazání obsahu displeje. V²echny pixely budou nastaveny do
log.0, tedy na bílou barvu.
Volání v assembleru call LCDCls
Prototyp v jazyku C extern void LCD_cls(void); Funkce nevyºaduje ºádné parametry a nem¥ní obsah ºádných registr·.
4.1.4 LCDpixel Funkce
LCDpixel
zm¥ní zvolený pixel na displeji v závislosti na zadaných parametrech na
£erný, bílý, nebo invertuje jeho sou£asnou hodnotu. Toto je jediná funkce, která vyºaduje, aby uºivatel po skon£ení operací provedl manuální vyprázdn¥ní cache pomocí
LCDcacheFlush.
Volání v assembleru call LCDpixel
Prototyp v jazyku C extern void LCD_pixel(uint8_t x, uint8_t y, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x
- Horizontální poloha pixelu (sou°adnice X). Povolený rozsah je 0-127, vy²²í
hodnoty jsou ignorovány.
• R18 / y
- Vertikální poloha pixelu (sou°adnice Y). Povolený rozsah je 0-63, vy²²í
hodnoty jsou ignorovány.
• R19 / style
- Poºadovaná zm¥na displeje - povolené hodnoty a jejich význam viz.
subsection 3.4.4. Funkce nevrací ºádnou návratovou hodnotu, ani nemodikuje ºádné registry.
4.1.5 LCDline Funkce
LCDline
kreslení.
vykreslí úse£ku mezi zvolenými sou°adnicemi, p°i£emº pouºije zvolený styl
4.1.
19
DOSTUPNÉ FUNKCE
Volání v assembleru call LCDline
Prototyp v jazyku C extern void LCD_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x0
- Horizontální poloha po£áte£ního bodu (sou°adnice X). Povolený rozsah je
0-127, vy²²í hodnoty nejsou povoleny.
• R18 / y0
- Vertikální poloha po£áte£ního bodu (sou°adnice Y). Povolený rozsah je
0-63, vy²²í hodnoty nejsou povoleny.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
• R20 / x1
- Horizontální poloha koncového bodu (sou°adnice X). Povolený rozsah je
0-127, vy²²í hodnoty nejsou povoleny.
• R21 / x2 - Vertikální poloha koncového bodu (sou°adnice Y). Povolený rozsah je 0-63, vy²²í hodnoty nejsou povoleny.
Funkce nevrací ºádnou návratovou hodnotu, v p°ípad¥ assembleru je v²ak do registru R17 (resp. R18) uloºen p·vodní obsah registru R20 (resp. R21), coº umoº¬uje snadno vykreslovat mnohoúhelník. Obsah ostatních registr· z·stává nezm¥n¥n.
4.1.6 LCDrect / LCDllRect Funkce
llRect
LCDrect
vykreslí obdélník na zvolených sou°adnicích zvoleným stylem. Funkce
navíc obdélník vyplní.
Volání v assembleru call LCDrect nebo
call LCDfillRect
LCD-
20
KAPITOLA 4.
POPIS PRO PROGRAMÁTORY
Prototyp v jazyku C extern void LCD_rect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t style); nebo
extern void LCD_fillRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x0
- Horizontální poloha po£áte£ního bodu (sou°adnice X). Povolený rozsah je
0-127, vy²²í hodnota zp·sobí, ºe obdélník nebude vykreslen celý.
• R18 / y0
- Vertikální poloha po£áte£ního bodu (sou°adnice Y). Povolený rozsah je
0-63, vy²²í hodnota zp·sobí, ºe obdélník nebude vykreslen celý.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
• R20 / x1
- Horizontální poloha koncového bodu (sou°adnice X). Povolený rozsah je
0-127, vy²²í hodnota zp·sobí, ºe obdélník nebude vykreslen celý.
• R21 / x2 - Vertikální poloha koncového bodu (sou°adnice Y). Povolený rozsah je 0-63, vy²²í hodnota zp·sobí, ºe obdélník nebude vykreslen celý.
Funkce nevrací ºádnou návratovou hodnotu, v p°ípad¥ assembleru je v²ak do registru R17 (resp. R18) uloºen p·vodní obsah registru R20 (resp. R21), coº umoº¬uje navazovat obdélníky na sebe. Obsah ostatních registr· z·stává nezm¥n¥n.
4.1.7 LCDcircle / LCDllCircle Funkce
LCDcircle vykreslí na zvolených sou°adnicích LCDllCircle navíc kruh vyplní.
stylem. Funkce
Volání v assembleru call LCDcircle nebo
call LCDfillCircle
kruh o zvoleném polom¥ru zvoleným
4.1.
DOSTUPNÉ FUNKCE
21
Prototyp v jazyku C extern void LCD_circle(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t style); nebo
extern void LCD_fillCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x0 - Horizontální poloha st°edu kruhu (sou°adnice X). Povolený rozsah je 0-127, vy²²í hodnota zp·sobí, ºe kruh nebude vykreslen celý.
• R18 / y0
- Vertikální poloha st°edu kruhu (sou°adnice Y). Povolený rozsah je 0-63,
vy²²í hodnota zp·sobí, ºe kruh nebude vykreslen celý.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
• R22 / radius - Polom¥r kruhu, povolené hodnoty závisí na poloze st°edu kruhu. Pokud okraje kruhu p°esahují hranice displeje m·ºe dojít k neo£ekávaným výsledk·m. Funkce nevrací ºádnou návratovou hodnotu, ani nemodikuje ºádné registry.
4.1.8 LCDputChar Funkce
LCDputChar
vykreslí na zvolené pozici jeden znak daným fontem a stylem.
Volání v assembleru call LCDputChar
Prototyp v jazyku C extern void LCD_putChar(uint8_t x, uint8_t y, uint8_t character, void *fontAddr, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x
- Horizontální poloha levého okraje znaku (sou°adnice X). Povolený rozsah
je 0-127, vy²²í hodnota zp·sobí, ºe znak nebude vykreslen celý.
• R18 / y
- Vertikální poloha horního okraje znaku (sou°adnice Y). Povolený rozsah je
0-63, vy²²í hodnota zp·sobí, ºe znak nebude vykreslen celý.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
22
KAPITOLA 4.
• R16 / character
POPIS PRO PROGRAMÁTORY
- Kód poºadovaného znaku, povolené hodnoty jsou 1-255 a jejich
význam specikuje zvolený font.
•
R31:R30 / fontAddr - Adresa v pam¥ti ROM, kde je uloºen poºadovaný font. Struktura fontu viz. subsection 3.4.3.
Funkce nevrací ºádnou návratovou hodnotu, ale v assembleru m¥ní registry R17 a R18 tak, aby jako sou°adnice X a Y ukazovaly na pozici vhodnou pro vykreslení dal²ího znaku. Ostatní registry z·stanou zachovány.
4.1.9 LCDprint / LCDprintP Funkce
LCDprint
a
LCDprintP
vypí²í text na zvolené sou°adnice zvoleným stylem. Za text
se povaºuje pole znak· zakon£ených nulou.
LCDprintP
LCDprint
o£ekává umíst¥ní textu v pam¥ti RAM,
pak umíst¥ní v ROM. Pokud text p°esáhne okraje °ádku, bude zalomen; pokud
p°esáhne spodní okraj displeje, za£ne se vypisovat znovu od sou°adnice (0,0).
Volání v assembleru call LCDPrint nebo
call LCDprintP
Prototyp v jazyku C extern void LCD_print(uint8_t x, uint8_t y, void *stringAddr, void *fontAddr, uint8_t style); nebo
extern void LCD_printP(uint8_t x, uint8_t y, PGM_P stringAddr, void *fontAddr, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x
- Horizontální poloha levého okraje textu (sou°adnice X). Povolený rozsah je
0-127, vy²²í hodnota zp·sobí neºádoucí chování.
• R18 / y
- Vertikální poloha horního okraje textu (sou°adnice Y). Povolený rozsah je
0-63, vy²²í hodnota zp·sobí neºádoucí chování.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
• R29:R28 / fontAddr - Adresa v pam¥ti ROM, kde je uloºen poºadovaný font. Struktura fontu viz. subsection 3.4.3.
4.1.
23
DOSTUPNÉ FUNKCE
• R31:R30 / textAddr
- Adresa textu pro vykreslení. Funkce
lohu v pam¥ti RAM, funkce
LCDprintP
LCDprint
o£ekává po-
polohu v pam¥ti ROM. Formát textu viz.
subsection 3.4.2. Funkce nevrací ºádnou návratovou hodnotu, ale v assembleru m¥ní registry R17 a R18 tak, aby jako sou°adnice X a Y ukazovaly na pozici vhodnou pro vykreslení dal²ího textu. Dále bude registr Z nastaven tak, aby ukazoval na pozici v pam¥ti bezprost°edn¥ následující za vypsaným textem (resp. na následující byte po ukon£ovací nule). Ostatní registry z·stanou zachovány.
4.1.10 LCDbmp Funkce
LCDbmp
vykreslí na zvolených sou°adnicích bitmapu z pam¥ti ROM.
Volání v assembleru call LCDbmp
Prototyp v jazyku C extern void LCD_bmp(uint8_t x, uint8_t y, void *addr, uint8_t style); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R17 / x - Horizontální poloha levého okraje bitmapy (sou°adnice X). Povolený rozsah je 0-127, vy²²í hodnota zp·sobí neºádoucí chování.
• R18 / y
- Vertikální poloha horního okraje bitmapy (sou°adnice Y). Povolený rozsah
je 0-63, vy²²í hodnota zp·sobí neºádoucí chování.
• R19 / style
- Poºadovaný styl kreslení - povolené hodnoty a jejich význam viz.
subsection 3.4.4.
• R31:R30 / addr
- Adresa bitmapy, která má být vykreslena, o£ekává se poloha v
ROM. Struktura bitmapy viz. subsection 3.4.1. Funkce nevrací ºádnou návratovou hodnotu, ale v assembleru m¥ní registr Z tak, aby ukazoval na pozici bezprost°edn¥ následující za daty bitmapy. Ostatní registry z·stanou zachovány.
4.1.11 LCDfullBmp Funkce
LCDfullBmp
vykreslí bitmapu z pam¥ti ROM p°es celý displej. Funkce p°istupuje
p°ímo k displeji (obchází funkci
LCDpixel ),
není proto moºné pouºít styl kreslení. Oproti
normálním bitmapám vyºaduje tato funkce data bez hlavi£ky (rozm¥ry jsou známy). Díky své rychlosti a omezeným parametr·m se hodí pro vykreslování úvodních splash obrazovek.
24
KAPITOLA 4.
POPIS PRO PROGRAMÁTORY
Volání v assembleru call LCDfullBmp
Prototyp v jazyku C extern void LCD_fullBmp(void *addr); Funkce o£ekává vstup v následujících registrech / prom¥nných:
• R31:R30 / addr
- Adresa bitmapy, která má být vykreslena, o£ekává se poloha v
ROM. Funkce nevrací ºádnou návratovou hodnotu, ale v assembleru m¥ní registr Z tak, aby ukazoval na pozici bezprost°edn¥ následující za daty bitmapy. Ostatní registry z·stanou zachovány.
4.2 Dostupná nastavení 4.2.1 Datový port Nastavení portu pro datovou komunikaci s displejem (tj. obsluhujícím vývody D0 aº D7 displeje) lze provést v sekci
Uºivatelské nastavení
v úvodní £ásti assemblerovského souboru
knihovny zm¥nou následujících konstant:
#define LCD_DPORT #define LCD_DPIN #define LCD_DDDR
V nich je nutné specikovat p°íslu²né I/O registry zvoleného portu pro zápis, £tení a ovládání t°ístavového výstupu (v tomto po°adí). Je moºné pouºít jak p°ímo zadané £íslo, tak konstantu z hlavi£kového souboru p°íslu²ného mikroprocesoru.
4.2.2 ídící port Nastavení portu pro °ídící signály displeje se provádí také v sekci
Uºivatelské nastavení
pomocí t¥chto konstant:
#define LCD_CPORT #define LCD_CPIN #define LCD_CDDR
Platí zde obdobná pravidla jako pro datový port - je nutné zadat I/O registry pro zápis, £tení a t°ístavový výstup. Dále je t°eba specikovat p°íslu²nost signál· displeje k pin·m tohoto portu, to lze provést dopln¥ním následujících konstant:
4.2.
25
DOSTUPNÁ NASTAVENÍ
#define #define #define #define #define #define
DRW DCS1 DCS2 DRS DE DRST
<£íslo <£íslo <£íslo <£íslo <£íslo <£íslo
pinu> pinu> pinu> pinu> pinu> pinu>
O£ekáváno je £íslo pinu zvoleného portu, tedy £íselná konstanta v rozsahu 0 aº 7. Význam je pak následující:
• DRW
- ízení sm¥ru komunikace s displejem, signál R/W displeje
• DCS1
/
• DRS • DE
DCS2 - Volba °adi£e poloviny displeje, signály CS1 a CS2 displeje
- Význam datových vodi£· - data nebo p°íkaz, signál D/I displeje
- Provedení zápisu / £tení, signál E displeje
• DRST
- Reset, signál RST displeje
26
KAPITOLA 4.
POPIS PRO PROGRAMÁTORY
Kapitola 5
Testování Funk£nost knihovny byla ov¥°ena na mikrokontroleru ATmega32, v zapojení podle schématu na obrázku Figure 5.1. Testy probíhaly jak p°i výchozím nastavení oscilátoru (1MHz interní oscilátor), tak p°i maximální povolené frekvenci CPU (20MHz vn¥j²í krystal). V obou p°ípadech odpovídal výsledek zobrazený na LCD p°edpokladu. Testována byla °ada p°ípad·, v£etn¥ hrani£ních (nap°. text dlouhý nula znak·, apod.).
Obrázek 5.1: Schéma zapojení P°i niº²í frekvenci se výrazn¥ji projevila negativa p°ístupu read-modify-write a u v¥t²iny grackých operací bylo moºné post°ehnout p°ítomnost £áste£n¥ vykresleného obrazu na displeji. P°i vy²²ích frekvencích nastával tento nep°íjemný jev pouze p°i £astém p°ekreslování
27
28
KAPITOLA 5.
TESTOVÁNÍ
rozsáhlých ploch (nap°. p°i pohybu bitmapy po displeji). Ukázkový videozáznam se nachází na p°iloºeném CD, n¥kolik ilustra£ních obrázk· pak v dodatku B.
Kapitola 6
Záv¥r Zadání práce se poda°ilo úsp¥²n¥ realizovat. Byla implementována gracká a ovládací knihovna pro p°ipojení displeje EL12864 k mikrokontroler·m AVR, která nabízí v²echny základní gracké funkce a poºaduje pouze minimální mnoºství pam¥ti RAM. Díky moºnosti propojení s programy v jazyku C tak vznikla v²estranná knihovna vhodná pro °adu projekt·, které tak m·ºou t¥ºit z výhod pouºití grackého displeje, aniº by musely zvy²ovat nároky na pouºité CPU. B¥hem práce si autor osvojil nejen komunika£ní protokol displeje EL12864, ale i obecné principy vykreslování geometrických objekt· na rastrový displej, prozkoumal moºnosti propojení assemblerovského kódu s vy²²ím jazykem a problémy, které to p°iná²í. Dal²í vývoj knihovny by se dal spat°ovat v roz²í°ení repertoáru funkcí, nap°íklad o vykreslování elips; optimalizace n¥kterých sou£ástí, p°ípadn¥ o jednoduchou kompresi bitmap. Zajímavým prostorem pro zlep²ení je nepochybn¥ oblast cache, kde by se formou podmín¥ného p°ekladu dalo realizovat n¥kolik variant pam¥´ové náro£nosti, od nulových poºadavk· aº po kompletní 1kB framebuer.
29
30
KAPITOLA 6.
ZÁV
R
Literatura [1] IBIS Solutions ApS. easyGUI Graphical User Interface Tool For Embedded Systems.
http://www.easygui.com/,
stav z 11. 10. 2009.
[2] Powertip Corporation. PG12864A.
http://www.powertipusa.com/pdf/pg12864a.pdf,
stav z 22. 10. 2009.
[3] Lucas L. Delaney. Graphical LCD Driver and Educational LCD Primer.
http://instruct1.cit.cornell.edu/courses/eceprojectsland/STUDENTPROJ/ 2003to2004/lld6/index.html, stav z 11. 10. 2009. [4] Massud Ebrahimi. LCD Font Generator.
http://www.elvand.com,
stav z 20. 10. 2009.
[5] Bojan I. MICRODESIGN. FastLCD designer.
http://pagesperso-orange.fr/rs-rey/electronic_ressources/Ressources/ 8051/GraphicLCD/fastlcd.zip, stav z 20. 10. 2009. [6] RAMTEX International. Graphical User Interface (GUI) libraries.
http://www.ramtex.dk/,
stav z 11. 10. 2009.
[7] Radoslaw Kwiecieñ. Universal C library for KS0108 based LCD displays.
http://en.radzio.dxp.pl/ks0108/,
stav z 11. 10. 2009.
[8] Andreas Lenze. Graphics Primitives Functions Library for ATMEL AVR.
http://www.avrfreaks.net/index.php?module=FreaksAcademy&func= viewItem&item_id=154&item_type=project, stav z 11. 10. 2009. [9] Michael Margolis. KS0108 Graphics LCD library.
http://www.arduino.cc/playground/Code/GLCDks0108,
stav z 11. 10. 2009.
[10] Pascal Stang. Procyon AVRlib.
http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/ avrlib/, stav z 11. 10. 2009. [11] Fabian Maximilian Thiele. AVRgcc - KS0108 Library.
http://www.scienceprog.com/wp-content/uploads/2007/07/glcd_ks0108.zip, stav z 11. 10. 2009. [12] Bresenham's line algorithm.
http://en.wikipedia.org/wiki/Bresenham's_line_algorithm,
31
stav z 19. 11. 2009.
32
LITERATURA
[13] Midpoint circle algorithm.
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm,
stav z 29. 10. 2009.
[14] EL12864A - Gracký LCD.
http://obchod.hw.cz/?cls=stoitem&stiid=35732,
stav z 22. 10. 2009.
Dodatek A
Seznam pouºitých zkratek ASCII
American Standard Code for Information Interchange
CPU
Central Processor Unit
GNU
GNU's Not Unix (rekurzivní akronym)
GPL
General Public License
GUI
Graphical User Interface
LCD
Liquid Crystal Display
LED
Light-Emitting Diode
RAM
Random Access Memory
ROM
Read Only Memory
UTF
Unicode Transformation Format
VRAM XOR
Video RAM
Exclusive OR
33
34
DODATEK A.
SEZNAM POUITÝCH ZKRATEK
Dodatek B
Obrazová p°íloha
Testovací zapojení
35
36
DODATEK B.
OBRAZOVÁ PÍLOHA
Pomalé p°ekreslování p°í taktu 1MHz
Vykreslování p°i taktu 20MHz
Kreslení obdélník·
Kreslení pixel·
Kreslení £ar
Kreslení kruh·
Dodatek C
Obsah p°iloºeného CD |-| | | | | | | | |-| | | |--
examples | |-- C | |-- photo | `-- video | `-- asm `-- photo
Ukázkové projekty pro ATmega32
Verze v assembleru pro AVR Studio Fotografie ukázkového projektu
src |-- C `-- asm
Zdrojové soubory knihovny Verze pro jazyk C Verze v assembleru
text `-- src
Tato bakalá°ská práce Zdrojové soubory této práce
Verze v jazyku C pro WinAVR Fotografie ukázkového projektu Videozáznam ukázkového projektu
37