Toto je starší verze dokumentu!
Oživte komunikaci se znakovým OLED displejem, na kterém implementujte logické menu a jeho jednotlivé podnabídky. V menu se pohybujte za pomoci připojených ovládacích tlačítek. Implementujte potvrzení volby, uložení do displeje a poslání příslušných dat do koncového zařízení na SPI lince.
Cílem práce je navrhnout komunikaci s SPI koncových zařízením. Pro řízení je využit vývojový kit MSP430F5529, na kterém je osazen mikrokontrolér stejného názvu. Je třeba také vytvořit a oživit komunikaci s s OLED displejem. Na tomto displeji bude vytvořeno přehledné menu za jehož pomocí budou nastavený příslušné parametry koncového řízeného SPI zařízení. Pro ovládání jsou uvažovány 4 tlačítka, ke kterým je nutné vytvořit rutinu přerušení z důvodu jejich korektní činnosti.
Koncové SPI zařízení je ve vývojové verzi nahrazeno vytvořeným jednoduchý SPI převodníkem. Tento převodník převádí SPI komunikaci na 16 bitovou paralelní informaci. Takto vytvoření převodník představuje jakousi logickou 16 bitovou sondu. Na výstupech tohoto převodníku je použito 16 LED. Tyto použité LED představují konkrétní bity řídících registrů koncového SPI zařízení, jakým může být například D/A převodník, přijímač S/PDIF atd.
Zařízení je realizováno ve formě funkčního prototypu a proto pro vývoj byl využit vývojový kit. Jak bylo uvedeno jedná o kit od společnosti Texas Instrumenst. Kit má označení MSP430F5529 a jméno vychází z označení a řady mikrokontroléru, který je na vývojovém kitu použit. Velkou výhodou tohoto vývojového kitu je především jeho možnost využití jako programátoru pro externí mikrokontroléry řady MSP430FXXXX. Použitý mikrokontrolér MSP430F5529 je 16 bitový a je označován výrobce jako „Mixed signal“ mikrokontrolér. To znamená, že mikrokontrolér obsahuje a je schopen zpracovat pokročilejší instrukce, které byly dříve doménou pouze signálových procesorů ( např. HW podpora násobení 32 bitových čísel atd.) Mikrokontrolér pracuje na taktu 4 MHz. Maximální takt mikrokontroléru je až 25 MHz. Velkou výhodou mikrokontroléru je však použití například na bateriový provoz z důvodu velmi malých požadavků na odběr proudu typicky v plném vytížení je odběr proudu 150 uA/MHz. Navíc mikrokontrolér disponuje i 4 stanby režimy, kdy spotřeba klesá na naprosté minimum.
Jak bylo uvedeno výše, tento převodník slouží v prototypiélním zapojení celého zařízení jako jakési pomyslné koncové SPI zařízení. Za pomocí 16 LED je možné velmi dobře monitorovat, zda jsou příslušné bity na konkrétních pozicích správně nastavovány. Základem převodníku jsou 2 8 bitové shift registry. Konkrétně se jedná o CMOS integrované obvody 74HCT595.Schéma zapojení indikačního převodníku představujícího koncové SPI zařízení je uvedeno na následujícím obrázku.
Význam jednotlivých pinů:
Schéma zapojení převodníku pro převod SPI na paralelní informaci pro OLED displej je uvedeno na následujícím obrázku. Jedná se pouze o modifikaci předchozího zapojení převodníku, který slouží jako koncové SPI zařízení.
Pro snadné a přehledné ovládání a nastavování koncového SPI zařízení bylo vytvořeno přehledné a intuitivní menu. Pro snadné ovládání přípravku byly zvoleny pouze 4 ovládací tlačítka.
Ke snímání stavu všech tlačítek se přistupuje v rutině přerušení, která je vyvolána přerušením interního časovače/čítače mikrokontroléru MSP430F5529. Tímto způsobem je zajištěno dokonalé SW odstranění zákmitů a zajištěna tak dokonalá a bezproblémová činnost ovládacích tlačítek.
Použitý displej na kterém je vytvořeno ovládací menu je znakový. Disponuje 2 řádky a 20 symboly v každém řádku. Použitá technologie displeje je OLED. Řadič displeje je WS0010. Tento řadič displeje vychází z klasického řadiče Hitachi pro běžné OLED displeje. Ovšem velkou výhodou tohoto řadiče je možnost komunikace také po SPI. Ovšem aby displej, resp. řadič komunikoval po SPI, je nutné provést drobné změny přímo na DPS displeje (záměna několika rezistorů). Poté displej může bez problémů komunikovat i po sériové lince. Ve výchozím nastavení však displej komunikuje klasicky paralelně 8 nebo 4 bitově. Tedy řadič se chová stejně jako klasický LCD s běžným Hitachi řadičem a inicializační algoritmus tohoto displeje je tak totožný. Pro univerzálnost návrhu přípravku nebylo zasahováno do DPS displeje. Avšak z důvodu úspory spousty vstupně výstupních pinů mikrokontroléru byl použit naprosto stejný převodník SPI na paralelní informaci, který je využit jako logická sonda představující koncové zařízení. Místo LED diod se jednoduše na výstupy obvodů 74HCT595 připojí příslušné piny OLED displeje. Displej poté s mikrokontrolérem komunikuje po SPI lince, které se převádí v převodníku na 8 bitovou paralelní informaci pro displej.
Po zapnutí přípravku se na obrazovce objeví uvítací obrazovka. Po stisku tlačítka menu UP se přepne z uvítací obrazovky do menu a zobrazí se první nabídka menu. Dalším stiskem tlačítka menu UP je postupováno v hlavním menu směrem nahoru až do poslední nabídky. Stiskem tlačítka menu DOWN je postupováno menu směrem dolů až do první nabídky.
Při prvním zapnutí přípravku je koncové SPI zařízení z resetováno a uvedeno tak do výchozího nastavení. V této situaci jsou všechny bity řídícího registru tohoto SPI zařízení vynulovány. To je indikováno na 16 LED, které jsou v tuto chvíli zhasnuty. Kromě indikace na LED diodách je výchozí nastavení indikováno také na OLED displeji, neboť při procházení hlavního menu tlačítky menu UP a DOWN není na druhém řádku displeje indikovány žádný zvolený parametr.
Pokud je v menu zobrazen požadovaný parametr který má být změněn je možné třetím tlačítkem s názvem submenu prohlížet všechny podnabídky, které daný parametr umožňuje. Neustálým stiskáváním tohoto tlačítka je projížděno dokola kruhové menu, které toto tlačítko u každé nabídky vyvolává. Pokud je nalezen požadovaný parametr, který má být změněn stiskne se jednoduše poslední nastavovací tlačítko, které má název SET. Tímto stiskem dojde okamžitě k odeslání dat po SPI lince do koncového SPI zařízení a jsou nastaveny příslušné bity jeho řídícího registru, které odpovídají nastavenému parametru. Zároveň s tímto odesláním dat dojde také k zapamatování této volby. Na OLED displeji při zpětném prochází v hlavním menu, již bude na druhém řádku displeje u této volby indikován i zvolený parametr. Tím je zřetelně indikováno, jak bylo koncové zařízení nastaveno.
void send_SPI(unsigned int c) { //funkce odešle po SPI lince 16bitovou proměnnou unsigned int a; a=c>>8; //do a je uložena horní část 16bitové proměnné while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný UCA0TXBUF=(unsigned char)a; //pošli horní část proměnné while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný UCA0TXBUF=(unsigned char)c; //pošli spodní část proměnné while(!(UCA0IFG&UCTXIFG)); //čekej dokud je buffer prázdný P1OUT |= BIT6; P1OUT &=~BIT6; return; }
void LCD_CMD(unsigned char command) { P8OUT &=~ BIT1; SPIDAT |= A0; //A0 do 1 SPIDAT=SPIDAT+command; SPIDAT &=~ WR; //WR vynuluji send_SPI(SPIDAT); SPIDAT |= WR; //WR, A0 přepnu do 1 send_SPI(SPIDAT); SPIDAT=SPIDAT&0xFF00; return; }
void LCD_DATA(unsigned char data) { SPIDAT=SPIDAT+data; SPIDAT &=~ A0; //A0 vynuluji SPIDAT &=~ WR; //WR vynuluji send_SPI(SPIDAT); SPIDAT |= WR; //WR, A0 přepnu do 1 send_SPI(SPIDAT); SPIDAT=SPIDAT&0xFF00; return; }
void cursor(unsigned int pozice) { LCD_CMD(0x46); // cursor command LCD_DATA((unsigned char)pozice); // lower pozice=pozice>>8; LCD_DATA((unsigned char)pozice); // higher }
void graphics_clear(void) { //funkce vyčistí grafickou a textovou část //všechny pozice RAM jsou vyplněny nulami //bez vynulování zobrazuje LCD nahodilé symboly a grafiku unsigned int m=0; //proměnné pro cykly unsigned int n=0; //proměnné pro cykly LCD_CMD(0x4F); for(m=0;m<27;m++) { for(n=0;n<40;n++) { cursor(9600+m*360+n); //výběr jednotlivých sektorů paměti LCD LCD_CMD(0x42); //nastav zápis //sektor LCD vyplněn nulami LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); LCD_DATA(0x00); } } }
void write_pixel(unsigned int x,unsigned int y) { static int pozicnik=0; static int mem; static int pole[20]={0}; unsigned char sektor; unsigned char subbit; subbit=x%8; sektor=(x-subbit)/8; if(pozicnik!=19) { cursor(pole[pozicnik+1]);//předchozí pozici vyčistit LCD_CMD(0x42); LCD_DATA(0x00); } else { cursor(pole[0]);//předchozí pozici vyčistit LCD_CMD(0x42); LCD_DATA(0x00); } mem=9600+y*40+sektor; pole[pozicnik]=mem; pozicnik++; if(pozicnik==20) { pozicnik=0; } cursor(mem); LCD_CMD(0x42); LCD_DATA(0b10000000>>subbit); }
SPIDAT|= A0|WR|RD; send_SPI(SPIDAT); _delay_cycles(1000); SPIDAT|= RESET; send_SPI(SPIDAT); _delay_cycles(1000); _delay_cycles(1000); // inicializační sekvence pro LCD 320x240 // pro jiný rozměr je nutno přepočítat LCD_CMD(0x40); //system set LCD_DATA(0x30); LCD_DATA(0x07); LCD_DATA(0x07); LCD_DATA(0x27); LCD_DATA(0x2F); LCD_DATA(0xEF); LCD_DATA(0x28); LCD_DATA(0x00); LCD_CMD(0x44); //scroll LCD_DATA(0x0); LCD_DATA(0x0); LCD_DATA(0xF0); LCD_DATA(0x80); LCD_DATA(0x25); LCD_DATA(0xF0); LCD_DATA(0x00); LCD_DATA(0x4B); LCD_DATA(0x0); LCD_DATA(0x0); LCD_CMD(0x5A); //HDOT SCR LCD_DATA(0x0); LCD_CMD(0x5B); //ovlay LCD_DATA(0x01); LCD_CMD(0x58); //DISP ON OFF LCD_DATA(0x56); LCD_CMD(0x46); //CSRW LCD_DATA(0x00); LCD_DATA(0x00); LCD_CMD(0x5D); //CSR FORM LCD_DATA(0x04); LCD_DATA(0x86); LCD_CMD(0x59); //display ON
unsigned int px=0; unsigned int py=0; //proměnné se inkrementují tak dlouho dokud "nenarazí na kraj LCD" //což je zjištěno pomocí podmínek if(py==239), následně se vynuluje příznak //a proměnná se dekrementuje, poloha aktuálního bodu je zapsána pomocí write_pixel(px,py); while(1) { if(xpriznak==0) px++; if(ypriznak==0) py++; if(xpriznak!=0) px--; if(ypriznak!=0) py--; if(px==319) xpriznak=1; if(py==239) ypriznak=1; if(px==0) xpriznak=0; if(py==0) ypriznak=0; write_pixel(px,py); //zápis polohy bodu for(i=0;i<4000;i++) //jednoduchý delay {} } return 0; }
Funkční řízení LCD po lince SPI je možno vidět na tomto odkazu https://www.youtube.com/watch?v=FCzxzdG-qaQ . Na uvedeném testu je možno vidět postupné několikanásobné vypsání textu Hello world, následně změněna adresa zápisu a vypsáno písmeno C pro zjištění správně textové mřížky LCD. Grafická část zobrazuje jezdícího hada. Během testování se ukázalo, že k řízení by bylo vhodné zvýšit takt procesoru ( použitá vývojová SPI deska využívá takt pouze 4MHz ) případně využít procesor s rychlejším SPI modulem. Použitý LCD výrobce Raystar nedosahuje příliš vysokého kontrastu. V katalogovém listu je uvedena barva černobílá avšak černá tohoto displeje připomíná spíše modrou. Celkový kód je možno vidět zde http://pastebin.com/UqdhU00N