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:



sábado, 25 de abril de 2015

Placa Adaptadora de barramentos CP200-TK85

Trabalhei um pouco no layout da placa, para limpar a bagunça feita pelo autorouter e engrossar as trilhas de alimentação. 

Aproveitei e inseri os seguintes recursos:
  • Botão de reset que fica apontado para o usuário
  • Trilhas de configuração para a posição do sinal /RAMCS para facilitar a modificação na placa do CP200 versão Spock
  • Pontos de medição dos sinais +5V e +9V


Também subi o projeto para o OSH Park (link). A placa ficou com as dimensões de 40mm x 64,5mm.


sexta-feira, 24 de abril de 2015

Capa de monitor

Adquiri recentemente um monitor Samsung 510n e fiz uma capa para ele utilizando uma sacola plástica que eu ganhei há algum tempo atrás numa visita à AFA.

Para fazer a capa eu cortei a parte de baixo da sacola com um estilete, e emendei a parte de cima usando o ferro de solda e uma régua metálica como guia (*).

Eis o resultado:


quarta-feira, 22 de abril de 2015

Consertando o teclado do TK90

Recentemente tirei meu TK90X da caixa e coloquei ele de volta na bancada para auxiliar num projeto. Infelizmente a membrana de teclado estava com mau contato 1cm acima do ponto onde se encaixa no conector que vai à via de dados. A solução foi fazer uma extensão com fio paralelo, semelhante ao que já tinha feito para o outro conector (que vai às vias de endereço).

Seguem as fotos:

Conector original foi removido
No lugar foi instalado um conector fêmea de 5 pinos
O conector original foi soldado a um cabo paralelo. Esta soldagem é delicada porque se o pino sobreaquecer pode danificar o conector. A melhor maneira de fazer isso é estanhar rapidamente cada pino, deixando um pouquinho de solda no pino. Em seguida encosta-se o fio (já estanhado da mesma maneira) no pino e só então se aplica o ferro de solda, somente o tempo necessário para a solda derreter e unir o fio ao pino. É preciso ter a mão firme para fazer isso.

Conector original soldado a um cabo paralelo. 
Os espaguetes são essenciais para evitar curtos no interior do TK

O acetato foi cortado 1cm acima do ponto de contato anterior.

Livros retrocomputacionais

Chegaram alguns livros que encomendei nos sebos online do estante virtual.


O livro do Z80 é um clássico. Pretendo dar uma lida boa nas técnicas de programação envolvendo uso da pilha, pois isso era algo que eu raramente fazia na época que programava para o Z80. O volume de hardware está para chegar vindo de outro sebo.

O livro do 68000 é bem didático. Já dei uma lida nos dois primeiros gostei e bastante na época não tinha essas frescuras de diferenciar a linguagem do montador, rsrsrs, daí o nome do livro é Programação ASSEMBLER mesmo!!

Já o computador de meio salário mínimo está um pouco defasado, tadinho. Na época em que o livro foi editado (1986) tudo devia ser extremamente caro, pois o micro em questão é para ser programado por chaves HH. Hoje em dia as chaves ficariam muito mais caras dos que os CIs utilizados (estas chaves HH da Joto são um abuso de caras!!). Mas vale a pena pelo registro histórico.

Ao final do livro tem o esquema do microcomputador.

Também tem uma folha impressa frente e verso com uma sugestão de layout para a placa do micro.


Esta folha foi feita para ser olhada contra a luz e servir de orientação para a montagem do circuito.

Modos 480i e 240p em alguns monitores

Complementando o artigo sobre micros antigos e sinais de sincronismo (link), seguem os testes realizados em alguns monitores de vídeo quanto aos modos 480i e 240p, este último tanto conforme especificações do TMS9128 quanto da ULA da Microdigital.

O resumo dos testes:

Marca: Dell       Modelo:U2412m 
Modo\Sincronismo  Composto   Separado  no Verde
480i                  x         x         x
240p (MSX1)           x         x         x
240p (TK)             x         x         x


Marca: HP         Modelo:LA1951G
Modo\Sincronismo  Composto   Separado  no Verde
480i                  x         x         x
240p (MSX1)           x         x         x
240p (TK)             x         x         x


Marca: HP         Modelo:LA1956x
Modo\Sincronismo  Composto   Separado  no Verde
480i                  x         x         x
240p (MSX1)           x         x         x
240p (TK)             x         x         x


Marca: Itautec    Modelo:E2241PX
Modo\Sincronismo  Composto   Separado  no Verde
480i                  x         x         x
240p (MSX1)           x         x         x
240p (TK)             x         x         x


Este monitor até identifica corretamente as frequências horizontais e verticais para os modos 480i e 240p porém estão fora de sua faixa de operação.

Monitor Itautec E2241px indica frequências corretamente


Os testes bem sucedidos foram com um monitor de vídeo NEC modelo EA192M e, com já era esperado, com um monitor Samsung Syncmaster 510N

Monitor NEC EA129M


Marca: NEC        Modelo:EA192M
Modo\Sincronismo  Composto   Separado  no Verde
480i (MSX2)          não(*)     não(*)   sim

240p (MSX1)          sim        sim      sim
240p (TK)            sim        sim      sim


(*) A detecção destes modos é intermitente. 


Monitor NEC EA192M em modo VGA (640x480@60Hz)
Monitor NEC EA192M em modo 480i (V9938/MSX2) com sincronismo no verde
Identificação do modo 480i no monitor NEC EA192M (MSX2, Sincronismo no verde)


Monitor NEC EA192M em modo 240p (TMS9918/MSX1) com sincronismo composto
Identificação do modo 240p no monitor NEC EA192M (MSX1, Sincronismo composto)


Monitor NEC EA192M em modo 240p (TMS9918/MSX1) com sincronismo separado (H+V)

Monitor NEC EA192M em modo 240p (TMS9918/MSX1) com sincronismo no verde

Monitor NEC EA192M em modo 240p (ULA TK90X) com sincronismo composto
Identificação do modo 240p no monitor NEC EA192M (TK90X, Sincronismo composto)

Monitor NEC EA192M em modo 240p (ULA TK90X) com sincronismo separado (H+V)

Monitor NEC EA192M em modo 240p (ULA TK90X) com sincronismo no verde
Os testes com esse monitor surpreenderam pois os modos de vídeo 480i com sincronismo composto ou separado nem sempre foram reconhecidos; algumas vezes o monitor detectava o modo e depois perdia o sincronismo. Já com sincronismo no verde o sinal sempre é detectado.

Monitor Samsung SyncMaster 510N


Marca: Samsung    Modelo:SyncMaster 510N
Modo\Sincronismo  Composto   Separado  no Verde
480i (MSX2)          sim        sim      não

240p (MSX1)          sim        sim      não
240p (TK)            sim        sim      não



Monitor Samsung 510N em modo VGA (640x480@60Hz)

Monitor Samsung 510N em modo 240p (TMS9918/MSX1) com sincronismo composto

Monitor Samsung 510N em modo 240p (TMS9918/MSX1) com sincronismo separado (H+V)

Monitor Samsung 510N em modo 480i (NTSC/MSX2) com sincronismo composto

Monitor Samsung 510N em modo 480i (NTSC/MSX2) com sincronismo separado (H+V)

Monitor Samsung 510N em modo 240p (ULA TK90X) com sincronismo composto

Monitor Samsung 510N em modo 240p (ULA TK90X) com sincronismo separado (H+V)

Notas finais:


Dependendo do monitor utilizado pode ser necessário ajustar a largura da imagem e/ou a posição vertical, de forma a evitar razão de aspecto incorreta ou artefatos na tela. No caso do monitor samsung 510N, o ajuste de largura teve que ficar no máximo, caso contrário não era possível centralizar a imagem.

Ajuste de largura no monitor Samsung 510n