Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:spi-oled-msp

Toto je starší verze dokumentu!


Zadání

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.

Úvod

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.

Mikrokontrolér

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.

SPI převodník

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.

  • PIN 1 GND
  • PIN 2 CS (chip select)
  • PIN 3 SCLK (SPI hodiny)
  • PIN 4 SDATA, (SPI data)
  • PIN 5 +5V

Ovládací menu a ovládání

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.

  • Menu UP → pohyb v hlavním menu směrem nahoru
  • Menu DOWN → pohyb v hlavním menu směrem dolů
  • Submenu → výběr podnabídky příslušného hlavního menu (kruhové menu)
  • SET

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.

Program pro řízení

Odeslání 16b proměnné
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;
}
Funkce pro odeslání příkazu do LCD
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;
}
Funkce pro odeslání dat do LCD
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;
}
Umístění kurzoru na pozici
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
}
Vynulování RAM displeje
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);
 
	}
}
}
Zápis pixelu na pozici
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);
}
Inicializační sekvence
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
Test grafické části řízení - jezdící had
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;
}

Závěr

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

2014/spi-oled-msp.1420908266.txt.gz · Poslední úprava: 2015/01/10 17:44 autor: Milan Abrman