Visualizzazione efficiente di testo / grafica semplice su LCD a colori tramite ARM


12

Quando si progetta un dispositivo basato su ARM che dovrebbe visualizzare una grafica semplice su un LCD a colori, come si dovrebbe fare meglio a progettare le cose per consentire aggiornamenti rapidi, preferibilmente senza essere legati a un particolare fornitore ARM o LCD? Il mio progetto attuale utilizza un display in bianco e nero che può essere guidato alla velocità della luce da una porta SPI su un PIC (ridisegnando un display complesso in 1/60 di secondo). Sembra che i comuni display LCD a colori abbiano una porta SPI, ma anche riempire un LCD 160x120 con un colore solido richiederebbe 30ms e un 320x240 richiederebbe 120ms nella migliore delle ipotesi (10MHz shift clock).

Se uno potesse risparmiare i pin del controller, la modalità parallela potrebbe essere migliore, ma non conosco alcun mezzo indipendente dalla famiglia per collegare l'interfaccia parallela senza richiedere tre istruzioni separate per l'archiviazione della memoria per ciascun pixel (uno per impostare i dati, uno per impostare l'uscita del clock alta e uno per abbassarla). Alcuni chip ARM hanno interfacce bus di memoria, ma spesso vogliono fare cose come indirizzo multiplex e dati, o impegnare molti pin per produrre bit di indirizzo irrilevanti (il display LCD avrebbe bisogno solo di un bit di indirizzo).

Osservando ILI9320 di ILITEK o HD66789 di Renesas, un approccio che sembrerebbe interessante sarebbe quello di utilizzare un CPLD per convertire SPI in dati paralleli e includere una modalità che generasse un pixel per bit. Guardando la scheda tecnica Renesas, potrebbe essere possibile ottenere scritture pixel per bit con hardware minimo (non è richiesto CPLD) facendo in modo che tutti i bit di dati della porta parallela seguano il pin dei dati seriali, usando la modalità seriale per tutto tranne che per i pixel scrive e usando le funzioni di confronto / maschera in modo che i pixel di tutti gli zero siano trasparenti e che i pixel di tutti gli uni impostino i bit selezionati in GRAM, oppure i pixel di tutti gli uni siano trasparenti e i pixel di tutti gli zero cancellino i bit selezionati. La sezione "caratteristiche" della scheda tecnica IKITEK suggerisce che ha funzionalità simili, ma le mappe del registro non

Supponendo che il codice mostrerà principalmente testo e grafica a colori solidi, l'approccio ideale sembrerebbe quello di utilizzare un CPLD per interfacciare la porta SPI di ARM alla porta parallela del display e consentire al CPLD di essere caricato con i colori di primo piano / sfondo. Ciò sarebbe particolarmente bello se si avesse un mezzo per scrivere pixel "trasparenti". Dato un carattere come bitmap a due colori, si potrebbe semplicemente caricare i dati del carattere direttamente nella porta SPI; ciò consentirebbe di visualizzare i dati dei caratteri a una velocità di un pixel ogni due orologi ARM. D'altra parte, un CPLD sufficiente a gestire un'attività di controllo del display costerebbe circa $ 2.

Qual è il modo migliore per interfacciare un ARM con un LCD a colori, se l'obiettivo è principalmente quello di mostrare testo a tinta unita o grafica semplice (ad es. 16 colori o 64 colori)?

modificare

Ho realizzato molti progetti di display LCD, con molti tipi di LCD, tra cui LCD in modalità carattere, segmenti multipli 3: 1 personalizzati basati sul mio metodo di guida, LCD grafici in bianco e nero con controller integrati e in bianco e nero LCD bianchi per i quali ho progettato il mio controller basato su CPLD per interfacciarsi con un DMA per uso generale di un microcontrollore (fornendo anche una scala di grigi a quattro livelli). Sono orgoglioso di rendere i display zippy. Uno dei controller grafici era un po 'un cane che richiedeva circa 1/10 di secondo per un aggiornamento a schermo intero anche quando scrivevo dati costanti, ma la maggior parte dei miei display è in grado di riprodurre anche un'immagine abbastanza complessa in meno di 1/50 di secondo.

Molti dei progetti che faccio sono alimentati a batteria, quindi l'attuale assorbimento è un problema. Il controller del display basato su DMA che ho fatto ha funzionato bene, ma era per un progetto basato sulla linea. Credo che l'unico modo per ottenere un ragionevole assorbimento di corrente da un LCD grafico sia utilizzare un controller che combina il buffer di visualizzazione e i driver di colonna. Inviare un sacco di display tra i chip per ogni frame sprecherebbe molta energia anche su un singolo display bit per pixel; su un display a colori con sedici bit per pixel, sarebbe molto peggio.

Ho iniziato a guardare solo le schede tecniche LCD a colori; molti display sembrano utilizzare un controller simile a ILITEK ILI9320, sebbene tutte le schede tecniche che ho trovato per controller basati su quel design generale siano state contrassegnate come "preliminari". Alcuni come ILITEK affermano di avere funzionalità di mascheramento e trasparenza ma non elencano alcun registro per loro; Non so se i chip reali abbiano tali caratteristiche, ma le schede "preliminari" non sono state incluse o se hanno omesso le funzionalità ma si sono dimenticate di menzionarle. Se in pratica tutti questi chip hanno caratteristiche di trasparenza, sembrerebbe ragionevole progettare per loro; se no, no.

Mi aspetto che per la maggior parte dei progetti uno schermo tipico sia costituito da testo posizionato in modo arbitrario in un numero moderato di caratteri a colori solidi di dimensioni arbitrarie. Molto probabilmente i caratteri verrebbero archiviati come dati bit per pixel. Usando un Cortex-M3, se volessi scrivere il display con dati paralleli, il "loop interno" del codice per scrivere due pixel probabilmente finirebbe con qualcosa del tipo:

  rol r0, r0, # 2; Prendi un bit in C, l'altro in N
  ITC
  strhcs r1, [r3, # DATA_OFS]; Scrivi dati
  strhcc r2, [r3, # DATA_OFS]; Scrivi dati
  strb r4, [r3, # CLOCK_SET_OFS]; Imposta l'orologio alto
  strb r4, [r3, # CLOCK_CLR_OFS]; Imposta l'orologio basso
  ITMI
  strhmi r1, [r3, # DATA_OFS]; Scrivi dati
  strhpl r2, [r3, # DATA_OFS]; Scrivi dati
  strb r4, [r3, # CLOCK_SET_OFS]; Imposta l'orologio alto
  strb r4, [r3, # CLOCK_CLR_OFS]; Imposta l'orologio basso

Non è esattamente la cosa più veloce del mondo. Eliminare le scritture alle istruzioni di impostazione / cancellazione dell'orologio sarebbe di aiuto. La mia ipotesi sarebbe che non esiste un buon modo indipendente dall'architettura per eliminare entrambe le scritture di clock, ma potrebbe esserci un modo abbastanza comune che consentirebbe di eliminarne uno (ad esempio molti chip potrebbero avere un contatore / PWM che potrebbe essere fatto per impulsare un'uscita brevemente in risposta a una singola operazione di memorizzazione in memoria).

L'uso della porta SPI e l'aggiunta di hardware per il clock di un pixel per bit accelererebbe notevolmente l'accesso al display. Se si utilizza un display senza mascheramento e trasparenza, il CPLD dovrebbe includere un contatore di indirizzi e per ogni pixel eseguire il clock di una parola di dati pixel oppure un comando set-address per la posizione del pixel seguente (per la quale sarebbe necessario un contatore ). Al contrario, se un display avesse mascheramento e trasparenza, tutto ciò che dovrei fare sarebbe avere il CPLD in grado di supportare una modalità in cui, dopo che aveva avuto un clock di 16 bit, ogni bit aggiuntivo avrebbe sincronizzato una parola di dati sul display con il LSB che traccia il pin SDI (potrebbe non essere nemmeno necessario utilizzare un CPLD - solo alcuni normali chip logici). Vorrei impostare il colore della trasparenza sul colore che voglio scrivere ma con LSB capovolto.

Non voglio inventare un bellissimo design che si basi su mascheramento e trasparenza e poi scoprire che gli unici display con tali caratteristiche hanno un tempo di consegna di 30 settimane. D'altra parte, se tali display sono adatti e rimangono ampiamente disponibili da molti fornitori, non voglio lasciare che la paranoia sulla disponibilità mi spinga a utilizzare un design inferiore.


1
Non è una risposta poiché le vostre esigenze includono il fatto di non essere legate a un fornitore ARM specifico, ma la famiglia di microcontrollori LPC LH754xx include un driver LCD integrato.
Kevin Vermeer,

@reemrevnivek: Esistono numerosi chip ARM con piccoli driver LCD; Non riesco a immaginare che un chip con un driver adatto a qualsiasi display grafico di dimensioni utili appaia in un pacchetto che sarebbe utilizzabile in qualcosa di diverso da uno scenario chip-on-glass. Un chip potrebbe avere un controller, ma un LCD con un controller chip-on-glass sembrerebbe più efficiente dal punto di vista energetico e più facile da lavorare. Vedrò il chip che hai citato, però - potrebbe essere interessante.
supercat,

@supercat - Sto pensando a LCD che hanno un'interfaccia RGB: pixel clock, sincronizzazione dei frame e linee di controllo della sincronizzazione delle linee, con un bus dati pixel parallelo. Ti aspetti di utilizzare un display controllato da COG?
Kevin Vermeer,

1
@reemrevnivek: è quello che stavo pensando. Sembrano essere abbastanza comuni, dal momento che sono utilizzati in molti dispositivi portatili alimentati a batteria come i telefoni cellulari. Un display COG con controller integrato sarà molto più efficiente dal punto di vista energetico rispetto a quello che richiede dati RGB con clock continuo.
supercat

@reemrevnivek: ho appena aggiornato la mia domanda con maggiori dettagli.
supercat,

Risposte:


7

Il problema con l'uso di un microcontrollore per guidare un LCD è che un LCD richiede un'attenzione costante. Questo può essere mitigato con un CPLD basato su SPI (usando DMA, ovviamente), ma poi si incontra un altro problema: gli LCD a colori richiedono moltodi dati. 320x240 in bianco e nero è marginale a 9.6 KB, ma lo rende a 24 bit a colori e improvvisamente è necessario fornire 230 KB di dati in 1/60 di secondo. (Non dimenticare, tuttavia, che puoi ottenere un controllo a 4 bit e 16 colori semplicemente legando i 20 bit bassi a un'impostazione). Un buffer di frame a 24 bit non si adatta più alla RAM integrata sulla maggior parte dei microcontrollori e probabilmente non hai il tempo di leggere da un chip RAM esterno, sincronizzare i dati e fare ancora altre elaborazioni. Provare a farlo con un CPLD (o un FPGA) e un chip RAM ti porta ben oltre il prezzo di $ 2 che ti ha fatto rimbalzare nella tua domanda.

La soluzione tradizionale per interfacciare un microcontrollore con un LCD a colori è un controller di visualizzazione come un SSD1963. Ecco uno schema a blocchi molto semplice:

Buffer e registri da MCU a RAM, quindi da interfaccia LCD

Ingresso parallelo a un buffer di frame RAM di grandi dimensioni (traduzione: più di $ 2) interfacciato con un'interfaccia LCD parallela configurabile nel registro. L'ingresso parallelo è generalmente compatibile con un'interfaccia del bus di memoria.

Il mercato dei display LCD a colori non è sempre facile da trovare sul Web, di solito è solo dominio degli OEM, mentre il resto acquista display da aziende che integrano il controller con il display. La migliore risorsa che ho trovato è stata Crystal Fontz, in particolare questa pagina sulla scelta degli LCD grafici . Scorri verso il basso per i controller, che includono le seguenti opzioni (nota: non tutti sono controller di colore):

  • Epson S1D13521B01 E Inksheet (1 modulo)
  • Epson S1D13700 (11 moduli)
  • Compatibile Epson SED1520 (8 moduli)
  • Compatibile con Himax HX8345 (1 modulo)
  • Compatibile ILITek ILI9325 (3 moduli)
  • Compatibile KS0107 / KS0108 (26 moduli)
  • Novatek NT7534 (14 moduli)
  • Orise Technology OTM2201A (1 modulo)
  • Orise Technology SPFD5420A (1 modulo)
  • RAiO RA8835 (1 modulo)
  • Sanyo LC7981 (13 moduli)
  • Sino Wealth SH1101A (2 moduli)
  • Sitronix ST7920 (29 moduli)
  • Solomon SSD1303 (1 modulo)
  • Solomon SSD1305 (9 moduli)
  • Solomon SSD1325 (2 moduli)
  • Solomon SSD1332 (1 modulo)
  • Solomon SSD2119 (2 moduli)
  • ST STV8105 (1 modulo)
  • Toshiba T6963 (23 moduli)

@reemrevnivek: avevo pensato agli LCD a colori con controller integrati. Sembrano piuttosto comuni, ma quelli che ho visto in genere sembrano aspettarsi che la CPU esegua il clock in molti bit per pixel anche se uno scenario di visualizzazione comune è la visualizzazione di testo a colori. Ho implementato un controller LCD in scala di grigi a 4 livelli basato su DMA una volta usando un CPLD, e ha funzionato molto bene, ma era un dispositivo alimentato da linea.
supercat

1
@supercat - Pochissimi controller LCD si aspettano che una CPU esegua il clock di molti bit per pixel per ciascun frame. In genere si aspettano che l' hardware grafico dedicato lo faccia. Fondamentalmente, una volta che si arriva a display RGB abbastanza grandi (ovvero> 128 * 128), la potenza di elaborazione richiesta per generare l'immagine per lo schermo è abbastanza grande che una GPU dedicata di qualche tipo (anche se integrata nell'MCU) è praticamente sempre presente.
Connor Wolf,

1
@supercat - Ma quello che descrivi, un CPLD specializzato che fa ASCII per conversioni raster, fondamentalmente è un hardware grafico (personalizzato) specializzato . In pratica sto dicendo di non reinventare la ruota, ed è probabilmente più facile ed economico acquistare un MCU con un'interfaccia video integrata e progettarne uno da soli.
Connor Wolf,

1
Ad ogni modo, se vuoi davvero creare il tuo, direi di usare un paio di circuiti integrati SRAM a doppia porta e utilizzare una porta per l'output sul display LCD e l'altra per l'MCU. Ciò consente all'MCU di modificare il contenuto della memoria alla velocità desiderata e il display LCD può funzionare alla frequenza di aggiornamento.
Connor Wolf,

1
@Fake Name: non sarebbe ASCII alla conversione raster. Fondamentalmente sarebbe una conversione da bit per pixel a multibit per pixel. Penso che tu abbia frainteso quello che sto guardando. Non sto cercando display che hanno solo driver , ma quelli che includono driver e controller , quindi devono solo essere dati i dati quando le cose sullo schermo cambiano.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.