quinta-feira, 30 de outubro de 2014

Recriando uma tábua digitalizadora para o MSX (update: código fonte)

Combinando o aprendido com o estudo das telas touchscreen resistivas e mais o funcionamento das tábuas digitalizadoras para o MSX, consegui recriar a minha própria. Eu recomendo fortemente a leitura dos artigos citados a fim de melhor compreender o que vai ser descrito aqui.

O circuito ficou a cargo de um PIC16F688, rodando com clock interno de 8MHz.  A PORTA A ficou inteira para o digitalizador, enquanto a PORTA  C ficou para a interface com o MSX.


O protótipo foi montado numa placa padrão. Os primeiros testes foram efetuados com um conjunto de potenciômetros, e posteriormente com o 'touchscreen'.



 O conector do sensor resistivo é um componente SMD, e teve que ser adaptado para a montagem na placa padrão.


 As abas do conector foram soldadas às ilhas e os terminais foram isolados com um pedaço de fita de kapton por baixo.

  

 


 Depois do conjunto montado, o primeiro programa usado para testar o Touchpad foi esse:


Eu notei que quando colocado sobre a mesa a detecção do toque não funcionou direito. Creio que será necessário incluir um delay entre o momento que eu ativo o resistor de pullup e a amostragem da tela. 
Com o sensor resistivo sobre o MSX a detecção fica quase normal. Fora isso, a leitura das coordenadas ficou muito boa, e a auto-calibração também funciona muito bem (vide artigo sobre a leitura do sensor resistivo)


 Em seguida fiz um programa para poder testar o funcionamento de uma forma mais visual.


E capturei o seguinte vídeo:



Ainda dá para melhorar um pouco a estabilidade da leitura, mas como prova de conceito já está OK.  O protótipo já tem todos os elementos necessários. Agora é melhorar o firmware.

Mas antes disso, o próximo passo vai ser montar o circuito numa caixa ou base.

segunda-feira, 27 de outubro de 2014

Um estudo sobre o MSX Touchpad

Recentemente alguém publicou no MSX Wiki um material sobre as pranchetas digitalizadoras para o MSX. Estes periféricos nunca foram produzidos em terras tupiniquins, o que é uma pena, pois teria sido interessante ver programas como o Graphos III com suporte a ele.

O artigo, apesar de bem interessante ainda me deixou com algumas dúvidas, e resolvi esclarecê-las a partir de uma lida no código fonte da BIOS do MSX. Minhas observações podem ser vistas neste link.

Diante do esclarecido resolvi dar uma esboçada no circuito, que utiliza um DAC modelo uPD7001, velho conhecido meu, dos modulos controladores da válvula de saída das RD350 (YPVS). 



Como tinha um chip desses em minha gaveta de componentes resolvi fazer uns testes, e usar pela primeira vez em minha vida a instrução PAD(x) do MSX Basic.



Eu aproveitei para capturar algumas formas de onda, de forma a ilustrar o funcionamento da função GTPAD da BIOS.
  • O MSX faz uma primeira leitura ao Touchpad, provavelmente para "acordar" o circuito. O sinal SI, que seleciona o canal do ADC começa no valor 0.
  • Em seguida vem uma segunda leitura para determinar se a tela está pressionada ou não, e também para selecionar o canal 0 do ADC. Caso a tela não esteja sendo pressionada, a rotina termina.

Sinais SI (Laranja) e /CS (Azul) na condição "Tela NÃO Pressionada"

  • Por outro lado, caso a tela esteja pressionada o MSX faz mais 4 leituras.


Sinais SI (Laranja) e /CS (Azul) na condição "Tela PRESSIONADA"
A tela abaixo tem um pouco mais de detalhes, portanto vou recomeçar a explicação..
  • O MSX faz uma primeira leitura ao Touchpad, provavelmente para "acordar" o circuito;
  • Em seguida vem uma segunda leitura para determinar se a tela está pressionada ou não, e também para selecionar o canal 0 do ADC;
  • A terceira leitura é a do valor X0. Enquanto esta leitura acontece, o sinal SI fica em "1" para selecionar o canal 3 para a próxima leitura;
  • Em seguida o valor de Y0 é lido com o sinal SI em zero, para selecionar o canal 0 para a próxima leitura;
  • O MSX lê então o valor de X1 e coloca SI em "1" para a próxima leitura;
  • Por último o valor de Y1 é lido e os sinais retornam ao estado normal. (faltou o "CH0" em vermelho ali na figura). 

Sinais SI (Laranja) e /CS (Azul) na condição "Tela PRESSIONADA", detalhes.
Abaixo uma foto da tela do osciloscópio (porque estas capturas são muito feinhas).



Alguns detalhes importantes:
  • O processo de leitura dura por volta de 8ms.
  • O ciclo de clock gerado pelo MSX dura 140us.
  • O sinal de clock no código fonte parece estar invertido. O texto fala que está no estado "0" quando seta um bit, e vice versa. Talvez exista um inversor entre o sinal SCK do MSX e o mesmo sinal do uPD7001. De qualquer modo o circuito funcionou deste jeito.
  • O texto do MSX Wiki fala de um inversor entre o sinal /EOC do uPD7001 e o MSX, mas eu suspeito que no circuito real exista um flip flop que é ativado pelo sinal /CS e resetado pelo sinal EOC do ADC.