Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:k430wqa

Rozdíly

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

Odkaz na výstup diff

Následující verze
Předchozí verze
2015:k430wqa [2016/01/17 11:44]
Rostislav Stehno vytvořeno
2015:k430wqa [2016/01/17 21:40] (aktuální)
Rostislav Stehno
Řádek 1: Řádek 1:
-**Tučně**====== Zadání ======+**====== Zadání ======**
  
 +Realizujte řízení dotykového RGB displeje K430WQA-V4-F pomocí mikrokontroléru Atmel ATSAM4E16 doplněného o 16MB flash paměť a USB rozhraní. Vytvořte textový font a funkce na zobrazení základních tvarů. Realizujte zobrazení obrázku z flash paměti.
  
 +**====== Hardware ======**
 +
 +Tento projekt je součást diplomové práce. K řízení je použit MCU ATSAM4E16E který je osazen na vlastní DPS. Zařízení je napájeno z baterie. Toto napětí je impulsními zdroji regulováno na 3.3V  a další potřebné napájení (+5V,-5V a +17V pro podsvícení displeje).
 +
 +{{:​2015:​hwfoto.jpg?​300|}}
 +
 +Display je je připojen na PORTC. Spodních 24 bitů je určeno pro přenos dat (RGB-888) a zbylé bity jsou použity pro signály HSYNC, VSYNC, DE a DCLK.
 +
 +**====== Program ======**
 +
 +Periodické signály, hlavně DCLK a HSYNC je vhodné řešit hardwarově,​ nejlépe některými z 9 TimerCounter modulů.
 +Při návrhu se s tímto počítalo a je to takto také realizováno. Zobrazení provádí funkce ZobrazitDISP(). Ta pracuje ve smyčce pro každý řádek. 10 prvních a posledních řádků jsou bez dat nutné pro správnou funkci. Během prvního řádku je nutné signál VSYNC držet celou dobu v aktivní úrovni. Každý jednotlivý řádek také obsahuje několik DCLK před aktivní zónou dat a také za ní.. Tuto zónu určuje signál DE. Pro dekódování formátu je nutné převést formát 256 barev na RGB888. Ktomu slouží pole ENCODE_DISP. Je veliké 256 hodnot každá odpovídá patřičné barvě. ​
 +Pole DISPLAY_POLE by pro plné rozlišení překročilo velikost RAM MCU a proto je nutné použít pouze rozlišení 420x238. I tak toto pole zabírá 75% RAM. 
 +
 +
 +**====== Kód ======**
 +
 +Při ladění a zprovozňování bylo využito logického analyzátoru pro kontrolu generovaných signálů.
 +
 + #define __SAM4E16E__
 + #include "​sam4e16e.h"​
 + uint8_t DISPLAY_POLE[420][238];​
 + uint32_t ENCODE_DISP[256];​
 + uint16_t Radek,​Sloupek;​
 +
 + void PinInit(void){
 + PIOA->​PIO_OER = 0xE03F0000;
 + PIOA->​PIO_CODR = 0xE03F0000;
 + PIOC->​PIO_OER = 0xD0FFFFFF;
 + PIOC->​PIO_CODR = 0xD0FFFFFF;
 + PIOD->​PIO_OER = 0xFF000000;
 + PIOD->​PIO_CODR = 0xFF000000;
 + PIOE->​PIO_OER = 0xF;
 + PIOE->​PIO_CODR = 0xF;
 + PIOB->​PIO_PDR = 0x0C;
 + PIOB->​PIO_ABCDSR[0] = 0x0C;
 + PIOB->​PIO_ABCDSR[1] = 0x0C;
 + PIOC->​PIO_PDR = 0x2D000000;
 + PIOC->​PIO_ABCDSR[0] = 0x2D000000;
 + PIOC->​PIO_ABCDSR[1] = 0x0C000000;
 + return;
 + }
 +
 + void TimerInit(void){
 + REG_TC1_IER2 = 0x10u;
 + REG_TC1_WPMR = 0x54494D00;
 + REG_TC1_RC0 = 0x05;
 + REG_TC1_RC2 = 0x00CF;
 + REG_TC1_CMR0 = 0x0C00C400;
 + REG_TC1_CMR2 = 0x0009C402u;​
 + PMC->​PMC_PCER0 = 0x05000000u;​
 + REG_TC1_WPMR = 0x54494D01u;​
 + REG_TC1_WPMR = 0x54494D00;
 + REG_TC1_RA2 = 0x00CE;
 + REG_TC1_WPMR = 0x54494D01u;​
 + return;
 + }
 +
 + void ZobrazitDISP(void){
 + while(REG_TC1_CV2!=0);​
 + uint16_t Cykl=0;
 + Radek=0;
 + while(Cykl<​290)
 + {
 + if(Cykl==0x0)
 + {
 + PIOC->​PIO_SODR = ((0x1u) << 28);
 + }
 + else if(Cykl==0x2)
 + {
 + PIOC->​PIO_CODR = ((0x1u) << 28);
 + }
 + else ​ if(Cykl>​=11&&​Cykl<​=283)
 + {
 + uint16_t t=0;
 + while(t<​0x30){t++;​}
 + PIOC->​PIO_SODR = ((0x1u) << 31);
 + if (Radek>​=17&&​Radek<​=255)
 + {
 + uint16_t y=0;
 + while(y<​0x75){y++;​}
 + Sloupek=0;​
 + while(Sloupek<​420){
 + PIOC->​PIO_ODSR = ENCODE_DISP[DISPLAY_POLE[Sloupek][Radek-15]];​
 + asm("​nop"​);​
 + asm("​nop"​);​
 + asm("​nop"​);​
 + asm("​nop"​);​
 + Sloupek++;​
 + }
 + y=0;
 + while(y<​0x75){y++;​}
 + }else{
 + uint16_t y=0;
 + while(y<​0x770){y++;​}
 + }
 + Radek++;​
 + PIOC->​PIO_CODR = ((0x1u) << 31);
 + }
 + while(REG_TC1_CV2<​=0x168);​
 + Cykl++;
 + }
 + return;
 + }
 +
 + int main(void)
 + {
 + SystemInit();​
 + SystemCoreClockUpdate();​
 + PinInit();​
 + TimerInit();​
 + REG_WDT_MR |= ((0x1)<<​13);​ //​watchdog disabled !!!!
 + PIOC->​PIO_SODR = ((0x1u) << 30);
 + REG_TC1_CCR0 = 0x5;
 + REG_TC1_CCR2 = 0x5;
 + while (1) 
 + {
 + ZobrazitDISP();​
 + }
 + }
 +
 +**====== Průběhy ======**
 +
 +Na těchto obrázcích můžeme vidět reálné naměřené průběhy pomocí logického analyzátoru. Sestupně to jsou: DCLK (6MHz), HSYNC, VSYNC, DE a DATA..
 +
 +{{:​2015:​gr1.png?​300|}}
 +
 +Na prvním obrázku je zobrazen průběh zobrazení celé obrazovky viz VSYNC
 +
 +{{:​2015:​gr2.png?​300|}}
 +
 +Na tomto obrázku vidíme detail průběhu zobrazení jednoho řádku HSYNC 
 +
 +**====== Závěr ======**
 +
 +{{:​2015:​mcu_disp.jpg?​200|}} {{:​2015:​20160117_210903.jpg?​200|}}
 +
 +Na pravém obrázku je zobrazena bílá barva, je zde patrný černý rámeček způsobený omezením RAM kapacity.
 +
 +Jedná se o první zkušenosti s touto architekturou MCU a jejich aplikací na vlastní desce.
 +Z toho vyplívají nedostatky, chyby a problémy které způsobily zpoždění práce a její neuplnost. Během tvorby byly pravděpodobně zničeny 2 mikrokontroléry a jedna DPS. Neuplnost také způsobilo nedostatečné zkušenosti s aplikací ARMů do vlastní desky.
  
2015/k430wqa.1453027484.txt.gz · Poslední úprava: 2016/01/17 11:44 autor: Rostislav Stehno