Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:spi-glcd-msp

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:spi-glcd-msp [2015/01/09 09:12]
David Čada [Návrh zapojení převodníku]
2014:spi-glcd-msp [2015/01/09 10:14] (aktuální)
David Čada [Závěr]
Řádek 31: Řádek 31:
  
 == Odeslání 16b proměnné == == Odeslání 16b proměnné ==
 +
 +<code cpp>
 void send_SPI(unsigned int c) void send_SPI(unsigned int c)
 { {
 +//funkce odešle po SPI lince 16bitovou proměnnou
 +
  unsigned int a;  unsigned int a;
- a=c>>​8;​+ a=c>>​8; ​       //do a je uložena horní část 16bitové proměnné
  
- while(!(UCA0IFG&​UCTXIFG));​ + while(!(UCA0IFG&​UCTXIFG)); ​  //čekej dokud je buffer prázdný 
- UCA0TXBUF=(unsigned char)a; + UCA0TXBUF=(unsigned char)a; ​ //​pošli horní část proměnné 
- while(!(UCA0IFG&​UCTXIFG));​ + while(!(UCA0IFG&​UCTXIFG)); ​  //čekej dokud je buffer prázdný 
- UCA0TXBUF=(unsigned char)c; + UCA0TXBUF=(unsigned char)c; ​ //​pošli spodní část proměnné 
- while(!(UCA0IFG&​UCTXIFG));​+ while(!(UCA0IFG&​UCTXIFG)); ​  //čekej dokud je buffer prázdný
  
  P1OUT |= BIT6;  P1OUT |= BIT6;
Řádek 46: Řádek 50:
  return;  return;
 } }
 +</​code>​
  
-== Funkce pro odeslání příkazu==+== Funkce pro odeslání příkazu ​do LCD== 
 +<code cpp>
 void LCD_CMD(unsigned char command) void LCD_CMD(unsigned char command)
 { {
Řádek 63: Řádek 69:
  return;  return;
 } }
-== Funkce pro odeslání dat==+</​code>​ 
 + 
 +== Funkce pro odeslání dat do LCD== 
 +<code cpp>
 void LCD_DATA(unsigned char data) void LCD_DATA(unsigned char data)
 { {
Řádek 77: Řádek 86:
  return;  return;
 } }
 +</​code>​
 == Umístění kurzoru na pozici == == Umístění kurzoru na pozici ==
 +<code cpp>
 void cursor(unsigned int pozice) void cursor(unsigned int pozice)
 { {
Řádek 85: Řádek 96:
 LCD_DATA((unsigned char)pozice);​ //​ higher LCD_DATA((unsigned char)pozice);​ //​ higher
 } }
 +</​code>​
 == Vynulování RAM displeje == == Vynulování RAM displeje ==
 +<code cpp>
 void graphics_clear(void) void graphics_clear(void)
 { {
-//funkce vyčistí grafickou část+ 
 +//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 m=0; //​proměnné pro cykly
 unsigned int n=0; //​proměnné pro cykly unsigned int n=0; //​proměnné pro cykly
Řádek 98: Řádek 115:
  for(n=0;​n<​40;​n++)  for(n=0;​n<​40;​n++)
  {  {
- cursor(9600+m*360+n);​+ cursor(9600+m*360+n); ​//výběr jednotlivých sektorů paměti LCD
  
- LCD_CMD(0x42);​+ LCD_CMD(0x42); ​       //​nastav zápis 
 +                                      //sektor LCD vyplněn nulami
  LCD_DATA(0x00);​  LCD_DATA(0x00);​
  LCD_DATA(0x00);​  LCD_DATA(0x00);​
Řádek 114: Řádek 132:
 } }
 } }
 +</​code>​
 == Zápis pixelu na pozici == == Zápis pixelu na pozici ==
 +<code cpp>
 void write_pixel(unsigned int x,unsigned int y) void write_pixel(unsigned int x,unsigned int y)
 { {
Řádek 153: Řádek 172:
  LCD_DATA(0b10000000>>​subbit);​  LCD_DATA(0b10000000>>​subbit);​
 } }
- +</​code>​ 
---Inicializační sekvence-- +==Inicializační sekvence== 
 +<code cpp>
 SPIDAT|= A0|WR|RD; SPIDAT|= A0|WR|RD;
 send_SPI(SPIDAT);​ send_SPI(SPIDAT);​
Řádek 164: Řádek 183:
 _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_CMD(0x40);​ //system set
 LCD_DATA(0x30);​ LCD_DATA(0x30);​
Řádek 199: Řádek 221:
 LCD_DATA(0x86);​ LCD_DATA(0x86);​
 LCD_CMD(0x59);​ //display ON LCD_CMD(0x59);​ //display ON
 +</​code>​
  
 +==Test grafické části řízení - jezdící had==
 +<code cpp>
 +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;
 +}
 +</​code>​
  
 +==== 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-glcd-msp.1420791142.txt.gz · Poslední úprava: 2015/01/09 09:12 autor: David Čada