terça-feira, fevereiro 15, 2022

Raspberry Pi Pico: Retomando à Geração de Vídeo Alfanumérico

Muitos meses atrás, eu brinquei um pouco com isso, mas não tive sucesso em gerar vídeo de 80 colunas. Mais ou menos na mesma época, sem que eu soubesse, o pessoal do RC2014 estava trabalhando nisso também e conseguiram gerar um módulo de vídeo para o RC2014. As consequências do Brexit me impediram de comprar essa placa (frete e impostos para a União Europeia subiram muito), mas felizmente o software está disponível no github. Após muita procrastinação, resolvi olhar o código e entender o que foi feito.

Temos uma tela!


O código no repositório está bem confuso e com comentários mínimos. Vou me concentrar aqui na versão de 80 colunas monocromático. O primeiro passo foi conseguir compilar, alguns arquivos precisam ser copiados do sdk da PiPico:

  • pico_sdk_import.cmake de pico-sdk
  • pico_extras_import.cmake de pico-extras
  • fonts.h de pico-playground\scanvideo\textmode

Compilou mas não rodou... hora de arregaçar as mangas, levantar o capô e começar a depurar. No final era um erro bobo, um '<=' onde devia ser '<', o que fazia escrever onde não devia na memória. (Já reportei o erro e já foi corrigido no repositório)

O código foi claramente gerado pela combinação de exemplos do SDK e (provavelmente) trechos de outros programas. Um efeito colateral é a grande quantidade de linhas comentadas e trechos inúteis. O passo seguinte foi tentar limpar isso, para ficar mais fácil de entender. Durante a limpeza aproveitei para comentar um pouco o código.

Alguns comentários:

  • Embora seja monocromático, o hardware é o padrão (capaz de gerar cores com 15 bits).
  • O fonte dos caracteres não tem apenas pontos acesos e apagados, mas usa tons de cinza (o resultado nem sempre é bom) e está armazenado num formato complexo
  • No início da execução o fonte é processado para gerar um formato apropriado para a rotina de display
  • Na memória de vídeo os caracteres 0x20 a 0x7E são armazenados como 0x00 a 0x5E. Os códigos a partir de 0x5F correspondem aos caracteres reversos

Ainda falta limpar muita coisa, mas já ficou bem mais legível. O resultado está no meu github. Ainda não testei a comunicação serial, teclado e as sequências de controle.

O próximo passo é criar uma versão minha, com as seguintes alterações:

  • Mudar o hardware e o software para trabalhar com somente duas cores (branco e preto) ou 16 tons de cinza, para reduzir o número de pinos de I/O usado (pensando em rodar no XIAO RP2040)
  • Trocar o fonte de caracteres por um de duas cores e simplificar o seu pré-processamento
  • Tratar teclado pt-br (aka ABNT2)
  • Rever o código de tratamento dos caracteres recebidos pela serial
  • Rever a implementação de cursor (não está robusta), tentar implementar cursor piscante.


Nenhum comentário: