Page 1 of 1

Controller ILI9320

PostPosted: 25 Oct 2013, 21:28
by Leonardo
Salve a tutti,

Sto utilizzando tramite XMega il controller ILI9320 http://mbed.org/media/uploads/frankvnk/ili9320ds_v0.51.pdf collegato con SPI ad un display LCD con risoluzione 320x240. Qualcuno lo ha mai utilizzato?

Riesco a scrivere correttamente nella memoria grafica GRAM del controller, l'immagine viene aggiornata immediatamente dopo la scrittura di ogni pixel con un effetto scorrimento visto il basso frame-rate dovuto all'interfaccia seriale.

Sapete se è possibile "bloccare" il refresh video e aggiornare in un colpo solo l'immagine una volta ultimata la scrittura del frame in memoria? Sul datasheet purtroppo non ho trovato nulla e non posso utilizzare altre interfacce più veloci.

Grazie
Ciao

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 10:39
by Leonardo
Per spiegarmi meglio ecco il codice che ho sviluppato (progetto Atmel Studio): http://www.atomwave.com/FPGA/HY28A.zip

In pratica ho realizzato una libreria per il controller ili9320 nei file ili9320.c, ili9320.h, ili9320_regs.h ed conf_ili9320.h

Nel main sostanzialmente c'è il seguente codice:

Code: Select all
ili9320_init();         
   ili9320_set_cursor(0, 0);
   for (int x=0;x<240;x++)
   {      
      for(int y=0;y<320;y++)
      {         
         ili9320_write_gram(ILI9320_GREEN);
      }      
   }         
    while(true)
    {   
      ili9320_clear_screen(ILI9320_RED);
      ili9320_clear_screen(ILI9320_GREEN);
      ili9320_clear_screen(ILI9320_BLUE);                                          
    }


Quello che voglio ottenere è una schermata verde iniziale seguita dal susseguirsi veloce di schermate rosse/verdi/blu senza disegnare videate incomplete (es. mezze rosse mezze verdi)

Ecco qualche secondo di filmato del problema: http://www.atomwave.com/FPGA/ili9320.mp4 dove è possibile notare che la memoria GRAM viene aggiornata mano a mano che vengono inviati i pixel e non a frame inviato.

NOTA: La prima schermata verde è giustamente più lenta nel disegno in quanto utilizza un metodo diverso per l'invio dei dati

Per quanto riguarda la sequenza di inizializzazione ho seguito l'application notes del controller http://www.densitron.com/uploadedFiles/Displays/Support/ILI9320AN_V0.92.pdf assieme al datasheet

Grazie
Ciao

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 11:45
by deluca
Non so se riuscirai ad aggirare il prb.
Secondo me per avere una evidente miglioria in termini di frame/sec devi almeno passare alla interfaccia parallela minimale a 8 bit.

Occorrono 13 connessioni ....
io utilizzo questo tipo di interfaccia con l'atxmega128a1

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 13:36
by Leonardo
Il rapporto frame/sec va anche bene (anche se aumentando i frame/sec il problema giustamente si riduce) però evidentemente il controller non ha un buffer dove memorizzare il frame senza visualizzarlo immediatamente durante il riempimento o comunque con la sola interfaccia SPI non permette di fare questa cosa. Peccato.

Lo schermo è su un PCB che offre solamente trami pin header l'interfaccia SPI e per il momento tengo le cose così, per semplici applicazioni può comunque andare bene. Eventualmente dissaldo lo schermo e creo un PCB personalizzato con interfaccia parallela se si presenta la necessità.

Grazie
Ciao

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 17:08
by zaxxon
Essendo la scrittura via SPI sicuramente più lenta rispetto a quella di refresh del display, il momento migliore in cui iniziare a scrivere sarebbe quello in cui inizia il refresh, quindi subito dopo il VSync, ma immagino che via SPI anche questa strada sia preclusa.

Hai notato per caso miglioramenti o peggioramenti provando a pilotarlo come 320x240 invece che 240x320? Ricordo che sul Dingoo A320, che usa un controller della stessa casa, si risolveva il problema del tearing ruotando di 90 gradi la gestione del display.

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 19:55
by Leonardo
Purtroppo non è disponibile l'interfaccia VSYNC sul PCB attuale. Ruotando lo schermo non ho notato miglioramenti. La cosa migliore sarebbe utilizzare l'interfaccia RGB a 18 bit per sfruttare inoltre tutti i colori disponibili, ma per il momento va bene anche così.

Grazie
Ciao

Re: Controller ILI9320

PostPosted: 26 Oct 2013, 23:12
by js-bascom
Se vuoi solamente cambiare il colore dello schermo velocemente esistono comandi che cambiano la seguenza dei tre colori fondamantali.

Dai un' occhiata qui, http://vimeo.com/user2128302/videos e aspetta finche lo schermo cambia dal blu al rosso velocemente.

Re: Controller ILI9320

PostPosted: 27 Oct 2013, 02:22
by Leonardo
Il cambio colore dello schermo era solo un esempio semplice per illustrare il problema

Grazie
Ciao

Re: Controller ILI9320

PostPosted: 27 Oct 2013, 22:19
by Leonardo
Solo per dirvi che ho ottenuto qualche miglioramento visivo diminuendo il framerate

Code: Select all
ili9320_write_reg(ILI9320_PANEL_INTERFACE_CONTROL_1, 0x300);   // fosc/8


In pratica la minor frequenza di aggiornamento del display permette di evitare la visualizzazione di due schermate sovrapposte.
Non è una grande soluzione ma per semplici interfacce prevalentemente statiche è un miglioramento interessante.

Re: Controller ILI9320

PostPosted: 28 Oct 2013, 22:51
by Leonardo
Per ringraziarvi dei consigli voglio condividere con voi un semplice programma che ho realizzato in grado di convertire una classica immagine bitmap RGB24 nel codice C dell'immagine in GRAY8 (scala di grigi ad 8 bit) ed RGB565, operazione utile per chi lavora con display grafici e microcontrollori.

Image

http://www.atomwave.com/fpga/ImageConverterV0.1.zip (richiede .NET Framework 4.0)

Il programma è semplice e se qualcuno necessitasse dei sorgenti per personalizzarlo o aggiungere altri formati non si faccia scrupolo di contattarmi.

Leonardo