Fórum témák

» Több friss téma
Fórum » Színes LCD + PIC
 
Témaindító: pici, idő: Feb 19, 2008
Témakörök:
Lapozás: OK   39 / 46
(#) Droot válasza Wezuv hozzászólására (») Jan 12, 2016 /
 
Köszi!
Találtam egy github oldalt, ahol szépen össze van foglalva, hogy miket tud:
Bővebben: Link
Az SSD-t nem néztem, hogy tudja-e, de nekem a HW scroll nagyon tetszik, ezen a videón látszik, hogy egész szépen működik is.
A gyártó honlpaján még sample kódok is vannak, bár én jobban szeretem magam megírni, de kiindulásnak tökéletes.
Ahogy a videót elnézem ennél nagyon gyorsabb nekem nem is kell. Így is szép teljesítmény ahoz képest, hogy mennyi adatot küld ki pl egy bmp-nél.
(#) Wezuv válasza Droot hozzászólására (») Jan 13, 2016 /
 
Szia! A HW scrollt nem használtam még, de mintha lenne az SSD-ben is. A videón látható sebességet értem el én is kb. ami már kielégítő. Az a DMA ha jól értettem SPI-n tud Flash-ről beolvasni képet, egész gyors, ami várható is tőle. Szóval nem lesz gondod a sebességgel, ami a kijelzőt illeti.
A hozzászólás módosítva: Jan 13, 2016
(#) Wezuv válasza Droot hozzászólására (») Jan 13, 2016 /
 
Közben rájöttem, hogy miért kell kiválasztani a protokolt a rendelésnél. Van egy átkötés a panelen, amivel ezt be lehet állítani és beállítják előre, de később ezt módosítani lehet, ha szükség lenne rá. (Az átkötés az IC egy lábát állítja be a módnak megfelelő szintre. Mindkét vezérlő IC-nek van ilyen lába... ). Ugyan így van a tápfesszel is, meg még néhány dologgal, ami megtalálható a kijelző adatlapján...
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Igen, ezt az átkötést én is láttam de semmi más különbséget nem. Még az adatlap sem említi.

Lassacskán kezdem tervezni a panelom HW-ét, mégiscsak a PIC32MZ2048ECH100-at választottam, mert kevés a 64 láb.
A PMP-nél vannak PMAx és PMDx elnevezésű lábak, az egyik az adat a másik pedig a cím. Az LCD-hez csak a PMD lábakat kell bekötni, ugye? A PMA pedig csak akkor kell, ha pl Flash chip-el kommunikálok, ugye?

A PIC32MZ starter kit kapcsolási rajzát nézegettem, hogy kell-e valami extra hogy elinduljon, mint pl MX-nél a Vcap, de úgy láttam semmi nem kell csak órajel. Kitérnek benne, hogy kvarcot és digitális kimenetű 4 lábú SMD rezonátort is lehet használni. Én utóbbit még nem használtam, most ki fogom próbálni, bár az ára a 10-szerese, nem tudom miben lehet jobb.
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Igen, csak az adat és a vezérlő lábakat kell használni, a címzést nem kell engedélyezni.
Az MZ erratájában és néhány fórumon olvastam, hogy nem tud külső kristályról elindulni, ezért külső oszcival kell meghajtani. Ha USB-t is akarsz használni, akkor 24MHz külső oszci kell.
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Borzalmas ahogy a lábakat szétszórták rajta! Tipikusan nem kétoldalas, hanem több rétegű panelokkal lenne az igazi.
Tehát erről el tud indulni, ugye?

Szerk:
Vannak olyan lábak, amit használ az LCD is PMP-vel és az ethernet is használna. Ezt hogy tudom megoldani?
A hozzászólás módosítva: Jan 19, 2016
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Annak ellenére, hogy a kínálatban kvarc-ként van megnevezve, jól megvezetve a szemlélődőt, ez egy oszcillátor. Természetesen erről fog működni.
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Igen, én is így láttam.

Arra nincs ötleted, hogy az Ethernet-et és a PMP-t hogy tudom egyszerre használni?
Például az ETXD0 és a DB11 egy lábon van.

Szerk:
PMRD és PMWR láb van az íráshoz és olvasáshoz. Az LCD-nél viszont WR van. Illetve EN. Hogyan is kell ezeket pontosan bekötni?
A hozzászólás módosítva: Jan 19, 2016
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Hirtelen nincs.
Viszont láttam olcsóbb oszcit ami 25ppm-es volt, igaz -20 és +70 között, de ez talán nem probléma... Link...
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Valóban! Köszi!

Közben találtam egy példát, ha lehet neki hinni, akkor PMWR az EN-re megy, a PMRD a WR-re, az RS-re pedig vagy egy szabad portlábat kötök, vagy a PMA0-t, nem tudom melyiket lenne érdemes.
(#) potyo válasza Droot hozzászólására (») Jan 19, 2016 /
 
Csak így a partszélről: ha az alternatív Ethernet lábakat használod, az nem jó? Pl. ETXD0 helyett AETXD0 és így tovább, minden egyes láb elé tegyél egy A betűt és nézd végig.
(#) Droot válasza potyo hozzászólására (») Jan 19, 2016 /
 
Köszönöm, azt nem tudtam, hogy vannak alternatív lábak is.
Amikor majd élesztem fel, gondolom valamelyik regiszterben jeleznem kell, hogy az alternatívakat használom.
Lehet vegyesen is, ugye, hogy pl használom az AETXD0-t és az ETXD1-et?
(#) potyo válasza Droot hozzászólására (») Jan 19, 2016 /
 
Szerintem nem lehet keverni. FETHIO konfigurációs bitet nézd meg.
(#) Droot válasza potyo hozzászólására (») Jan 19, 2016 /
 
Köszönöm!
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
A WR-re megy a PMWR.
Az E(RD)-re megy a PMRD láb.
A CS az engedélyező láb, azt neked kell vezérelni programból, bármelyik láb lehet.
Szintúgy az RS-t, hiszen a PMP nem tudja, hogy adat, vagy parancs megy ki.
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Ennek a dokumentumnak a 160-adik oldaláról puskáztam, illetve egy Microchip fórumban láttam ugyan ezt a bekötést, bár mind a kettő HD77480-as kijelző volt.
Akkor neked így tuti jó volt, hogy írod?
Elvileg a PMP-nek is van 2 Chip Selec lába.

Szerk: Közben találtam itt egy kapcsolást, azt írja valamiért nem megy neki, de ez úgy van bekötve, ahogy mondod.
A hozzászólás módosítva: Jan 19, 2016
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Hát, működik...
A cs lábbal úgy voltam, nem vesz el időt, ha én vezérlem és akkor nem kötött a láb. Nem néztem, hogy a PMP hogyan kezeli a cs-t, lehet, hogy minden alkalommal kapcsolja, ami nem jó, mert időt pazarol.
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Köszönöm, akkor így lesz.
Igen, jogos.
(#) Droot hozzászólása Jan 19, 2016 /
 
Utánaolvasgattam és elvileg két módja van Master-ben:
2. Külön kezeli a write és read lábat
1. Egybe kezeli a write és read lábat, ebben az esetben a PMWR az enable, a PMRD pedig magas vagy alacsony szinten van attól függően, hogy írás vagy olvasás történik.
Jól értelmeztem?
LCD kezeléshez a Master mode 1-et ajánlja.
Idézet:
„The PMP module supports two distinct read/write signaling methods. In Master mode 1, read and
write strobe are combined into a single control line, PMRD/PMWR; a second control line,
PMENB, determines when a read or write action is to be taken. In Master mode 2, read and write
strobes (PMRD and PMWR) are supplied on separate pins.”
A hozzászólás módosítva: Jan 19, 2016
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Az 1. mód felel meg a 8080-nak. Az LCD ismeri a 6800-at is, azaz az ajánlás pongyola, de mindegy is...
(#) Droot válasza Wezuv hozzászólására (») Jan 19, 2016 /
 
Igen.
Annyira nem világos, hogy most akkor 1. módban a PMWR és a PMRD lábakból milyen láb lesz, nagyon fura a Microchip PMP leírása.
A PMRD-ből lesz az RD tehát az Enable, a PMWR-ből pedig a Write/Read, ahogy leírtad, vagy fordítva? Az ajánlás PMENB lábat is emleget, viszont ilyen láb nincs rajta.
(#) Wezuv válasza Droot hozzászólására (») Jan 19, 2016 /
 
Szerintem úgy van ahogy írtam és írod. A leírás fura, vagy bennünk van a hiba. . Ez abból következik, hogy az LCD meghajtó IC lábainak működése egyértelmű és a bekötés működik.
A PMENB-nek felel meg a két cs láb, szerintem azért nincs.
(#) Droot hozzászólása Feb 23, 2016 /
 
Sziasztok!

Megérkezett ez az RA8875 vezérlős 8080 interfészes kijelző és szeretném a PMP-vel feléleszteni.
A bekötés a csatolt kapcsolási rajz szerint történt.

Az LCD kezelő kód a következő:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <xc.h>
  4. #include <GenericTypeDefs.h>
  5. #include <p32xxxx.h>
  6. #include <sys/attribs.h>
  7. #include <string.h>
  8. #include <stdint.h>
  9. #include <stdbool.h>
  10.  
  11. #include "ra8875.h"
  12.  
  13. #define RA_CS   PORTCbits.RC12 = 0
  14. #define RA_CSN  PORTCbits.RC12 = 1
  15.  
  16. #define RA_DATA  PORTCbits.RC1 = 1
  17. #define RA_CMD PORTCbits.RC1 = 0
  18.  
  19. // Colors (RGB565)
  20. #define   RA8875_BLACK            0x0000
  21. #define   RA8875_BLUE             0x001F
  22. #define   RA8875_RED              0xF800
  23. #define   RA8875_GREEN            0x07E0
  24. #define RA8875_CYAN             0x07FF
  25. #define RA8875_MAGENTA          0xF81F
  26. #define RA8875_YELLOW           0xFFE0  
  27. #define RA8875_WHITE            0xFFFF
  28.  
  29. // Command/Data pins for SPI
  30. #define RA8875_DATAWRITE        0x00
  31. #define RA8875_DATAREAD         0x40
  32. #define RA8875_CMDWRITE         0x80
  33. #define RA8875_CMDREAD          0xC0
  34.  
  35. // Registers & bits
  36. #define RA8875_PWRR             0x01
  37. #define RA8875_PWRR_DISPON      0x80
  38. #define RA8875_PWRR_DISPOFF     0x00
  39. #define RA8875_PWRR_SLEEP       0x02
  40. #define RA8875_PWRR_NORMAL      0x00
  41. #define RA8875_PWRR_SOFTRESET   0x01
  42.  
  43. #define RA8875_MRWC             0x02
  44.  
  45. #define RA8875_GPIOX            0xC7
  46.  
  47. #define RA8875_PLLC1            0x88
  48. #define RA8875_PLLC1_PLLDIV2    0x80
  49. #define RA8875_PLLC1_PLLDIV1    0x00
  50.  
  51. #define RA8875_PLLC2            0x89
  52. #define RA8875_PLLC2_DIV1       0x00
  53. #define RA8875_PLLC2_DIV2       0x01
  54. #define RA8875_PLLC2_DIV4       0x02
  55. #define RA8875_PLLC2_DIV8       0x03
  56. #define RA8875_PLLC2_DIV16      0x04
  57. #define RA8875_PLLC2_DIV32      0x05
  58. #define RA8875_PLLC2_DIV64      0x06
  59. #define RA8875_PLLC2_DIV128     0x07
  60.  
  61. #define RA8875_SYSR             0x10
  62. #define RA8875_SYSR_8BPP        0x00
  63. #define RA8875_SYSR_16BPP       0x0C
  64. #define RA8875_SYSR_MCU8        0x00
  65. #define RA8875_SYSR_MCU16       0x03
  66.  
  67. #define RA8875_PCSR             0x04
  68. #define RA8875_PCSR_PDATR       0x00
  69. #define RA8875_PCSR_PDATL       0x80
  70. #define RA8875_PCSR_CLK         0x00
  71. #define RA8875_PCSR_2CLK        0x01
  72. #define RA8875_PCSR_4CLK        0x02
  73. #define RA8875_PCSR_8CLK        0x03
  74.  
  75. #define RA8875_HDWR             0x14
  76.  
  77. #define RA8875_HNDFTR           0x15
  78. #define RA8875_HNDFTR_DE_HIGH   0x00
  79. #define RA8875_HNDFTR_DE_LOW    0x80
  80.  
  81. #define RA8875_HNDR             0x16
  82. #define RA8875_HSTR             0x17
  83. #define RA8875_HPWR             0x18
  84. #define RA8875_HPWR_LOW         0x00
  85. #define RA8875_HPWR_HIGH        0x80
  86.  
  87. #define RA8875_VDHR0            0x19
  88. #define RA8875_VDHR1            0x1A
  89. #define RA8875_VNDR0            0x1B
  90. #define RA8875_VNDR1            0x1C
  91. #define RA8875_VSTR0            0x1D
  92. #define RA8875_VSTR1            0x1E
  93. #define RA8875_VPWR             0x1F
  94. #define RA8875_VPWR_LOW         0x00
  95. #define RA8875_VPWR_HIGH        0x80
  96.  
  97. #define RA8875_HSAW0            0x30
  98. #define RA8875_HSAW1            0x31
  99. #define RA8875_VSAW0            0x32
  100. #define RA8875_VSAW1            0x33
  101.  
  102. #define RA8875_HEAW0            0x34
  103. #define RA8875_HEAW1            0x35
  104. #define RA8875_VEAW0            0x36
  105. #define RA8875_VEAW1            0x37
  106.  
  107. #define RA8875_MCLR             0x8E
  108. #define RA8875_MCLR_START       0x80
  109. #define RA8875_MCLR_STOP        0x00
  110. #define RA8875_MCLR_READSTATUS  0x80
  111. #define RA8875_MCLR_FULL        0x00
  112. #define RA8875_MCLR_ACTIVE      0x40
  113.  
  114. #define RA8875_DCR                    0x90
  115. #define RA8875_DCR_LINESQUTRI_START   0x80
  116. #define RA8875_DCR_LINESQUTRI_STOP    0x00
  117. #define RA8875_DCR_LINESQUTRI_STATUS  0x80
  118. #define RA8875_DCR_CIRCLE_START       0x40
  119. #define RA8875_DCR_CIRCLE_STATUS      0x40
  120. #define RA8875_DCR_CIRCLE_STOP        0x00
  121. #define RA8875_DCR_FILL               0x20
  122. #define RA8875_DCR_NOFILL             0x00
  123. #define RA8875_DCR_DRAWLINE           0x00
  124. #define RA8875_DCR_DRAWTRIANGLE       0x01
  125. #define RA8875_DCR_DRAWSQUARE         0x10
  126.  
  127.  
  128. #define RA8875_ELLIPSE                0xA0
  129. #define RA8875_ELLIPSE_STATUS         0x80
  130.  
  131. #define RA8875_MWCR0            0x40
  132. #define RA8875_MWCR0_GFXMODE    0x00
  133. #define RA8875_MWCR0_TXTMODE    0x80
  134.  
  135. #define RA8875_CURH0            0x46
  136. #define RA8875_CURH1            0x47
  137. #define RA8875_CURV0            0x48
  138. #define RA8875_CURV1            0x49
  139.  
  140. #define RA8875_P1CR             0x8A
  141. #define RA8875_P1CR_ENABLE      0x80
  142. #define RA8875_P1CR_DISABLE     0x00
  143. #define RA8875_P1CR_CLKOUT      0x10
  144. #define RA8875_P1CR_PWMOUT      0x00
  145.  
  146. #define RA8875_P1DCR            0x8B
  147.  
  148. #define RA8875_P2CR             0x8C
  149. #define RA8875_P2CR_ENABLE      0x80
  150. #define RA8875_P2CR_DISABLE     0x00
  151. #define RA8875_P2CR_CLKOUT      0x10
  152. #define RA8875_P2CR_PWMOUT      0x00
  153.  
  154. #define RA8875_P2DCR            0x8D
  155.  
  156. #define RA8875_PWM_CLK_DIV1     0x00
  157. #define RA8875_PWM_CLK_DIV2     0x01
  158. #define RA8875_PWM_CLK_DIV4     0x02
  159. #define RA8875_PWM_CLK_DIV8     0x03
  160. #define RA8875_PWM_CLK_DIV16    0x04
  161. #define RA8875_PWM_CLK_DIV32    0x05
  162. #define RA8875_PWM_CLK_DIV64    0x06
  163. #define RA8875_PWM_CLK_DIV128   0x07
  164. #define RA8875_PWM_CLK_DIV256   0x08
  165. #define RA8875_PWM_CLK_DIV512   0x09
  166. #define RA8875_PWM_CLK_DIV1024  0x0A
  167. #define RA8875_PWM_CLK_DIV2048  0x0B
  168. #define RA8875_PWM_CLK_DIV4096  0x0C
  169. #define RA8875_PWM_CLK_DIV8192  0x0D
  170. #define RA8875_PWM_CLK_DIV16384 0x0E
  171. #define RA8875_PWM_CLK_DIV32768 0x0F
  172.  
  173. #define RA8875_TPCR0                  0x70
  174. #define RA8875_TPCR0_ENABLE           0x80
  175. #define RA8875_TPCR0_DISABLE          0x00
  176. #define RA8875_TPCR0_WAIT_512CLK      0x00
  177. #define RA8875_TPCR0_WAIT_1024CLK     0x10
  178. #define RA8875_TPCR0_WAIT_2048CLK     0x20
  179. #define RA8875_TPCR0_WAIT_4096CLK     0x30
  180. #define RA8875_TPCR0_WAIT_8192CLK     0x40
  181. #define RA8875_TPCR0_WAIT_16384CLK    0x50
  182. #define RA8875_TPCR0_WAIT_32768CLK    0x60
  183. #define RA8875_TPCR0_WAIT_65536CLK    0x70
  184. #define RA8875_TPCR0_WAKEENABLE       0x08
  185. #define RA8875_TPCR0_WAKEDISABLE      0x00
  186. #define RA8875_TPCR0_ADCCLK_DIV1      0x00
  187. #define RA8875_TPCR0_ADCCLK_DIV2      0x01
  188. #define RA8875_TPCR0_ADCCLK_DIV4      0x02
  189. #define RA8875_TPCR0_ADCCLK_DIV8      0x03
  190. #define RA8875_TPCR0_ADCCLK_DIV16     0x04
  191. #define RA8875_TPCR0_ADCCLK_DIV32     0x05
  192. #define RA8875_TPCR0_ADCCLK_DIV64     0x06
  193. #define RA8875_TPCR0_ADCCLK_DIV128    0x07
  194.  
  195. #define RA8875_TPCR1            0x71
  196. #define RA8875_TPCR1_AUTO       0x00
  197. #define RA8875_TPCR1_MANUAL     0x40
  198. #define RA8875_TPCR1_VREFINT    0x00
  199. #define RA8875_TPCR1_VREFEXT    0x20
  200. #define RA8875_TPCR1_DEBOUNCE   0x04
  201. #define RA8875_TPCR1_NODEBOUNCE 0x00
  202. #define RA8875_TPCR1_IDLE       0x00
  203. #define RA8875_TPCR1_WAIT       0x01
  204. #define RA8875_TPCR1_LATCHX     0x02
  205. #define RA8875_TPCR1_LATCHY     0x03
  206.  
  207. #define RA8875_TPXH             0x72
  208. #define RA8875_TPYH             0x73
  209. #define RA8875_TPXYL            0x74
  210.  
  211. #define RA8875_INTC1            0xF0
  212. #define RA8875_INTC1_KEY        0x10
  213. #define RA8875_INTC1_DMA        0x08
  214. #define RA8875_INTC1_TP         0x04
  215. #define RA8875_INTC1_BTE        0x02
  216.  
  217. #define RA8875_INTC2            0xF1
  218. #define RA8875_INTC2_KEY        0x10
  219. #define RA8875_INTC2_DMA        0x08
  220. #define RA8875_INTC2_TP         0x04
  221. #define RA8875_INTC2_BTE        0x02
  222.  
  223. #define RA8875_HEIGHT   480
  224. #define RA8875_WIDTH    800
  225. void init_tft()
  226. {
  227.     //init OC9 for PWM backlight, 1KHz, OC9
  228.     RPB2Rbits.RPB2R = 13;   //RPB3 OC9 PWM
  229.     OC9CONbits.ON = 1;      //Oscillator Compare ON
  230.     OC9CONbits.OCM0 = 0;    //PWM mode on OCx; Fault pin disabled
  231.     OC9CONbits.OCM1 = 1;
  232.     OC9CONbits.OCM2 = 1;
  233.     PR9 = (6250000 / 15) - 1;   //PR9 = (SYSCLK / PWM_FREQ) - 1; 1KHz
  234.     OC9RS = (PR9 + 1) * ((float)0 / 100);   //Set 0% duty cycle
  235.     T9CONSET = 0x8000;      // Enable Timer2, prescaler 1:1
  236.     OC9CONSET = 0x8000;     // Enable Output Compare Module 1
  237.    
  238.     //init PMP
  239.     PMMODE = 0;
  240.     PMAEN  = 0;
  241.     PMCON  = 0;             // WRSP: Write Strobe Polarity bit
  242.     PMCONbits.ON = 1;       //PMP on
  243.     PMCONbits.PTRDEN = 1;   //PMRD-PMWR enable
  244.     PMCONbits.PTWREN = 1;
  245.     PMCONbits.WRSP = 1;     //WR pin active high
  246.     PMCONbits.RDSP = 1;     //RD pin active high
  247.     PMCONbits.CSF = 0;
  248.     PMMODEbits.MODE16 = 1;  //16 bit data transfer
  249.     PMMODEbits.MODE0 = 1;   //Master mode 2 (PMCSx, PMRD, PMWR, PMA<x:0>, PMD<7:0> and PMD<8:15>(3))
  250.     PMMODEbits.MODE1 = 1;
  251.     PMMODEbits.WAITB0 = 1;  //Data wait of 4 TPBCLK2; multiplexed address phase of 4 TPBCLK2
  252.     PMMODEbits.WAITB1 = 1;
  253.     PMMODEbits.WAITM0 = 1;  //Wait of 16 TPBCLK2
  254.     PMMODEbits.WAITM1 = 1;
  255.     PMMODEbits.WAITM2 = 1;
  256.     PMMODEbits.WAITM3 = 1;
  257.     PMMODEbits.WAITE0 = 1;  //Wait of 4 TPBCLK2
  258.     PMMODEbits.WAITE1 = 1;
  259.     PMCONbits.PMPEN = 1;
  260.     /*
  261.     PMMODE = 0; PMAEN = 0; PMCON = 0;
  262.     PMMODEbits.MODE   = 2;  // Intel 80 master interface
  263.     PMMODEbits.WAITB  = 0;
  264.     PMMODEbits.WAITM  = 0;
  265.     PMMODEbits.WAITE  = 0;
  266.     PMMODEbits.MODE16 = 1;  // 16 bit mode
  267.     PMCONbits.PTRDEN = 1;   // disable RD line
  268.     PMCONbits.PTWREN = 1;   // enable WR line
  269.     PMCONbits.WRSP=0;       //
  270.     PMCONbits.PMPEN  = 1;   // enable PMP
  271.         */
  272.    
  273.     // I/O init
  274.     //Chip Select
  275.     TRISCbits.TRISC12 = 0;  //output
  276.     RA_CSN;
  277.     //Register Select
  278.     TRISCbits.TRISC1 = 0;   //output
  279.     PORTCbits.RC1 = 1;      //go high
  280.     //Wait signal
  281.     TRISAbits.TRISA5 = 1;   //input
  282.     //LCD int
  283.     TRISGbits.TRISG6 = 1;   //input
  284.     //LCD reset
  285.     TRISGbits.TRISG7 = 0;   //output
  286.     PORTGbits.RG7 = 1;      //go high
  287.    
  288.     int width = 800, height = 480;
  289.       //PLL_init
  290.   tft_write_register(RA8875_PLLC1, RA8875_PLLC1_PLLDIV1 + 10);
  291.   ;
  292.   tft_write_register(RA8875_PLLC2, RA8875_PLLC2_DIV4);
  293.   ;
  294.  
  295.   tft_write_register(RA8875_SYSR, RA8875_SYSR_16BPP | RA8875_SYSR_MCU8);
  296.  
  297.   /* Set the correct values for the display being used */  
  298.   uint8_t  pixclk          = RA8875_PCSR_PDATL | RA8875_PCSR_2CLK;
  299.   uint8_t  hsync_nondisp   = 26;
  300.   uint8_t  hsync_start     = 32;
  301.   uint8_t  hsync_pw        = 96;
  302.   uint8_t  hsync_finetune  = 0;
  303.   uint8_t  vsync_nondisp   = 32;
  304.   uint8_t  vsync_start     = 23;
  305.   uint8_t  vsync_pw        = 2;
  306.  
  307.   tft_write_register(RA8875_PCSR, pixclk);
  308.   ;
  309.  
  310.   /* Horizontal settings registers */
  311.   tft_write_register(RA8875_HDWR, (width / 8) - 1);                          // H width: (HDWR + 1) * 8 = 480
  312.   tft_write_register(RA8875_HNDFTR, RA8875_HNDFTR_DE_HIGH + hsync_finetune);
  313.   tft_write_register(RA8875_HNDR, (hsync_nondisp - hsync_finetune - 2)/8);    // H non-display: HNDR * 8 + HNDFTR + 2 = 10
  314.   tft_write_register(RA8875_HSTR, hsync_start/8 - 1);                         // Hsync start: (HSTR + 1)*8
  315.   tft_write_register(RA8875_HPWR, RA8875_HPWR_LOW + (hsync_pw/8 - 1));        // HSync pulse width = (HPWR+1) * 8
  316.  
  317.   /* Vertical settings registers */
  318.   tft_write_register(RA8875_VDHR0, (unsigned int)(height - 1) & 0xFF);
  319.   tft_write_register(RA8875_VDHR1, (unsigned int)(height - 1) >> 8);
  320.   tft_write_register(RA8875_VNDR0, vsync_nondisp-1);                          // V non-display period = VNDR + 1
  321.   tft_write_register(RA8875_VNDR1, vsync_nondisp >> 8);
  322.   tft_write_register(RA8875_VSTR0, vsync_start-1);                            // Vsync start position = VSTR + 1
  323.   tft_write_register(RA8875_VSTR1, vsync_start >> 8);
  324.   tft_write_register(RA8875_VPWR, RA8875_VPWR_LOW + vsync_pw - 1);            // Vsync pulse width = VPWR + 1
  325.  
  326.   /* Set active window X */
  327.   tft_write_register(RA8875_HSAW0, 0);                                        // horizontal start point
  328.   tft_write_register(RA8875_HSAW1, 0);
  329.   tft_write_register(RA8875_HEAW0, (unsigned int)(width - 1) & 0xFF);            // horizontal end point
  330.   tft_write_register(RA8875_HEAW1, (unsigned int)(width - 1) >> 8);
  331.  
  332.   /* Set active window Y */
  333.   tft_write_register(RA8875_VSAW0, 0);                                        // vertical start point
  334.   tft_write_register(RA8875_VSAW1, 0);  
  335.   tft_write_register(RA8875_VEAW0, (unsigned int)(height - 1) & 0xFF);           // horizontal end point
  336.   tft_write_register(RA8875_VEAW1, (unsigned int)(height - 1) >> 8);
  337.  
  338.   /* ToDo: Setup touch panel? */
  339.  
  340.   /* Clear the entire window */
  341.   tft_write_register(RA8875_MCLR, RA8875_MCLR_START | RA8875_MCLR_FULL);
  342.   ;
  343.  
  344.   /*
  345.   int i;
  346.   for(i=0;i<200;i++)
  347.   {
  348.     drawpixel(10, i, 0x1234);
  349.     drawpixel(11, i, 0x1234);
  350.     drawpixel(12, i, 0x1234);
  351.     drawpixel(13, i, 0x1234);
  352.     drawpixel(14, i, 0x1234);
  353.     drawpixel(15, i, 0x1234);
  354.     drawpixel(16, i, 0x1234);
  355.   }*/
  356. }
  357.  
  358. void PMPWaitBusy() {
  359.   while(PMMODEbits.BUSY);
  360. }
  361.  
  362. void Set_Index(unsigned short index) {
  363.   RA_DATA;
  364.   PMDIN = index;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  365.   PMPWaitBusy();
  366.   RA_CMD;
  367. }
  368.  
  369. void Write_Command( unsigned short cmd ) {
  370.     RA_CS;
  371.     RA_CMD;
  372.   PMDIN = cmd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  373.   PMPWaitBusy();
  374.   RA_DATA;
  375.     RA_CSN;
  376. }
  377.  
  378. void Write_Data(unsigned int _data) {
  379.     RA_CS;
  380.   PMDIN = _data;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  381.   PMPWaitBusy();
  382.     RA_CSN;
  383. }
  384.  
  385. void tft_write_register(uint8_t cmd, uint8_t data)
  386. {
  387.     Write_Command(cmd);
  388.     Write_Data(data);
  389. }
  390.  
  391. void drawpixel(int16_t x, int16_t y, uint16_t color)
  392. {
  393.         setXY(x,y);
  394.         Write_Command(RA8875_MRWC);
  395.         Write_Data(color);
  396.  
  397. }
  398.  
  399. void setXY(int16_t x, int16_t y)
  400. {
  401.         setX(x);
  402.         setY(y);
  403. }
  404.  
  405. void setX(int16_t x)
  406. {
  407.         if (x < 0) x = 0;
  408.                 if (x >= RA8875_HEIGHT) x = RA8875_HEIGHT-1;
  409.                 tft_write_register(RA8875_CURV0, x & 0xFF);
  410.                 tft_write_register(RA8875_CURV0+1, x >> 8);
  411. }
  412.  
  413. void setY(int16_t y)
  414. {
  415.         if (y < 0) y = 0;
  416.                 if (y >= RA8875_WIDTH) y = RA8875_WIDTH-1;
  417.                 tft_write_register(RA8875_CURH0, y & 0xFF);
  418.                 tft_write_register(RA8875_CURH0+1, (y >> 8));
  419. }
  420.  
  421. void tft_set_backlight(int val)
  422. {
  423.     if(val > 100) val = 100;
  424.     OC9RS = (PR9 + 1) * ((float)val / 100);
  425. }


Sajnos valamit biztos, hogy benézek. A kijelző úgy indul el, hogy teljesen fekete kb. 1 másodpercig majd szépen kifehéredik, majd színes függőleges csíkok jelennek meg rajta.
Én arra tippelnék, hogy a PMP beállításai illetve a küldő függvények hibásak. Az RA8875 inicializálása sem biztos, hogy jó. Gondolom inicializálás után nem csíkoknak kéne a kijelzőn lenni.
A hozzászólás módosítva: Feb 23, 2016
(#) Droot hozzászólása Feb 25, 2016 /
 
Sziasztok!

Az lenne a gond, hogy az RA8875 vezérlőnek adok olyan parancsot, hogy törölje le a kijelzőt, vagy rajzoljon egy kört és ahogy a parancs kiment ő rajzolja, de ha például két ilyen műveletet adok neki egymás után, akkor nem jól hajtja végre, mert az első művelet még nem hajtódott végre.
Elvileg a DCR regisztert kiolvasva a 7-es és 6-os bittel lehet poll-ozni. Azonban ezt nem tudtam megcsinálni, a regiszter kiolvasásával van gond.
Ilyenkor nem hajtja végre az utasítást:
  1. tft_draw_circle(100, 100, 30, 1);
  2.     tft_draw_ellipse(300, 200, 20, 40, 1);

Így megcsinálja:
  1. tft_draw_circle(100, 100, 30, 1);
  2.     delay_us(2000);
  3.     tft_draw_ellipse(300, 200, 20, 40, 1);


Ezekkel a függvényekkel próbálok regisztert kiolvasni, az RA5-ön van a WAIT:
  1. uint16_t tft_read_data(void)
  2. {
  3.         uint16_t data;
  4.         RA_CS_LO;
  5.         RA_RS_LO;
  6.         data = PMDIN;
  7.         while(PMMODEbits.BUSY);
  8.    
  9.         //data=PMDIN;
  10.    
  11.         RA_CS_HI;
  12.         return data;
  13. }
  14.  
  15. void tft_write_cmd(uint8_t cmd)
  16. {
  17.     while(PORTAbits.RA5 == 1);
  18.     RA_CS_LO;
  19.     RA_RS_HI;
  20.     PMDIN = cmd;
  21.     while(PMMODEbits.BUSY);
  22.     RA_CS_HI;
  23. }
  24.  
  25. uint16_t tft_read_register(uint16_t reg)
  26. {
  27.         tft_write_cmd(reg);
  28.         return tft_read_data();
  29. }
(#) Droot hozzászólása Feb 26, 2016 /
 
Előzmény

Nos a következő képpen rajzoltattam ki egy 640x480 felbontású képet:
Adott egy jpg fájl, ezt lementettem RGB565-ös BMP-be. Egy segédprogrammal előállítottam egy tömbböt, ami 640*480=307200 elemű tömböt tartalmaz 16 bites adatokkal. Minden egyes elem egy pixel.

Beállítottam a végtelenciklus előtt a kezdőpontot:
  1. tft_write_register(0x46,0);
  2.         tft_write_register(0x47,0>>8);
  3.         tft_write_register(0x48,0);
  4.         tft_write_register(0x49,0>>8);

Majd kiadtam a memory write parancsot:
  1. tft_write_cmd(0x02);

Ezután a ciklusomban ment egy számláló, ahol a tömbből mindig kiírtam a következő pixelnek megfelelő RGB 16 bites színkódot (16 bites PMP-vel).
Amikor a ciklusszámláló osztható volt (i%640==0 & y != 0) 640-el, akkor mindig beállítottam kezdőpontnak x=0 és y=y+1, tehát egy sorral lejjebb, majd újra kiadtam a memory write parancsot.

Ennél milyen gyorsabb megoldás lenne?
(#) Wezuv válasza Droot hozzászólására (») Feb 26, 2016 /
 
Biztosan ezen a vezérlőn is van olyan parancs, hogy terület kijelölése (az SSD-n van, ezen is kéne, ez alap!). Szóval kijelölök egy területet(x start, x end, y start, y end)), ami lehet az egész képernyő is. Ezután az SSD magától lépteti a címeket és sort is ugrik, csak tolni kell bele az adatokat sorban.

Azt is látom, hogy még mindig 8 biten nyomod? Az kétszeres időt jelent alapból...
szerk: Ja nem. látom, hogy csak a parancsot shiftelted, bocsi!

A másik kérdés, hogy milyen időzítéseket használsz a PMP-hez? Milyen frekin megy ki az adat?
A hozzászólás módosítva: Feb 26, 2016
(#) Droot válasza Wezuv hozzászólására (») Feb 26, 2016 /
 
Igen, csak a regiszterek címe és a beírható adat 8 bites.
Én úgy csináltam hogy az egész képernyőt kijelöltem aktív ablakként.
Magától léptette a pixelek címét.
Ha akkorát jelölnék ki mint a kép akkor csak a lefelé (y) léptetés maradhatna ki, ugye?
PMP-n a legnagyobb sebesség van beállítva a legkisebb órajellel.
Az lcd-nek van egy wait lába ami alacsony szinten van ha a kijelző elfoglalt. Ezt pollozim minden adat vagy command kiküldése előtt. Ha alacsony szinten van akkor várok amíg magas szintre nem húzza.
Majd kíváncsiságból megmérem hogy összesen a kijelző mennyi ideig tartja alacsony szinten a wait lábát.
(#) Wezuv válasza Droot hozzászólására (») Feb 26, 2016 /
 
Ha így van kijelölve a képernyő terület, akkor az y-t miért nem lépteti? Egyébként igen, csak az y beállítását spórólnád, de ahhoz szükséges egy feltétel vizsgálat, ami egy osztás nagy számmal, ami baromi lassú!

Mit jelent a PMP legkisebb órajele? Belső periféria frekire gondolsz? Próbálhatod emelni esetleg.

A polling sok időt vesz el. Hatékonyabb, ha megtalálod azt az időt, amit még elbír (baja nem lehet, max nem jelenik meg a kép). Igyekezni kell a lehető legkevesebb programsorral megoldani a feladatokat, a lehető legkevesebb feltételes elágazásokkal. Minden olyan, ami előre kiszámolható, az ne kirajzolás ciklusában számolódjon.
Persze elkerülhetetlen, hogy számításokat is végezzünk (ferde vonal, kör stb.), de azok egész műveletesek legyenek és ha lehet minél kisebb bitszélességgel. A librarykben van jó példa erre is, de a neten is találni hatékony kör rajzolót, ami nem szinusszal, koszinusszal számol.
A hozzászólás módosítva: Feb 26, 2016
(#) Droot válasza Wezuv hozzászólására (») Feb 26, 2016 /
 
Bocsánat, PMP-n a legnagyobb sebesség a legnagyobb órajellel van beállítva.
Egyenlőre azért nem léptette, mert a kép amit kiírattam 640*480 volt az aktív rész meg 800x480, illetve legfőképp azért mert nem tudtam, hogy lépteti.
Most próbálom ki mindjárt a léptetést a nagy számmal való osztás nélkül. Illetve amiket tanácsoltál azt is.

Az tetszik nagyon a kijelző vezérlőben, hogy beleírom a regiszterekbe pl hogy x= 100, y= 100, radius = 50 és egy regiszterbe azt hogy indítsa el a kör rajzolást és ő megoldja magának. Tehát semmilyen geometriai alakzatot nem kell pixelenként rajzolgatnom.
(#) Droot válasza Wezuv hozzászólására (») Feb 26, 2016 /
 
A PMP beállítása a következő:
  1. PMMODE = 0;
  2.     PMAEN  = 0;
  3.     PMCON  = 0;             // WRSP: Write Strobe Polarity bit
  4.     PMCONbits.ON = 1;       //PMP on
  5.     PMCONbits.PTRDEN = 1;   //PMRD-PMWR enable
  6.     PMCONbits.PTWREN = 1;
  7.     PMCONbits.WRSP = 0;     //WR pin active low
  8.     PMCONbits.RDSP = 0;     //RD pin active low
  9.     PMMODEbits.MODE16 = 1;  //16 bit data transfer
  10.     PMMODEbits.MODE0 = 1;   //Master mode 2 (PMCSx, PMRD, PMWR, PMA<x:0>, PMD<7:0> and PMD<8:15>(3))
  11.     PMMODEbits.MODE1 = 1;
  12.     PMCONbits.PMPEN = 1;
  13.     PMCONSET = 0x8000;

A polling helyére időzítést raktam, szépen vettem le és körülbelül ugyan annyira tudtam lemenni, ha lejjebb mentem, akkor már gondok voltak, tehát kb. ugyan annyit bír el.

A képfájlom:
  1. const unsigned short image16[] = {
  2.     0xcff0, 0xaf0d, 0xaf6d, 0xbff1, 0xb7b1, 0x7dec, 0x9ed3, 0xcff9,
  3.     ...............
  4.     };

A kiírást végző függvényem:
  1. void tft_draw_image(uint16_t x, uint16_t y, uint16_t xres, uint16_t yres, const unsigned short img[])
  2. {
  3.     //x, y start coordinates
  4.     tft_write_register(0x46,x);
  5.         tft_write_register(0x47,x>>8);
  6.         tft_write_register(0x48,y);
  7.         tft_write_register(0x49,y>>8);
  8.    
  9.     //active windows for automatic stepping
  10.     tft_set_active_window(0, (x+xres-1), 0, (y+yres-1));
  11.    
  12.     //memory write
  13.     tft_write_cmd(RA8875_MRWC);
  14.    
  15.     //fill screen
  16.     unsigned long int i = 0;
  17.     for(i = 0;i<=(xres*yres);i++)
  18.     {
  19.         tft_write_data(img[i]);
  20.     }
  21. }

Ebben a formában jelenleg 2921ms a megjelenítési idő.

Egészen biztos, hogy lehet rajta gyorsítani, ugyanis youtube-on néztem videókat és ott sokkal gyorsabb volt, szerintem néhány 100 ms.

Kiszúrtam az adatlapban ilyet, hogy Block Transfer Engine, ezzel esetleg?
A hozzászólás módosítva: Feb 26, 2016
Következő: »»   39 / 46
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem