segunda-feira, 27 de abril de 2015

Tic Tac X

Este projeto começou há alguns meses atrás, precisamente em 31/12/2014, como um passatempo em meu último dia de férias.

Eu havia ouvido falar de alguns falsos positivos/negativos em monitores testados usando os TIC TACs do Victor e do Luciano e fiquei pensando comigo mesmo se tais falsos resultados não seriam devidos ao sinais de vídeo dos micros antigos serem meio fora do padrão, o que poderia confundir os circuitos dos monitores modernos, apesar de funcionarem bem nas velhas TVs e monitores.

Decidi então fazer um circuito gerador de vídeo com as seguintes características:
  • Capaz de gerar sinais com a temporização idêntica à dos MSX1, MSX2 e TK90X
  • Que gerasse sincronismo composto, separado e sincronismo no verde
  • Que gerasse os sinais sinais com amplitude e impedância corretas
  • Fácil de operar
  • Que se desligasse sozinho para economizar bateria
  • Pequeno, para poder caber numa caixa de Tic Tac
  • Que a placa fosse face simples
  • Que utilizasse um microcontrolador fácil de ser encontrado.

Comecei as experiências com um código em assembly para o AVR, pois eu já havia mexido na geração de vídeo com esses microcontroladores. O código foi ficando cada vez mais e mais complexo porque era baseado em interrupções e era meio chato ficar contando os ciclos.

Resolvi então partir do zero e escolhi desta vez usar um PIC. Eu tinha aqui em casa alguns 16F688 que eu ainda tinha aqui de sobra do lote de TKChucks que montei e um 16F648 e assim iniciei meus experimentos com ambos.

Como o circuito com AVR era baseado em interrupções, eu comecei a fazer o meu código assim também mas logo vi que com o PIC isso seria muito complicado, pois mesmo a 20MHz o 'overhead' gerado pelo código das interrupções estava atrapalhando muito.

Daí lembrei do artigo do Victor sobre o Tic Tac Blue onde ele comenta que fez o Tic Tac dele contando ciclo a ciclo. Dei uma relida no artigo e fiquei encucado com uma coisa: Em determinado momento o Victor comenta que o circuito dele gerava uns artefatos porque entre fechar um loop e abrir outro ele perdia alguns ciclos de clock.

Fiz algumas experiências no MPLAB e me deparei com o mesmo problema. Gastei um tempinho resolvendo o problema até chegar numa temporização totalmente equalizada, mas isso é coisa para um outro artigo. Fiz um loop principal para gerar vídeo VGA e fiquei animado porque funcionou logo de cara.
Primeira imagem gerada: VGA 640x480 @ 60Hz

Em seguida passei a estudar os sinais dos microcomputadores. Para o MSX1 e MSX2 eu pude contar com a documentação disponível, além é claro de fazer algumas medidas aqui em um de meus HotBits. Já para o TK90X eu tive que capturar as formas de onda da ULA e analisar. Mais detalhes estão num artigo que escrevi sobre o assunto (link).

O próximo passo foi estudar a geração dos sinais com amplitude e impedância corretos, ou seja R,G,B a 0,7Vpp @ 75Ohms. Isso requereu um pouco de matemática mas nada muito complicado. Um pouco de leitura e alguns exercícios já foram suficientes para resolver a questão e ainda rendeu outro artigo (link).

Dado que seriam 19 modos de operação possíveis (3 computadores x 3 modos de sincronismo x 2 frequências verticais mais o modo VGA), descartei o uso de LEDs ou de jumpers de configuração.

Daí resolvi a coisa da seguinte maneira:

Após power up: O circuito inicia em modo VGA, para testar se tudo está ok (cabo, bateria, etc)
Daí a cada toque no botão o circuito muda de modo:

1. VGA

2. MSX 1 Sincronismo composto, borda branca, faixa central amarela
3. MSX 1 Sincronismo separado, borda branca, faixa central branca
4. MSX 1 Sincronismo no verde, borda branca, faixa central verde

5. MSX 2 Sincronismo composto,  borda preta, faixa central amarela
6. MSX 2 Sincronismo separado, borda preta, faixa central branca
7. MSX 2 Sincronismo no verde, borda preta, faixa central verde

8. TK90X Sincronismo composto, borda branca, faixa central amarela
9. TK90X Sincronismo separado, borda branca, faixa central branca
10.TK90X Sincronismo no verde, borda branca, faixa central verde

retorna ao VGA

 Todos os modos acima a 60Hz. Para a seleção 60/50Hz - Através de um jumper de solda na placa, mas estou cogitando trocar para a detecção do estado do botão quando o circuito é energizado. Antes disso eu preciso checar se os modos de 50Hz estão operacionais pois não tenho nenhum monitor que suporte 50Hz.

Após um minuto sem operação o equipamento entra em standby, para economizar bateria, e isso é extremamente importante pois o circuito drena bastante corrente, considerando as baterias que ele usa e os resistores de polarização para manter o casamento de impedância do sinal. Ainda que no modo de standby o consumo seja reduzido pela entrada no modo sleep e pelo desligamento dos pinos que ativam os resistores de polarização é sempre bom deixar o circuito sem o jumper de alimentação.

Modo MSX1, sincronismo composto num dos primeiros testes


Ainda não satisfeito com essa maneira de exibir os modos resolvi escrever na tela o modo usando gráficos rudimentares. Alguns estudos que fiz descartaram a possibilidade de se utilizar uma rotina de geração de caracteres, pois isso tomaria um tempo logo demais limitando muito a quantidade de informações na tela (e demandando várias linhas de altura para os caracteres). A solução foi desenhar cada elemento pixel a pixel.

Pixels no OpenOffice
Criei uma planilha no OpenOffice onde a cor da célula dependia do valor. Se fosse 1 a célula seria preta, se fosse zero, branca. Depois salvei cada linha da sequencia e transformei numa sequências de zeros e uns. Aí então num editor de texto cada "1" foi substituído por uma sequência de instruções e cada zero por outra.
Dessa forma, os gráficos gerados pixel a pixel aparecem na tela para indicar a máquina, o modo de sincronismo e a frequência de operação.

O mesmo modo da foto anterior, agora com 'gráficos'.
 A placa de circuito impresso foi outro item extensamente trabalhado. Esqueci de mencionar mas o mesmo código pode ser compilado para o 16F688 e para o 16F648 (sem os caracteres 'gráficos' o código cabe até 16F628). Por conta disso gerei versões de placa para ambos os microcontroladores.

Da primeira versão, com componentes padrão do Eagle passando por várias melhorias para remover os jumpers foram 7 versões para o 16F688 e 5 versões para o 16F648,

Versões da placa para o 16F688

Versões da placa para o 16F628/648.
  Além das placas nas figuras acima existe uma última revisão (ainda sem protótipos) que foi necessária por causa do clip da bateria.
Infelizmente eu não tinha notado, até construir os primeiros protótipos, que clip que utilizei faz contato com os terminais positivos de ambas as baterias pela lateral isso gera um curto na célula de cima. O Clip correto prende as baterias pelo alto mas infelizmente tem um 'footprint' diferente.

Protótipo (PIC16F688). A fita adesiva para é para evitar curto nas baterias

 placa ficou de tal dimensão que o corpo do conector fica rente à boca da caixinha de Tic Tac, o que a mantém firme dentro da caixa

Protótipo na caixa de Tic Tac
 
O vídeo abaixo mostra o funcionamento do protótipo:

Update: Link para arquivos do projeto no Github

7 comentários:

Clóvis (Datassette) disse...

Ficou show Daniel legal mesmo!!!

Congrats

Clóvis (Datassette) disse...

Ficou show Daniel legal mesmo!!!

Congrats

Carlos André Poloni disse...

Show.

Carlos André Poloni disse...

Show.

Oscar A.Koepke disse...

Realy Impressive

TK Fan disse...

Muito legal mesmo!
Aliás, que monitores modernos suportam os micros clássicos? Alguém tem alguma dica?

A verdade é dura disse...

Daniel, não achei o link do desenho das placas. Você não disponibilizou?

Obrigado!

Ernani