terça-feira, 28 de novembro de 2006

Touchpads: Primeiras investigações

Controladores Touchpad para MSX

Muito pouco se sabe sobre o funcionamento dos "touchpads" do MSX, desde a pinagem deste dispositivo ao seu protocolo de comunicação. As observações abaixo são o resultado das análises da rotina GTPAD da BIOS.

O Touchpad do MSX é composto de 2 conversores A/D, que transferem seus bits ser

Pinagem do Touchpad:


Pino Direção Nome Função
1 S SENSE Indica quando a caneta do Touchpad toca sua superfície (0=Tocando)
2 S EOC Indica fim da conversão (1=Conversão terminada)
3 S DATA Dados enviados serialmente (MSB primeiro) pelo conversor A/D
4 S BTN Botão da caneta do touchpad (0=pressionado)
5 - Vcc Alimentação +5Volts
6 E CS Inicia uma conversão A/D (0=iniciar conversão)
7 E X/Y Seleciona conversor A/D (X=0, Y=1)
8 E SCK Clock para transferência de dados
9 - GND Negativo da alimentação.


O Pino CS (Trigger A) é levado a "0" (zero) para iniciar uma conversão. O conversor A/D é selecionado pelo pino X/Y (Trigger B; 0=X, 1=Y). O MSX então aguarda até que o conversor A/D termine de realizar sua conversão, liberando a linha EOC (DOWN), fazendo com que esta seja igual a "1" (um). Em seguida o MSX libera a linha CS, que novamente assume o valor "1" (um).

A partir deste momento começa a transferência do valor do conversor A/D. O pino SCK (Pulse) é levado a "1" (um) e em seguida o sinal presente na linha DATA (LEFT) é lido e colocado no registrador L. O pino SCK (Pulse) é então levado de volta a "0" (zero). Desta forma, 8 bis são lidos e armazenados em L. O pino SENSE (UP) é amostrado a cada bit lido, porém somente o estado do pino durante o bit menos significativo é levado em consideração. Caso seja "0" (zero), o MSX assume que a caneta manteve-se em contato com o "touchpad" durante o tempo da conversão, e que portanto, a coordenada lida é válida. Caso contrário, a rotina termina retornando o valor do pino SENSE.

As coordenadas X/Y são amostradas duas vezes seguidas. Caso a diferença de valor de cada eixo seja maior do que 5 (cinco) nestas amostragens consecutivas, ou seja, caso duas leituras consecutivas resultem em posições muito diferentes, todo o processo se repete. Caso contrário, as coordenadas X e Y são armazenasdas em PADX (FC9D) e PADY (FC9C), e a rotina termina, retornando o valor do pino SENSE.



quarta-feira, 22 de novembro de 2006

Paddle Revisitado

Há um bom tempo atrás eu construí um paddle baseado nas informações do "Livro Vermelho do MSX", que chegou a ser publicado em 1994, na Revista Antenna.

Eu reformulei o layout da placa do projeto, para um "design" mais atual.

Diagrama do circuito:


"Lay-out" da placa na resolução de 300dpi:


Disposição dos componentes, e identificação dos pinos:


Foto da placa, depois de montada e corroída (e com o "lay-out" adaptado com o logotipo do HotBit).



Foto da placa montada, vista por baixo. Detalhe: O "push button" é montado no lado do cobre.


Foto da placa montada, vista por cima.


No conector DB-9 fêmea que vai ao MSX, a ligação é a seguinte:

Pino 1 do DB9 ao sinal UP da placa
Pino 5 do DB9 ao sinal VCC da placa
Pino 6 do DB9 ao sinal TRGA da placa
Pino 8 do DB9 ao sinal PULSO da placa
Pino 9 do DB9 ao sinal GND da placa

O push-button deve ser montado do lado da solda, ou seja por baixo da placa, e o eixo do potenciômetro atravessa a placa.

O potenciômetro deve ser do tipo linear, e o capacitor 'Cx' é apenas uma reserva de espaço, caso seja desejado um ajuste fino da faixa de atuação do potenciômetro.

Eis ainda um link para os arquivos em formato Eagle.

segunda-feira, 20 de novembro de 2006

Leitor de MMC/SD rápido: Mais alguns Testes dos Registradores de Deslocamento, correções e conclusões

Após o teste do registrador de saída, iniciaram-se os testes com o registrador de entrada. Para isso, os pinos 3 e 5 do 74HC125 foram conectados e os seguintes programas foram executados:

DADO: EQU 0
SPI: EQU 12

ORG 9000H
LD A,0
IN A,(14) ; ativa CS
LD A,0
IN A,(15) ; ativa 74125
LD A,0
IN A,(12)
NOP
NOP
IN A,(12)
LD (9050H),A
RET

E, em Basic

5 DEFUSR0=&H9000
10 INPUT “DADO”;D
20 POKE &H9009,D
30 A=USR0(0)
40 PRINT PEEK &H9050
50 GOTO 10

O programa em Basic simplesmente passa um parâmetro para o programa em assembler, que por sua vez, transmite à saída o dado desejado no primeiro IN, e em seguida lê o valor ecoado para o registrador de entrado, no segundo IN.

Foi notada uma instabilidade na leitura dos valores, ou seja, nem sempre o valor lido correspondia ao valor escrito.

O programa em Basic foi alterado para um loop que variava incrementalmente o valor transmidito de 0 a 255, e comparava o valor transmitido com o valor recebido, mostrando quais bits continham erros.

Esse programa produziu erros que sempre se repetiam, revelando uma natureza deterministica, descartando assim maus contatos no protótipo.

O 74HC125 foi retirado, e no lugar foi colocado uma ponte entre os pinos 2 e 6 em seu soquete, mas os erros continuavam os mesmos.

Uma nova análise revelou a origem do problema. No circuito, o mesmo sinal de clock foi utilizado em ambos os registradores de deslocamento (o de entrada e o de saída) e por isso ambos fazem “shift” dos dados na borda de subida (pois em ambos a borda de subida é a ativa).

Mas acontece que do ponto de vista do LS165, um “shift” é realmente um “shift”, mas do pondo de vista do LS595, o “shift” é um o “LATCH,” pois no momento do shift é
que o bit atual é capturado para dentro de um flip-flop. Desta forma, o registrador de entrada (LS595) estava tentando capturar um sinal (saída do LS165) enqanto este ainda estava se acomodando, gerando os erros mencionados.

É por isso que quando o “shift” era feito manualmente, os resultados eram aleatórios, pois o erro dependia da carga eletrica reminiscente nas portas no momento em que era dado o “ENTER”.

O bit 7 nunca ficava errado, porque quando o IORQ chega pela instrução 'IN A,(SPI)', o LS165 recebe o sinal da via de dados e já coloca o bit mais significativo na saída QH. Assim, quando os ciclos de clock automático começavam, o sinal já era estável, e nunca era lido errado.

A correção para o problema foi inverter o sinal de clock do LS165, de forma que o “Shift” aconteça durante a borda de descida, respeitando assim as especificações do cartão SD/MMC, em modo SPI.


De forma simplificada esta é a sequência de eventos:

Na borda de subida:
a) O LS595 captura o sinal que o cartão disponibilizou na linha DOUT
b)O Cartão captura o sinal que o LS165 disponibilizou na linha DIN

Na borda de descida: (que se torna de subida para o LS165 interno)
a)O LS165 faz shift no byte sendo transmitido ao cartão e sinal e disponibiliza o próximo bit na linha DIN
b)O cartão faz shift no byte que está sendo transmidito ao LS595 e o disponibiliza na linha DOUT

A forma de onda abaixo ilustra a operação do circuito.



Após a inicialização do cartão, quando o pino CS é levado a zero, o cartão inicializa sua saída, disponibilizando o bit mais significativo do primeiro byte a ser transmitido na linha de dados. Em seguida :

  1. O programa decodifica e executa a instrução IN
  2. O Z80 coloca nas linhas D8..D15 o dado a ser transmitido
  3. O Z80 baixa a linha IORQ
  4. O dado a ser transmitido é transferido para os flip-flops internos do LS165
  5. O bit mais significativo do byte a ser transmitido fica disponivel (valido) na saida QH do LS165
  6. O Z80 sobe a linha IORQ
  7. O gerador de clock automático é habilitado e está pronto para começar a contar a partir da próxima borda de subida
  8. O Z80 começa a executar a proxima instrução
  9. A linha SCK sobe, pois
  10. o LS595 captura para o flip flop interno, o bit mais significativo vindo do cartao, pela linha DIN
  11. o cartão captura o bit mais significativo enviado pelo pino QH do LS165
  12. A linha SCK desce
  13. A linha INV_SCK sobe simultaneamente.
  14. O LS165 coloca em sua saida QH o bit 6 do dado a ser transmitido ao cartao
  15. O cartão coloca em sua linha DOUT o bit 6 do dado a ser transmitido ao micro
  16. A linha SCK sobe...
E o processo se repete até os 8 bits terem sido transferidos.

Ao final da transferência deste byte, a linha DOUT do cartão já contém o bit mais significativo do próximo byte a ser transferido. Se houverem mais dados a serem trocados, o processo continua.

quarta-feira, 1 de novembro de 2006

Leitor de MMC/SD rápido: Teste do Registrador de Escrita

Com o auxílio de um circuito de testes baseado no 74HC595, o registrador de escrita automática foi testado com sucesso!




(este circuito foi feito inicialmente para outra finalidade, e foi utilizado por já estar pronto)

O programa de teste escrito em BASIC configura o buffer de saída, transfere o dado e pulsa a linha CS, para que o 74HC595 da placa externa possa exibir os dados que recebeu serialmente.




Eis a foto do protótipo durante o teste de transferência.


Agora faltam as seguintes etapas pra terminar o desenvolvimento do hardware:
  • Testar o registrador de entrada (com o auxilio de um HC165 externo)
  • Testar a conversão 5V-3V (74HC125)
  • Reconfigurar o circuito para a versao 1 (retirar o 74HC74 e colocar um 74HC259 e um segundo LS125)
  • Testar o dircuito reconfigurado