“Low Cost Controllerless” con PIC32

Sul blog di Elettronica Open Source puoi leggere non solo tutti gli articoli Premium riservati agli abbonati Platinum 2.0 e inseriti nella rivista Firmware 2.0 (insieme ad articoli tecnici, progetti, approfondimenti, news, tutorial a puntate e molto altro) ma anche gli articoli della Rubrica Firmware Reload. In questa Rubrica del blog abbiamo raccolto gli articoli tecnici della vecchia rivista cartacea Firmware, che contengono argomenti e temi evergreen per Professionisti, Makers, Hobbisti e Appassionati di elettronica. La richiesta di soluzioni grafiche embedded aumenta ogni giorno di più e soprattutto si differenziano i campi applicativi che le richiedono. E come sempre avviene in questi casi, di pari passo cresce l’esigenza di diminuire i costi di ciascuna di esse, e le implementazioni LCC o “Low Cost Controllerless” rappresentano una valida soluzione.

Introduzione

Oggi come oggi molte aziende ed industrie offrono soluzioni che sono basate su controllori grafici interni oppure soluzioni esterne che vengono a far parte di un sistema funzionalmente completo. Questo vuol dire che è più probabile che sia il progetto sia il costo diventino più onerosi. Queste soluzioni di solito sono basate su interfacce grafiche per l’utente, le cosiddette GUI (Graphical User Interface). Proprio in queste “occasioni” stanno facendo la loro comparsa soluzioni che non usano un controller ma che adoperano un microcontrollore. Si ricorre, dunque, all’impiego di una MCU, MicroController Unit, per creare un componente grafico “virtuale”, per così dire, che effettui operazioni di rendering senza tenere impegnata la CPU per tanto tempo, ovvero per tanti cicli. Un esempio può essere un impiego inferiore rispetto al 5%. La soluzione PICtail Plus è una scheda disegnata per mostrare un caso applicato di una tecnica differente impiegata da Microchip a partire da uno starter kit per PIC32. Quello che faremo oggi sarà descriverla e scoprire la sua implementazione. Per farlo, però, sarà necessario ribadire alcune definizioni fondamentali:

  • Pixel - un punto della matrice di un LCD
  • Refresh rate - misurato in Hertz, rappresenta il tasso di aggiornamento di riscrittura del frame su LCD
  • Risoluzione - numero di pixel contenuti all’interno di una matrice bidimensionale. Un LCD QVGA contiene 320 × 240 pixel. La prima delle due dimensioni è, per convenzione, quella orizzontale
  • Pixel clock (PCLK) - riferito al segnale di sincronizzazione del campionamento dei dati in ingresso all’LCD, deve essere sempre più veloce se si vogliono ottenere migliori soluzioni
  • Frame Buffer - memoria volatile all’interno della quale viene memorizzato il dato inerente al colore con lo scopo di aggiornare la visualizzazione
  • Pixel Throughput - velocità alla quale un pixel può essere ridipinto. Il tempo di rappresentazione dell’intero frame sarà il prodotto tra il pixel throughput e la risoluzione
  • Profondità di colore - definisce il numero di possibili colori che un pixel può assumere. Comunemente rappresentata in bit, il suo valore tipico è 16

IMPOSTIAMO IL SISTEMA

In linea generale, un sistema come quello che stiamo descrivendo ha bisogno di inviare l’informazione, ovvero il frame, per mostrare l’immagine ad una certa frequenza. Il refresh rate è, infatti, come abbiamo già ribadito, una figura di merito fondamentale. Tipicamente il suo valore è pari a 60 Hz e per svolgere il suo compito il sistema deve provvedere ad un invio costante dei dati al pannello LCD. Ad un primo sguardo, sembra quasi che questo compito venga svolto assorbendo tutte le risorse del microcontrollore ma questo non è del tutto vero perché tutti i microcontrollori, PIC32, che contengono il DMA, ovvero la periferica per l’accesso diretto alla memoria (Direct Memory Access) possono impiegare fino ad un massimo del 5% del tempo del processore. Questo vuol dire che tutte le MCU PIC32 devono avere il DMA embedded. La periferica in oggetto può trasferire dati da una locazione ad un’altra senza che sia richiesto l’intervento del processore. Nel metodo controllerless, il DMA è impostato in maniera tale che trasferisca una intera linea di dati del frame attraverso la Parallel Master Port (PMP). Naturalmente, ciascuna linea di dati sarà costituita dal valore relativo a più pixel. Il DMA invierà una porzione del frame buffer durante la trasmissione. Il PMP, o in alternativa un timer, verrà utilizzato per l’azione di trigger del trasferimento, necessaria per scandire che lo stesso è stato completato. Nei dispositivi PIC32 con interrupt non persistenti viene utilizzato un timer come DMA trigger source. Durante il trasferimento il PMP produce un segnale di lettura-scrittura che, in verità, segnala la fine di ogni trasferimento. Esso funziona come un segnale di clock per il display. Dopo che ciascuna linea di dati è stata trasferita, la CPU riceve l’istruzione di fermarsi direttamente dal DMA ed alcuni segnali di temporizzazione (HSYNC, VSYNC e così via dicendo), necessari per il funzionamento dei display LCD, vengono aggiornati. Questo processo viene ripetuto continuativamente fino a quando l’intero frame è stato rappresentato. Il frame viene memorizzato in una memoria volatile in maniera tale che l’immagine possa essere dinamica. In questo setup il tipo di memoria utilizzato è SRAM e questa configurazione è quella di base per i sistemi di cui stiamo trattando. L’intero sistema può essere impostato per utilizzare memorie SRAM interne oppure esterne. Il suo diagramma viene mostrato nelle Figure 1 e 2.

Figura 1: Utilizzo della SRAM esterna e delle line dati PMP in DMA per la popolazione dei pixel dell’LCD

Figura 1: Utilizzo della SRAM esterna e delle linee dati PMP in DMA per la popolazione dei pixel dell’LCD

 

Figura 2: Uso della SRAM interna per l’accesso DMA del display

Figura 2: Uso della SRAM interna per l’accesso DMA del display

La mappatura dei colori su un display LCD TFT viene realizzata tramite l’utilizzo di PMP data lines. A seconda del formato del colore utilizzato, le 16 PMP data lines possono essere configurate in maniera tale da trasmettere l’informazione sul colore. Quando si utilizza la modalità 8 BPP, soltanto 8 data lines sono richieste. Quando si utilizza la memoria esterna per un 16 BPP, è possibile utilizzare anche 8 data lines ed in questo caso quelle sulla memoria esterna sono ancora rappresentate sull’LCD in modalità 16 BPP. Le MCU PIC32 si connettono alla memoria attraverso 8 bit; quando è necessario che venga eseguita un’operazione di scrittura, il microcontrollore può utilizzare byte pin alti o bassi direttamente sulla memoria esterna per inviare i valori alla SRAM. Esistono diversi esempi di queste routine ed il codice che implementa queste operazioni deve essere scritto in maniera tale da rispettare alcuni passi concettuali:

  • definizione del metodo di controllo
  • impostazione dell’indirizzo
  • apertura del canale DMA
  • impostare l’evento di controllo per il trasferimento
  • impostare i parametri per il trasferimento
  • impostare la priorità dell’operazione
  • abilitare il trasferimento
  • abilitare l’interrupt sul controller
  • abilitare il canale DMA
  • iniziare il trasferimento

Il codice che implementa questi passi è davvero semplice come sembra, e pertanto viene utilizzato per dimostrare quanto possa essere elementare preparare il sistema controllerless.

I TFT E GLI LCD

Ci sono davvero tantissimi tipi di LCD differenti in commercio, basati su diverse tecnologie e che naturalmente contano al loro attivo tanti pregi e qualche difetto. Come sempre, la scelta della tecnologia rappresenta il vero valore aggiunto di un progetto. Il metodo di cui stiamo parlando è stato progettato esplicitamente per lavorare con le soluzioni a film sottile (Thin-Film Transistor). Ciò nondimeno, però, è anche possibile un impiego con CSTN e MSTN, salvo alcune modifiche non particolarmente complicate o dispendiose in termini di tempo e risorse. Nella Figura 3 possiamo osservare un’immagine esplicativa dei segnali di clock su un TFT. Come dicevamo in precedenza, i dati che vengono trasferiti rappresentano l’informazione sul colore. La maggior parte dei display LCD possono avere linee di dati da 8 a 24 colori, a seconda della profondità con cui vengono rappresentati.

Figura 3: Rappresentazione grafico-pratica dei segnali fondamentali di sincronismo del display

Figura 3: Rappresentazione grafico-pratica dei segnali fondamentali di sincronismo del display

Tali linee di dati forniscono informazioni su ciascun pixel di cui la riga è costituita. I segnali di clock, HSYNC, VSYNC, DEN e PCLK vengono utilizzati per garantire la sincronizzazione dell’intero frame con l’LCD panel. Le linee di sincronizzazione servono a comunicare l’informazione relativa ai dati e più precisamente se ci si trova all’inizio oppure alla fine di una linea (HSYNC) oppure di un intero frame (VSYNC). DEN, che naturalmente è l’acronimo di Data Enable Line, come il nome suggerisce, rappresenta una linea di controllo di abilitazione che permette all’LCD di venire a conoscenza di quanti dati validi sono stati inviati e possono effettivamente essere rappresentati. È necessario che ci sia questa linea nei TFT perché è necessario un certo tempo per associare a ciascun pixel il suo dato ovvero per collocare il dato nella giusta posizione. Ecco, tra le altre cose, cosa abbiamo visto nella figura precedente. Il logo rappresenta l’area all’interno della quale sono stati ritenuti validi tutti i dati relativi ai pixel e, quindi, la regione all’interno della quale è stato possibile effettuare la visualizzazione. In corrispondenza di queste aree, quindi, DEN era “alto”. I dati vengono inviati una riga per volta fino a quando l’intero frame non viene ricostruito. A questo punto ci rendiamo conto che il segnale PCLK non viene visualizzato ma non per questo è meno importante. Esso, infatti, rappresenta il clock source per l’intero sistema. Tutte le altre linee devono essere sincronizzate a questa, altrimenti non possono funzionare. È anche vero che non tutti i display utilizzano HSYNC, VSYNC e DEN per cui diamo per scontato di riferirci soltanto a questi casi. Le applicazioni grafiche controllerless di cui stiamo parlando possono comunque essere impiegate anche in assenza dei segnali HSYNC e VSYNC. Il driver è impostato in maniera tale da permettere una migliore sincronizzazione; esso ha bisogno di alcuni parametri di temporizzazione per poter funzionare, per esempio la larghezza degli impulsi ed i front e back porch per gli impulsi verticali ed orizzontali. Una volta che questi valori sono stati elaborati dal driver LCC, l’LCD può mostrare l’immagine. Queste costanti possono essere reperite all’interno del datasheet dello specifico LCD in uso. Di solito, i valori vengono espressi in funzione del clock. Queste costanti sono d’aiuto nell’impostare le giuste frequenze in maniera tale da ottenere l’immagine più accurata sul display.

IL FLUSSO DI FUNZIONAMENTO

Nella Figura 4 viene rappresentato quello che possiamo considerare un flowchart; una vera e propria mappa concettuale di quello che succede all’interno di un microcontrollore PIC32 in applicazioni LCC quando il frame viene inviato al display. Il blocco DMA/PMP sta ad indicare che le periferiche DMA e PMP condividono il bus dati con la CPU. Il suo blocco, invece, indica i task richiesti per le operazioni di rendering. L’ISR (Interrupt Service Routine) del DMA rappresenta l’unico codice che deve essere scritto, oltre ad impostare le periferiche DMA e PMP al fine di inviare il frame al display.

Figura 4: Diagramma di flusso dell’iterazione CPU-DMA-PMP

Figura 4: Diagramma di flusso dell’iterazione CPU-DMA-PMP

LA TEMPORIZZAZIONE

Sul funzionamento del sistema, è ovvio, possiamo porci molte domande. Un modo per “instradare” queste domande e renderle “fruttuose” è quello di dare uno sguardo a ciò che viene prodotto a runtime, ovvero quando il sistema è al lavoro. Il primo e più semplice prodotto cui possiamo pensare è il diagramma di temporizzazione. Nelle Figure 5 e 6 ne vengono rappresentati alcuni esempi.

Figura 5: Clock di controllo generato dal PMP strobe

Figura 5: Clock di controllo generato dal PMP strobe

 

Figura 6: Segnale di sincronismo di frame

Figura 6: Segnale di sincronismo di frame

A che serve farli vedere? È semplice: nella prima immagine quello che vediamo è il clock di controllo generato dal PMP strobe (un segnale di lettura o scrittura). Questo è assolutamente indispensabile quando si utilizzano LCD TFT a i PIC32 possono generare segnali di questo tipo con frequenza fino a 15 MHz, più che sufficienti per una risoluzione WQVGA. Tutti i diagrammi di temporizzazione visti si riferiscono ad un clock pari a 13 MHz. La frequenza, però, può essere modificata ed il sistema può rallentare oppure aumentare la velocità con la quale avviene il trasferimento di dati. Memorie come quelle di cui abbiamo parlato, SRAM, possono essere prese in considerazione solamente se supportano questo tipo di clock. Questo segnale può essere visto utilizzando un probe sullo SHIFT test point che è disponibile sulla maggior parte delle schede Microchip dotate di funzionalità grafiche. Nella seconda immagine, la Figura 6, invece, un tipico frame rate. La sua frequenza è di circa 60 Hz, come evidenziato. Anche in questo caso una verifica della frequenza può essere fatta, basta utilizzare il test point FRAME. In altre due Figure, la 7 e la 8, ragioniamo su segnali differenti.

Figura 7: Diagramma dei tempi di ISR con uso di memoria esterna

Figura 7: Diagramma dei tempi di ISR con uso di memoria esterna

 

Figura 8: Diagramma della funzione putpixel

Figura 8: Diagramma della funzione putpixel

Nel primo caso l’ISR timing diagram, in particolare una sua sezione, nel caso di impiego di memoria esterna. Ci sono, ed è evidente, due regioni all’interno delle quali il diagramma si interrompe. Negli istanti di tempo corrispondenti a queste interruzioni, l’ISR sta aggiornando i segnali di temporizzazione dell’LCD. Si tratta dell’unico momento in cui l’LCC richiede l’utilizzo di risorse della CPU e tutto viene gestito tramite DMA. L’intervallo di tempo mostrato nella figura, ed evidenziato in basso, rappresenta la durata della subroutine, ovvero circa 80 colpi di clock. Pertanto, possiamo considerare l’aggiornamento di un display WQVGA alla frequenza di 60 Hz con 272 linee e due interrupt per linea, una soluzione da 2.6 MIPS (cioè 60 × 272 × 2 × 80). Nella Figura 8, invece, viene diagrammato putpixel, una funzione che aggiorna il frame ed è progettata per lavorare su due frame per pixel halt. Il tempo totale richiesto per aggiornare due pixel è di 800 ns. L’utente può modificare il software del monitor in maniera tale da aggiornare questo passo e fare in modo da ottenere una frequenza che abbia una soglia completamente diversa. In pratica, è possibile lavorare per impostare una frequenza di aggiornamento da 50 Hz senza dover richiedere un intervento “aziendale”.

NUOVI PIXEL SULLA SCENA

Nella sostanza, visualizzare nuovi pixel sulla scena è importante esattamente quanto aggiornare la visualizzazione sullo schermo. È un’operazione che viene effettuata tramite la CPU scrivendo nel display buffer. Se il frame è memorizzato su una memoria esterna, il trasferimento tramite DMA è sospeso mentre il frame viene aggiornato. Ciò si rende necessario dal momento che c’è soltanto una periferica PMP che viene condivisa in maniera virtuale col controllo del traffico. Questa metodologia ha effetti sul refresh rate su schermo. Il numero di pixel che vengono aggiornati deve essere monitorato in maniera tale da evitare che ne siano aggiornati troppi contemporaneamente altrimenti succederà che il cambiamento di valore sarà percepito dall’occhio. Non soltanto la frequenza di aggiornamento, dunque, è importante, ma anche il numero. Questa condizione viene garantita utilizzando un conteggio variabile dei pixel all’interno del controller grafico che viene aggiornato ogni volta che si verifica un’operazione di scrittura durante l’interrupt DMA.

L’HARDWARE

Parliamo di una scheda, giusto? Bene, è arrivato il momento di parlare della scheda. Soprattutto descrivendone l’hardware, assemblato, è evidente, rispettando parametri abbastanza precisi in quanto a semplicità e basso costo. L’integrato SRAM da 512 kB viene impiegato solamente se l’applicazione sta utilizzando la scheda sfruttando la memoria esterna. In caso contrario, se è il microcontrollore con la sua memoria ad essere utilizzato, l’integrato citato rimarrà inattivo. A questo punto è indispensabile definire il criterio che ci permette di capire se la memoria serve oppure se ci sarà bisogno di utilizzarla. Questo viene definito dall’equazione per cui dimensione della memoria SRAM = risoluzione dell’immagine (dimensioni orizzontale x dimensione verticale) x profondità del colore (byte di profondità). Qual è il vantaggio? Questa tecnica lascia buona parte della memoria interna libera per eseguire istruzioni di programma e fa in modo di fornire una profondità di rappresentazione 8 bit. Se c’è bisogno di ulteriore memoria ci sono una serie di tipi diversi che possono essere scelti. Una SRAM in parallelo, per esempio, o un qualunque tipo di memoria volatile può essere utilizzata purché sia sufficientemente veloce. E per avere un’idea più chiara di quali siano le connessioni realizzabili, diamo uno sguardo alle informazioni riportate nella comoda Tabella 1.

Tabella 1: Schema esplicativo pin / funzione

Tabella 1: Schema esplicativo pin/funzione

ALL’OPERA

La scheda utilizza la libreria Microchip Graphics Library, un clock piuttosto potente e performante che rende la creazione di una GUI molto più semplice e veloce. Ci sono due modi principali per utilizzare il software con la libreria. Il primo è quello di utilizzare la memoria interna ed in questo caso si utilizza lo strobe di scrittura del PMP come pixel clock. L’altra soluzione è utilizzare la memoria esterna e qui, a dispetto di quanto succeda nel caso precedente, è impiegato lo strobe di lettura. In questa configurazione si ha il 16 BPP (8 nel caso precedente) e viene utilizzata la memoria esterna per l’intero frame (a differenza del caso precedente che impiega memoria interna) che viene letto continuativamente. Viene utilizzato il formato 565 RGB (cioè 5 per il rosso, 6 per il verde e 5 per il blu) mentre nel caso precedente, con 8 bit, si usava il 332, ovvero 3 per il rosso, 3 per il verde e 2 per il blu. In entrambi i metodi, quando si connette l’LCD con più di 16 linee di colori, quelle non utilizzate vengono considerate le più significative dell’ultimo colore utilizzato. Questo garantisce che ci sia una scala di colore completa dal bianco al nero.

IN CONCLUSIONE

Quella vista oggi è un’applicazione piuttosto interessante, promettente ed anche versatile. Molti di noi non hanno mai visto MCU PIC32 così impiegate e probabilmente qualcuno era anche scettico all’idea che potessero funzionare in una simile modalità, ma Microchip è stata in grado ancora una volta di darci conferma della versatilità dei propri microcontrollori.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend