<< Zpět

 

  Česky: , English:

Pico16VGA - 16-barevný VGA displej na Raspberry Pico
pro analogový VGA monitor a digitální LCD panel

verze 1.0, prosinec 2021

(c) Miroslav Němeček

Download knihovny Pico16VGA

Pico16VGA na Github: https://github.com/Panda381/Pico16VGA

Obsah

Pico16VGA je minimalistická knihovna pro Raspberry Pico, generující VGA signál 640x480/16-barev pro analogový monitor VGA nebo LCD panel s digitálním paralelním interfacem. Pico16VGA je zjednodušenou verzí plné verze knihovny PicoVGA, se sníženým počtem výstupních pinů. Je určena především pro technické použití.

Barvy generované knihovnou:

Zobrazení na LCD panelu s digitálním paralelním interfacem:

Schéma zapojení

Výstup barevného signálu zajišťují 4 výstupní piny s významem: modrá, zelená, červená a jasová složka. Knihovna podporuje 3 pořadí výstupních pinů: RGB, BGR nebo GRB. Uvedený příklad zapojení je uzpůsoben zapojení testovací desky Pimoroni Pico VGA, kterou lze použít k základnímu vyzkoušení knihovny - na připojeném VGA monitoru bude vidět obraz a z levého zvukového PWM kanálu bude slyšet zvuk, ovšem obraz bude jen jednobarevný, zelený.

Při výstupu na analogový VGA monitor jsou výstupy připojeny přes rezistory 330 ohmů. Jasová složka je k výstupním signálům připojena přes rezistory 1k0 a zajišťuje přičtení základní jasové úrovně ke všem barevným složkám. Spolu se vstupní impedancí monitoru 75 ohmů se zajistí potřebné výstupní napětí 0,7V. Výstupní napětí se mění ve 4 stupních: 0% (0V), 24% (0,18V), 76% (0,56V) a 100% (0,74V). Synchronizační signály HSYNC a VSYNC jsou přivedeny na VGA konektor přes rezistory 100 ohmů. Je možné zvolit režim synchronizační směsi, kdy je aktivní pouze výstup HSYNC (ve významu signálu CSYNC), VSYNC není využit. Tento režim některé starší VGA monitory nepodporují.

Knihovna podporuje digitální paralelní výstup na LCD panel s rozhraním R6G6B6. Ve schématu je uveden příklad zapojení pro displej AT056TN53. Barevné výstupy jsou přivedeny na vyšší 2 bity barevných složek (R5+R4, G5+G4, B5+B4). Jasový výstup ovládá nižší 4 bity všech barevných složek a tím zajistí ovládání zvýšeného jasu barev. Kromě barevných signálů jsou na displej přivedeny synchronizační signály HSYNC a VSYNC, a také řídicí signál DE a hodinový signál DCLK.

Digitální displej může pracovat buď v režimu HV, kdy se uplatní signály HSYNC a VSYNC, nebo v režimu DE, kdy se uplatňuje řídicí signál DE, zajišťující řízení synchronizace. Kromě těchto signálů je generován ještě hodinový signál DCLK. Hodinový signál má frekvenci 25,2 MHz. Náběžná hrana hodinového signálu probíhá uprostřed každého pixelu a zajistí tak přepis hodnoty pixelu do registrů displeje.

Výstupní barevné signály mohou být umístěny na kterýchkoliv pinech modulu Raspberry Pico. Je nutno ovšem dodržet podmínku, že GPIO musí tvořit spojitou posloupnost. V konfiguraci knihovny lze zvolit počáteční GPIO pro první barevný signál, ostatní 3 signály musí následovat na následujících GPIO. Knihovna přímo neurčuje, která barva bude přiřazena ke kterému pinu. V konfiguraci knihovny lze sice zvolit pořadí barev RGB, BGR nebo GRB, ale to pouze určuje předdefinované konstanty jmen barev a činnost funkce pro sloučení RGB složek. To lze snadno změnit podle potřeby.

Pro řídicí signály HSYNC, VSYNC, DE a DCLK platí podobné podmínky jako pro barevné signály - signály lze umístit na kterékoliv GPIO, ale GPIO musí tvořit spojitou posloupnost.

V konfiguraci knihovny lze zvolit 5 režimů provozu, podle způsobu připojení displeje. To ovlivňuje, které řídicí signály budou použity. Piny nepoužitých řídicích signálů lze využít k jiným účelům. Přehled použitých řídicích signálů je uveden zde v tabulce:

mód

určen pro

použité signály

0 nový analogový VGA monitor HSYNC
1 starý analogový VGA monitor HSYNC, VSYNC
2 analogový VGA monitor + digitální LCD panel HSYNC, VSYNC, DCLK, DE
3 digitální LCD panel v HV módu HSYNC, VSYNC, DCLK
4 digitální LCD panel v DE módu DCLK, DE

Jako pomocný signál je do digitálního displeje veden ještě signál LED, který pomocí PWM regulace (s frekvencí 300 Hz) řídí jas LED podsvícení displeje. Funkce je volitelná v konfiguraci.

Signál AUDIO je PWM zvukový výstup, za kterým by měla následovat dolní propust k filtraci modulační složky. Funkce je volitelná v konfiguraci.

K pinům GPIO0 a GPIO1 lze připojit debug UART konzoli. Lze využít převodník převádějící úrovně 3,3V na USB interface. UART konzole je využívána v některých ukázkových programech k ovládání klávesnicí. Může být též nahrazena USB interfacem, s využitím programovacího USB konektoru a konzolového programu (begPutty).

 

Překlad knihovny

Knihovna je připravena k překladu v prostředí Windows. K překladu vyžaduje pouze instalaci překladače GCC-ARM (instalační soubor gcc-arm-none-eabi-10-2020 ). Nainstalujete-li překladač do složky C:\ARM10, stačí knihovnu rozbalit do pracovní složky a spustit překlad. K překladu slouží povelové soubory c.bat. Soubory d.bat slouží k pročištění od prozatimních překladových souborů. K odeslání přeloženého programu na Pico slouží soubor e.bat - pro tento účel se doporučuje zvolit pro Pico disk R:.

Konfigurace knihovny

Konfigurační soubor knihovny naleznete ve složce _vga, soubor config.h. Pro většinu použití postačí základní konfigurační parametry, označené "base configuration".

VGA_MODE - určuje mód provozu a připojený typ displeje. Jednotlivé módy byly uvedeny v tabulce u Schématu zapojení: 0=starý analogový VGA monitor, 1=nový analogový VGA monitor, 2=univerzální mód (analogový VGA i digitální LCD), 3=digitální LCD panel v HV módu, 4=digitální LCD panel v DE módu. Pokud změníte vybraný mód displeje, je nutné ještě v souboru vga.pio odkomentovat příslušnou sekci pro definici side-set pinů.

VGA_SHIFTX - horizontální posun obrazu v rozsahu -12 až +12 pixelů.

VGA_SHIFTY - vertikální posun obrazu v rozsahu -9 až +9 linek.

COLOR_FORMAT - volba barevného formátu RGB, BGR nebo GRB. Parametr určuje pořadí barev na výstupních pinech. Parametr určuje pouze předdefinované konstanty barev COL_* a funkci pro sloučení barev COLRGB. Parametr neovlivní pořadí barev v obrázcích - při jejich importu je nutné použít příslušný soubor s definicí palet ve složkách _vga\_exe a _vga_\exe_\Pico16VGA_pal.

VGA_GPIO_FIRST - první GPIO pin pro signály barev. Lze zvolit kterýkoliv GPIO pin, ale všechny použité piny musí tvořit spojitou posloupnost.

Následující 4 parametry definují GPIO s řídicími signály. Nepoužité piny není třeba konfigurovat. Použité piny mohou být umístěny na kterékoliv GPIO, ale musí tvořit spojitou posloupnost a jejich pořadí nelze změnit.

VGA_CTRL_HSYNC - GPIO pin se signálem HSYNC
VGA_CTRL_VSYNC - GPIO pin se signálem VSYNC
VGA_CTRL_DCLK - GPIO pin se signálem DCLK
VGA_CTRL_DE - GPIO pin se signálem DE.

USE_PWMLED - 1 povolí použití PWM regulace LED podsvícení digitálního displeje.

PWMLED_GPIO - číslo GPIO s PWM LED výstupem.

USE_PWMSOUND - 1 povolí použití PWM zvukového výstupu.

PWMSND_GPIO - číslo GPIO s PWM zvukovým výstupem.

Použití knihovny

Složka _boot2 obsahuje 2. stupeň loaderu, který se připojuje k překládaným programům.

Složka _exe obsahuje program elf2uf2.exe, který zkonvertuje přeložený program z elf formátu do uf2 (formát potřebný k zavedení do Pico).

Složka _sdk obsahuje soubory SDK knihovny Pico.

Složka _tinyusb obsahuje USB podporu, sloužící např. k výstupu debug textů na USB konzoli.

Programy v _tools jsou pomocné programy používané během překladu.

Ve složce _vga je kód knihovny Pico16VGA. Ve složce _vga\_exe naleznete pomocné programy knihovny - generátor palet pro import obrázků (spolu s vygenerovanými soubory palet), konvertor pro import obrázků do programu, generátor pro nastavení PLL hodin a konvertor pro import zvuků do programu.

Dále ve složkách knihovny naleznete ukázkové programy, které nejlépe ozřejmí použití knihovny. Program přeložíte souborem c.bat, souborem e.bat program nahrajete do Pico a souborem d.bat složku vyčistíte. Do souboru Makefile můžete doplnit případné další překládané soubory do parametrů ASRC, CSRC a SRC.

V souboru Makefile naleznete též parametry "stdio output" určující výstup na debug konzoli. Můžete zvolit buď výstup na UART (např. přes UART adaptér) nebo výstup na USB programovací konektor (virtuální COM port). Přes konzoli můžete ovládat program pomocí klávesnice. Použijete-li konzoli, doplňte na začátek main() funkce příkaz stdio_init_all() pro inicializaci konzolového výstupu.

Knihovna obsahuje obrazový buffer FrameBuf o velikosti FRAMESIZE (= 153600 bajtů), který je knihovnou zobrazován. Obraz má rozměr WIDTH = 640 a HEIGHT = 480. Každý pixel je v bufferu zastoupen 4 bity dat. V každém bajtu obrazového bufferu jsou 2 pixely. Vyšší 4 bity bit4..bit7 obsahují první pixel (sudý), nižší 4 bity b0..b3 obsahují druhý pixel (lichý). Kromě přímého přístupu můžete k přístupu do obrazového bufferu použít funkce grafické knihovny draw.cpp.

Obsluha zobrazení probíhá v druhém jádru procesoru. Pro správné zobrazení je nutné, aby druhé jádro procesoru nebylo zatíženo funkcemi pro přerušení. Obsluhy přerušení proto umísťujte do hlavního, prvního jádra procesoru. Budete-li chtít využívat pro program i druhé jádro procesoru, slouží k tomu funkce Core1Exec (viz _vga\vga.h). Příklad použití druhého jádra naleznete v ukázkovém programu Mandelbrot.

Podpůrné funkce

Kromě hlavního jádra obsahuje Pico16VGA knihovna i další podpůrné funkce. Případné programy a utility jsou ve Windows EXE formátu.

draw - je knihovna pro kreslení do obrazového bufferu. Knihovna obsahuje funkce pro kreslení obdélníku, rámu, kruhu, kružnice, textů a obrázků. Knihovna obsahuje podporu pro kreslení do bufferu na pozadí, což umožňuje kreslení na obrazovku bez problikávání grafiky. Hlavní obrazový buffer FrameBuf zabírá 153 KB paměti RAM a nezbylo by dostatek místa pro druhý vykreslovací buffer. To je v knihovně vyřešeno používáním vykreslovacích pásů. V programu se rezervuje vykreslovací buffer o velikosti např. poloviny hlavního obrazového bufferu FRAMESIZE/2 (= 76800 bajtů), který už se do 264 KB paměti RAM vejde. Ukazatel pDrawBuf se nastaví na adresu vykreslovacího bufferu, DrawBufH bude obsahovat výšku vykreslovacího bufferu (zde HEIGHT/2 = 240). Vykreslení na obrazovku se poté provede ve dvou krocích - počátek bufferu DrawBufY se nastaví na 0, provede se vykreslení celého obrazu pomocí vykreslovacích funkcí a funkcí DrawBufUpdate() se obsah vykreslovacího bufferu přenese do hlavního obrazového bufferu. Ukazatel DrawBufY se posune na souřadnici HEIGHT/2 a opět se provede vykresleního stejného celého obrazu. Vykreslovací funkce ořežou vykreslovaný obsah. Tímto způsobem lze vykreslovat obraz bez blikání postupně, po jednotlivých pásech. Metoda je použita v ukázkovém programu Balloons.

pwmled - řízení jasu PWM LED podsvícení digitálního displeje.

pwmsnd - zvukový výstup. Knihovna aktivuje PWM generátor na příslušném výstupním pinu. K pinu lze (přes RC filtr) připojit sluchátka nebo externí zesilovač. Zvukový soubor má formát PCM 22050 Hz, mono, 8 bitů unsigned. Je možné jak jednorázové přehrátí zvuku, tak i opakované přehrávání s proměnlivou rychlostí.

rand - generátor náhodného čísla. Knihovna generuje náhodná čísla s 32-bitovým seed, s různou velikostí výstupních dat a ve volitelných rozsazích.

Ukázkové programy

Programy jsou připravené pro ovládání klávesnicí přes konzoli PC. Jako konzoli lze použít program begPutty a virtuální sériový USB port. Některé programy používají zvuk - generování PWM zvuku přes pin GP28 (program označen poznámkou "(zvuk)").

Analyzer - jednoduchý jednokanálový logický analyzátor se vzorkovacím kmitočtem 126 MHz (vstup GPIO15, Pico pin 20). Obsahuje též generátor náhodného šumu (jako testovací vzorek, výstup GPIO14, Pico pin 19), nastavitelný až do vzorkovacího kmitočtu 126 MHz (v příkladu nastaveno na 15,75 MHz).
Balloons - demonstrace kreslení do back bufferu, poletující balonky.
Draw - demonstrace kreslení grafických prvků. Pro ukázku se střídá pomalé vykreslování a kreslení maximální rychlostí.
Earth - rotující zeměkoule. Softwarová sférická transformace obrázku.
Eggs - logická hra (zvuk). Vychází ze hry Reversi. Cílem je získat co nejvíce vlastních kamenů. Jeden hráč mění kameny ve směru slepice-kuře-vejce, druhý hráč opačným směrem. Ovládání: L vpravo, I nahoru, J vlevo, K dolů, H pomoc, Q konec, P 2 hráči, D demo, mezerník položení kamene, Enter ok. Lze hrát proti jinému hráči i proti počítači.
Fifteen - logická hra (zvuk). Cílem je seřadit kameny v pořadí 1 až 15. Ovládání: L vpravo, I nahoru, J vlevo, K dolů, Q nová hra.
Flag - vlající vlajka.
Frequency Meter - měřič frekvence a periody digitálního signálu s přesností 4 číslice, v rozsahu 2,5 Hz až 63 MHz, se zobrazením vzorku průběhu signálu. Vstup GPIO15, Pico pin 20. Měřič automaticky kombinuje dvě metody měření - měření frekvence a měření periody signálu.
Hello World - nejjednodušší ukázkový příklad použití knihovny Pico16VGA.
Life - simulátor života buněk (celulární automat). Buňky se v každém kroku mění podle počtu sousedních buněk: pro 1 a méně buňka zaniká na osamocení, pro 4 a více buňka zaniká na přemnožení, pro 3 vznikne nová buňka, pro 2 není změna. Ve hře se lze přepínat mezi 10 obrazovkami (sloty) a přenášet obraz mezi nimi pomocí schránky. V každém slotu je předpřipravena definice populárních kombinací. Ovládání: L vpravo, I nahoru, J vlevo, K dolů, C kopie do schránky, V vložení ze schránky, D vymazání plochy, mezerník změna buňky, Enter start/stop automatu, 0-9 výběr slotu.
Lines - generátor čárových relaxačních obrazců.
Mandelbrot - generátor fraktálových obrazců Mandelbrotovy množiny. Ke generování je použita integer matematika a díky tomu je překreslení obrazce rychlé. Je však nutno počítat s tím, že při zvětšování měřítka zobrazení je potřebná rostoucí přesnost počtu číslic. Použitá integer a float matematika vystačí do měřítka zvětšení 10^5, double matematika do měřítka 10^10. Při dalším zvětšování se namísto obrazce zobrazí už jen barevné čáry. Ovládání: E nahoru, S vlevo, D vpravo, X dolů, Q zvětšení měřítka, A zmenšení měřítka, I přepnutí na celočíselnou matematiku (nejrychlejší, dosah do 10^-5), F přepnutí na float matematiku (pomalejší, dosah do 10^-5), B přepnutí na double matematiku (pomalá, dosah do 10^-10), O snížení počtu kroků iterací, P zvýšení počtu kroků iterací, mezera překreslení obrazovky.
Matrix Rain - simulace "matrixového kódového deště".
Maze - cílem je najít cestu z bludiště. Bludiště jsou generována náhodně programově. Ovládání: J vlevo, I nahoru, L vpravo, K dolů, H pomoc (ukázání dveří).
Monoscope - test displeje, zobrazí monoskop.
Pi - výpočet čísla Pi na 4780 číslic. Po výpočtu je výsledek zkontrolován s očekávaným vzorkem.
Pixels - náhodné generování barevných pixelů.
Raytrace - generování 3D obrazce metodou ray tracing. Vzhledem k omezené barevné hloubce Pico16VGA je při zobrazení použit rastrový dithering ("zrnitost" obrázku).
RGBtest - test barev.
Spheres - náhodné generování koulí.
Spots - náhodné generování skvrn.
Twister - zkroucení texturovaného kvádru. Slouží jako ukázka programové deformace obrázku.
Water Surface - simulace vlnící se vodní hladiny (zvuk).

Download knihovny Pico16VGA

Autor: Miroslav Němeček, http://panda38.sweb.cz

<< Zpět