Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
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. | ||