Exibição eficiente de texto / gráficos simples no LCD colorido da ARM

12

Ao projetar um dispositivo baseado em ARM que deve exibir gráficos simples em um LCD colorido, como melhor projetar coisas para permitir atualizações rápidas, de preferência sem estar vinculado a um fornecedor específico de ARM ou LCD? Meu projeto atual usa um monitor em preto-e-branco que pode ser acionado rapidamente por uma porta SPI em um PIC (redesenhando um monitor complexo em 1/60 de segundo). Parece que os displays LCD coloridos comuns têm uma porta SPI, mas mesmo preenchendo um LCD de 160x120 com uma cor sólida levaria 30ms e um 320x240 demoraria 120ms na melhor das hipóteses (clock de mudança de 10MHz).

Se alguém poupasse os pinos do controlador, o modo paralelo poderia ser melhor, mas não conheço nenhum meio independente de família de conectar a interface paralela sem exigir três instruções separadas de armazenamento de memória para cada pixel (um para definir os dados, uma para ajustar a saída do relógio para alta e outra para diminuir a velocidade do relógio). Alguns chips ARM têm interfaces de barramento de memória, mas geralmente querem fazer coisas como endereço e dados multiplex ou comprometer muitos pinos para gerar bits de endereço irrelevantes (o LCD precisaria apenas de um bit de endereço).

Observando o ILI9320 da ILITEK ou o HD66789 da Renesas, uma abordagem que pareceria interessante seria usar um CPLD para converter SPI em dados paralelos e incluir um modo que produzisse um pixel por bit. Observando a planilha de dados da Renesas, pode ser possível obter gravações de pixel por bit com hardware mínimo (sem necessidade de CPLD), fazendo com que todos os bits de dados da porta paralela rastreiem o pino de dados seriais, usando o modo serial para tudo, menos o pixel grava e usa as funções de comparação / máscara para que os pixels com todos os zeros sejam transparentes e os pixels com todos os bits definam bits selecionados no GRAM, ou os pixels com todos os pixels sejam transparentes e os pixels com todos os zeros limpem os bits selecionados. A seção "recursos" da folha de dados do IKITEK sugere que ele possui funcionalidade semelhante, mas os mapas de registro não

Supondo que o código mostre principalmente texto e gráficos em cores sólidas, a abordagem ideal parece usar um CPLD para fazer a interface entre a porta SPI do ARM e a porta paralela do monitor e permitir que o CPLD seja carregado com cores de primeiro plano / plano de fundo. Isso seria especialmente bom se houvesse um meio de escrever pixels "transparentes". Dada uma fonte como um bitmap de duas cores, pode-se simplesmente carregar os dados da fonte diretamente na porta SPI; isso permitiria que os dados da fonte fossem mostrados a uma taxa de um pixel a cada dois relógios ARM. Por outro lado, um CPLD suficiente para lidar com essa tarefa de controle de exibição custaria cerca de US $ 2.

Qual é a melhor maneira de fazer a interface de um ARM com um LCD colorido, se o objetivo é mostrar principalmente texto em cores sólidas ou gráficos simples (por exemplo, 16 cores ou 64 cores)?

Editar

Realizei muitos projetos de telas de LCD, com muitos tipos de LCDs, incluindo LCDs no modo de caracteres, segmento multiplexado personalizado 3: 1, usando meu próprio método de unidade, LCDs gráficos em preto e branco com controladores embutidos e preto e preto e branco. LCDs brancos para os quais eu projetei meu próprio controlador baseado em CPLD para fazer interface com o DMA de uso geral de um microcontrolador (fornecendo até quatro níveis de escala de cinza). Eu me orgulho de fazer exibições compactas. Um dos controladores gráficos era um cão que exigia cerca de 1/10 de segundo para uma atualização em tela cheia, mesmo ao gravar dados constantes, mas a maioria dos meus monitores pode renderizar até uma imagem bastante complexa em menos de 1/50 segundo.

Muitos dos projetos que realizo são movidos a bateria; portanto, o consumo atual é um problema. O controlador de exibição baseado em DMA funcionou muito bem, mas era para um projeto alimentado por linha. Acredito que a única maneira de obter uma corrente razoável de um LCD gráfico é usar um controlador que combine o buffer de exibição e os drivers da coluna. O envio de muita exibição entre chips de cada quadro gastaria muita energia, mesmo em uma única exibição de bit por pixel; em uma tela colorida com dezesseis bits por pixel, seria muito pior.

Eu só comecei a olhar para as folhas de dados do LCD colorido; muitos monitores parecem usar um controlador semelhante ao ILITEK ILI9320, embora todas as folhas de dados que encontrei para os controladores com base nesse design geral tenham sido marcadas como "preliminares". Alguns, como o ILITEK, afirmam ter recursos de máscara e transparência, mas não listam nenhum registro para eles; Não sei se os chips reais têm esses recursos, mas as folhas de dados "preliminares" deixaram de incluí-los ou se os omitiram, mas se esqueceram de mencionar a menção deles. Se na prática todos esses chips tiverem recursos de transparência, seria razoável projetá-los; se não, não.

Eu esperaria que, para a maioria dos projetos, uma tela típica consistisse em texto colocado arbitrariamente em número moderado de fontes de cores sólidas de tamanho arbitrário. As fontes provavelmente seriam armazenadas como dados de bit por pixel. Usando um Cortex-M3, se eu quisesse gravar a tela com dados paralelos, o "loop interno" do código para escrever dois pixels provavelmente terminaria algo como:

  rol r0, r0, # 2; Obter um bit em C, o outro em N
  itcs
  strhcs r1, [r3, # DATA_OFS]; Gravar dados
  strhcc r2, [r3, # DATA_OFS]; Gravar dados
  strb r4, [r3, # CLOCK_SET_OFS]; Definir relógio alto
  strb r4, [r3, # CLOCK_CLR_OFS]; Definir relógio baixo
  itmi
  strhmi r1, [r3, # DATA_OFS]; Gravar dados
  strhpl r2, [r3, # DATA_OFS]; Gravar dados
  strb r4, [r3, # CLOCK_SET_OFS]; Definir relógio alto
  strb r4, [r3, # CLOCK_CLR_OFS]; Definir relógio baixo

Não é exatamente a coisa mais rápida do mundo. Eliminar as gravações nas instruções de ajuste / limpeza do relógio ajudaria. Meu palpite seria que não existe uma maneira agradável e independente da arquitetura de eliminar as duas gravações de clock, mas pode haver uma maneira bastante comum que permita a eliminação de uma (por exemplo, muitos chips podem ter um contador / PWM que pode ser feito para pulsar uma saída brevemente em resposta a uma única operação de armazenamento de memória).

Usar a porta SPI e adicionar hardware ao clock de um pixel por bit aceleraria bastante o acesso à tela. Se estiver usando uma exibição sem mascaramento e transparência, o CPLD precisará incluir um contador de endereços e, para cada pixel, registre uma palavra de dados em pixels ou um comando set-address para a posição do pixel a seguir (para a qual seria necessário um contador ) Por outro lado, se um monitor tivesse mascaramento e transparência, tudo o que eu precisaria seria permitir que o CPLD suportasse um modo em que, depois de registrar o clock em 16 bits, cada bit adicional registrasse uma palavra de dados no monitor com o LSB rastreando o pino SDI (talvez nem seja necessário usar um CPLD - apenas alguns chips lógicos normais). Eu definiria a cor da transparência como a cor que eu quero escrever, mas com o LSB invertido.

Não quero criar um design bonito que dependa de máscara e transparência e depois descobrir que os únicos monitores com esses recursos têm um prazo de entrega de 30 semanas. Por outro lado, se tais monitores estiverem disponíveis e permanecerem amplamente disponíveis em muitos fornecedores, não quero que a paranóia sobre a disponibilidade me leve a usar um design inferior.

supercat
fonte
1
Não é uma resposta, pois seus requisitos incluem não estar vinculado a um fornecedor específico de ARM, mas a família de microcontroladores LPC LH754xx inclui um driver de LCD integrado.
Kevin Vermeer
@reemrevnivek: Existem vários chips ARM com pequenos drivers de LCD; Não consigo imaginar nenhum chip com um driver adequado para exibição de gráficos de tamanho útil que apareça em um pacote que seria utilizável em outra coisa senão em um cenário de chip-on-glass. Um chip pode ter um controlador, mas um LCD com um controlador de chip em vidro pareceria mais eficiente em termos de energia e mais fácil de trabalhar. Vou verificar o chip que você mencionou - pode ser interessante.
Supercat
@ supercat - Estou pensando em LCDs que possuem uma interface RGB: linhas de controle de clock de pixel, sincronização de quadro e sincronização de linha, com um barramento de dados de pixel paralelo. Você espera usar um monitor controlado por COG?
Kevin Vermeer
1
@reemrevnivek: Era o que eu estava pensando. Eles parecem bastante comuns, pois são usados ​​em muitos dispositivos portáteis alimentados por bateria, como telefones celulares. Um monitor COG com controlador embutido será muito mais eficiente em termos de energia do que aquele que requer dados RGB com clock contínuo.
Supercat
@reemrevnivek: Acabei de atualizar minha pergunta com mais detalhes.
Supercat

Respostas:

7

O problema com o uso de um microcontrolador para acionar um LCD é que ele requer atenção constante. Isso pode ser mitigado com um CPLD direcionado por SPI (usando DMA, é claro), mas você enfrenta o outro problema: os LCDs coloridos exigem muitoDe dados. 320x240 em preto e branco é marginal em 9,6 KB, mas use cores de 24 bits e, de repente, você precisará fornecer 230 KB de dados em 1/60 de segundo. (Não esqueça, porém, que você pode obter um controle de 4 bits e 16 cores apenas vinculando os baixos 20 bits a uma configuração). Um buffer de quadro de 24 bits não se encaixa mais na RAM integrada na maioria dos microcontroladores, e você provavelmente não tem tempo para ler de um chip de RAM externo, registrar os dados e ainda fazer outro processamento. Tentar fazer isso com um CPLD (ou um FPGA) e um chip de memória RAM supera o preço de US $ 2 que o impediu de responder à sua pergunta.

A solução tradicional para a interface de um microcontrolador com um LCD colorido é um controlador de tela como um SSD1963. Aqui está um diagrama de blocos muito simples:

MCU para RAM buffer e registros, e daí para a interface LCD

Entrada paralela para um grande buffer de quadro de RAM (tradução: mais de US $ 2) em interface com uma interface LCD paralela configurável por registro. A entrada paralela é geralmente compatível com uma interface de barramento de memória.

O mercado de LCD colorido nem sempre é fácil de encontrar na web, geralmente sendo apenas domínio de OEMs, com o restante comprando displays de empresas que integram o controlador ao display. O melhor recurso que encontrei foi o Crystal Fontz, especificamente esta página sobre a escolha de LCDs gráficos . Role até a parte inferior dos controladores, que incluem as seguintes opções (nota: nem todos são controladores de cores):

  • Epson S1D13521B01 E Tinteiro compacto (1 módulo)
  • Epson S1D13700 (11 módulos)
  • Compatível com Epson SED1520 (8 módulos)
  • Himax HX8345 compatível (1 módulo)
  • Compatível com ILITek ILI9325 (3 módulos)
  • KS0107 / KS0108 Compatível (26 módulos)
  • Novatek NT7534 (14 módulos)
  • Orise Technology OTM2201A (1 módulo)
  • Orise Technology SPFD5420A (1 módulo)
  • RAiO RA8835 (1 módulo)
  • Sanyo LC7981 (13 módulos)
  • Sino Wealth SH1101A (2 módulos)
  • Sitronix ST7920 (29 módulos)
  • Solomon SSD1303 (1 módulo)
  • Solomon SSD1305 (9 módulos)
  • Solomon SSD1325 (2 módulos)
  • Solomon SSD1332 (1 módulo)
  • Solomon SSD2119 (2 módulos)
  • ST STV8105 (1 módulo)
  • Toshiba T6963 (23 módulos)
Kevin Vermeer
fonte
@reemrevnivek: Eu estava pensando em LCDs coloridos com controladores embutidos. Eles parecem bastante comuns, mas os que eu vi geralmente parecem esperar que a CPU registre muitos bits por pixel, mesmo que um cenário de exibição comum seja a exibição de texto em cores sólidas. Implementei uma vez um controlador LCD em escala de cinza de 4 níveis baseado em DMA, usando um CPLD, e funcionou muito bem, mas era um dispositivo alimentado por linha.
Supercat
1
@supercat - Poucos controladores de LCD esperam um CPU muitos bits por pixel em cada quadro. Eles geralmente esperam que o hardware gráfico dedicado faça isso. Basicamente, quando você obtém telas RGB razoavelmente grandes (ou seja,> 128 * 128), o poder de processamento necessário para gerar a imagem para a tela é grande o suficiente para que uma GPU dedicada de algum tipo (mesmo que esteja integrada ao MCU) seja praticamente sempre presente.
Connor Wolf
1
@ supercat - Mas o que você descreve, um CPLD especializado que faz ASCII para conversões rasterizadas, basicamente é um hardware gráfico especializado (personalizado) . Basicamente, estou dizendo que não reinvente a roda, e provavelmente é mais fácil e mais econômico comprar apenas um MCU com uma interface de vídeo integrada e depois projetá-lo você mesmo.
Connor Wolf
1
De qualquer forma, se você realmente quiser criar o seu próprio, eu diria que use um par de ICs SRAM de duas portas e use uma porta para enviar para o LCD e a outra para o MCU. Isso permite que o MCU altere o conteúdo da memória na velocidade que desejar, e o LCD pode funcionar na sua taxa de atualização.
Connor Wolf
1
@ Nome falso: Não seria ASCII para conversão de varredura. Seria basicamente a conversão de bit por pixel em multibit por pixel. Acho que você está entendendo mal o que estou vendo. Não estou procurando monitores que possuem apenas drivers , mas outros que incluem drivers e controladores ; portanto, eles só precisam receber dados quando as coisas na tela mudarem.
supercat