sexta-feira, 29 de maio de 2015

Tek - Adaptador de teclado genérico (2)

Continuando com o projeto, hoje testei a parte da geração do sinal serializado para a matriz composta pelos registradores de deslocamento. São necessários 3 sinais

DOUT - Sinal que sai do microcontrolador e entra na matriz
SCK  -  Sinal de clock para os dados que chegam

RCK - Sinal de transferência dos flip flops internos (shift register) para os flip flops de saída (storage register)

Os registradores de armazenamento internos aos 595 são fundamentais para este circuito pois evitam que falsos pressionamentos sejam detectados durante a transferência serial (bit a bit) da matriz.


 
 Os sinais gerados encontram-se abaixo:

Transferência da tecla Q para a matriz. Ao final é gerado um pulso de transferência  (RCK)
Captura da transmissão de várias teclas.
Se mais de uma tecla for pressioanda, ambas são tranferidas à matriz. Algumas teclas são transferidas como uma combinação de mais teclas como é o caso das setas de cursor, que são transferidas como se fossem as teclas SHIFT e a tecla correspondente no teclado (UP=7, DOWN=6, LEFT=7, RIGHT=8)

Transmissão de teclas simultâneas e transmissão de tecla composta SHIFT+xx
O próximo passo é montar tudo no TK e ver se funciona!


Sinal /KBD no TK-85

Este post é para ajudar o amigo Clóvis a identificar um problema num TK-85, mas fica também de referência para futuras pesquisas

O sinal /KBD é gerado pela combinação dos sinais /IORQ, A0 e /RD. A decodificação é incompleta, e qualquer endereço de I/O lido vai gerar este sinal que ativa o buffer IC10 (LS365) e permite a leitura das  colunas do teclado (bits D0-D4) além do sinal do cassete (bit D7). Este sinal também permite ao TK reconhecer o funcionamento em 50/60Hz através da presença/ausência do diodo D6. Se o diodo está presente, então toda vez que o sinal /KBD for ativado ele vai forçar um nível baixo na linha D6. Caso o diodo não esteja instalado, o nível lido é alto (apesar de não existir um pull-up na linha).

Lógica de geração do sinal /KBD no TK-85
 A forma de onda normal do sinal /KBD é uma série de 9 pulsos espaçados de 25us e que se repetem a cada 16 ms (a 60Hz). A primeira leitura é para ler e isolar o estado da tecla SHIFT e as seguintes são para ler o estado das colunas (D0..D4) para cada uma das 8 linhas do teclado (A8..A15).

O sinal /KBD consiste de uma série pulsos para ler a matriz do teclado.
Os  9 pulsos são ativados a cada quadro de vídeo gerado (60Hz).




quinta-feira, 28 de maio de 2015

Tek - Adaptador de teclado genérico

A fim de seguir com o projeto do adaptador de teclado genérico tratei de fazer o PIC16F688 se comunicar com o teclado PS/2. Para não perder muito tempo com a implementação resolvi usar uma biblioteca pronta do compilador Mikrobasic para PIC. Esse compilador, ou melhor esse ambiente de desenvolvimento possui bibliotecas para vários periféricos bem fáceis de usar além é claro do 'conforto' de se programar em Basic, pelo menos para quem viveu a época dos micros clássicos. A versão 'demo' permite gerar código até 2Kbytes, o que dá para fazer bastante coisa.
Porém, a facilidade tem seu preço, como por exemplo quando uma biblioteca não tem as funcionalidades que você quer ou não se comporta da maneira como você deseja, e foi exatamente o que aconteceu.

A biblioteca de PS/2  interpreta os 'scancodes'  levando em consideração o estado da tecla shift e o caps lock, o que complica bastante a geração dos estados da matriz. Por exemplo, quando eu pressiono SHIFT juntamente com a tecla "8" a biblioteca me retorna o asterisco "*". Até aí tudo bem, eu poderia simplesmente associar o "*" ao estado correspondente na matriz.
Mas a coisa complica na hora por exemplo de um SHIFT+Letra, pois o teclado interpreta o estado da tecla SHIFT e também o estado da tecla Caps Lock. Dessa forma não tenho como diferenciar somente pelo código recebido quando eu estou pressionando A com o Caps ligado ou SHIFT+A, pois em ambos os casos eu receberia somente que a tecla "A" (maiúscula) foi recebida. Assim seria necessário acrescentar um tratamento paralelo dos estados das teclas CAPS e SHIFT. Isso sem falar no SHIFT+ENTER que seria chato de tratar também...

Pelo menos ficou a experiência de ter lidado com o Mikrobasic, que achei bem positiva.

Bom, no projeto abandonado do emulador de teclado externo para o TK90 eu tinha passado por algo semelhante com a biblioteca PS/2 'padrão' do Arduino, e acabei usando uma outra biblioteca que me retornava os 'scancodes' exatamente como recebidos do teclado, sem os interpretar nem transformar em ASCII. Esta biblioteca tem ainda a vantagem de ser bidirecional, ou seja ela permite enviar comandos ao teclado como inicializar, trocar o modo dos scancodes ou mudar o estado dos leds.

Como essa biblioteca é bem simples resolvi porta-la para o PIC (em C) trocando algumas funções que tomei emprestadas de uma biblioteca de I2C que eu havia escrito na época do projeto do TKChuck.

Para minha surpresa, o código funcionou logo de cara!!

Biblioteca myPS2 funcionando!

Os dois primeiros bytes recebidos são o teclado respondendo ao comando de inicialização e ao Auto Teste finalizado com sucesso . Os bytes seguintes são correspondentes às teclas sendo pressionadas.

O próximo passo foi portar o restante do código do projeto anterior para o PIC e refazer a tabela que associa o 'scancode' à matriz de teclado de forma a refletir as teclas do TK85.
 


Matriz do teclado do TK-85 linearizada (somente 5 bits menos significativos).


Por exemplo, a tecla "S" equivale à coluna 1 (bit D1) da linha 2 (A9):
#define _Tecla_S 0x0A    // 0.0.001.010 -> 0000 1010 -> 0x0A

Já a tecla "Backspace" equivale à SHIFT + 0, ou seja SHIFT + coluna 0 da linha 3 (bit D0 de A12)
#define _Tecla_BS  0x83    // 1.0.000.011 -> 1000 0011 -> 0x83 
 

Um detalhe de montagem do circuito é que o bit D0 ficou na saída Q7 do registrador de deslocamento. Isso requereu alguns acertos, porém agora o programa preenche a matriz corretamente. Nas figuras abaixo as sequências de números correspondem à matriz, sendo a primeira o estado da matriz quando a tecla é pressionada e a segunda quando a tecla é solta.


Tecla "1"

Tecla "S"
Tecla "Backspace", composta de "SHIFT" + "0"
Somente tecla "SHIFT"

O próximo passo vai ser conferir se os registradores de deslocamento estão sendo devidamente preenchidos com o conteúdo da matriz e em seguida começa o teste 'ao vivo' conectado na placa do TK85.




domingo, 24 de maio de 2015

Retomando um antigo projeto

Há algum tempo atrás fiz o projeto de um adaptador de teclado genérico para micros antigos baseado em registradores de deslocamento mas esse projeto ficou meio abandonado em função de uma variação para ser ligada externamente ao TK90X (que infelizmente precisava de uma modificação interna no TK e por isso também foi abandonada).

Pois bem, como a placa 'ressuscitada' precisa de um gabinete e de um teclado, resolvi retomar o projeto do adaptador de teclado genérico (ou Tek) e construí um protótipo.

Prótótipo montado. Os 595 só entram depois dos primeiros testes com o microcontrolador

Foi necessário furar uma fileira extra para acomodar todos os chips na placa de 5x10cm
O projeto do TK90X era baseado num AVR, mas como o espaço é pouco nessa placa vou utilizar o PIC16F688 que tem apenas 14 pinos porém é mais que suficiente para estimular a matriz e ainda sobram pinos para uma porta serial ( que auxilia no 'debug' e serve de expansão 'cross typing' ) e para alguns pinos de entrada/saída para outros fins como entrada de sinais especiais (led caps, teclas modificadoras, etc)



 e ainda sobram mais alguns pinos para uma interface serial e

sábado, 23 de maio de 2015

Caixa padrão para projetos com Arduino

Há algum tempo atrás um amigo me deu algumas caixas padrão que ele tinha sobrando, e acabei descobrindo por acaso que ela abriga perfeitamente uma placa de Arduino UNO e ainda sobra espaço para um "shield". A caixa em questão é a CP-013 da Patola.

Caixa CP-013 da Patola



A caixa tem ranhuras laterais onde uma placa de Arduino se encaixa direitinho.

A caixa tem espaço para uma placa de Arduino e mais um "shield"

A furação aproximada (apenas para a placa do Arduino) é vista na figura abaixo.


Caixa CP-013 após a furação.

Opcionalmente pode-se fazer um rebaixo na tampa o jaque de alimentação para melhorar o encaixe.

Rebaixo para o plug de alimentação.


Caixa CP-013, tampa e Arduino.

Caixa já furada, vista de outro ângulo.


quinta-feira, 21 de maio de 2015

Ressuscitando um TK-85 (5)

Nos últimos dias não tenho conseguido mexer muito com a plaquinha "ressucitada", mas hoje consegui fazer umas poucas coisas:

Instalei duas barras de pinos. Uma com 5 pinos e outra com 8 pinos.

Barras de pinos para as conexões do teclado.
Com isso já deu para testar as combinações da matriz de teclado. Felizmente todas as teclas estão funcionando.

A imagem ficou muito nítida com o TK85AV Tetraloaded

Instalei também alguns componentes faltantes na placa para implementar o MOD do PSG. Ficou faltando o Jaque de saída (que não tenho no momento) e um capacitor de desacoplamento, este último só fui me dar conta agora. A lista completa dos componentes necessários é:
  • 1 AY3-8912 (IC29, PSG) 
  • 1 74LS00 (IC27)
  • 1 LM386 (IC 38)
  • 4 diodos 1N4148 (D6, D7, D8, D9)
  • 4 capacitores de 100nf (C15, C24, C31, C32)
  • 1 capacitor de 220uf (C16)
  • 1 resistor de 47K (R66)
  • 1 resistor de 100K (R65)
  • 1 soquete de 8 pinos (para IC38)
  • 1 soquete de 14 pinos (para IC27)
  • 1 soquete de 28 pinos (para IC29)
  • 1 Jaque de áudio P2
Como ainda falta testar algumas coisas não instalei os CIs, somente os soquetes.
Ficou faltando o capacitor C32 que serve para desacoplar a alimentação de IC27 (LS00)

Soquete e capacitores para o amplificador de áudio.
Por hoje é só...



domingo, 17 de maio de 2015

Caixa reciclada para o TK85

Aproveitando a onda da reciclagem salvei de ir pro lixo uma caixa de placa de vídeo que serviu perfeitamente para abrigar um TK85. Só precisei cortar um pouco a espuma para encaixar o TK, e ainda sobrou um compartimento onde cabe perfeitamente uma fonte chaveada e um cabo de vídeo.

O TK-85 há décadas não tinha uma casa própria.

Ressuscitando um TK-85 (4)

Continuando o post anterior...


Hoje eu peguei o TK-85 que está funcionando corretamente e capturei várias formas de onda, a fim de comparar com a placa que estou tentando restabelecer seu funcionamento.

Eu usei como trigger o sinal de base de tempo vertical presente no anodo de D22 e escorreguei a base de tempo para aproximadamente 2,5ms além. A razão disso é que intervalo vertical não há vídeo sendo gerado. Eu ajustei a posição vertical de forma que a borda de descida do ciclo M1 batesse com o centro da tela do osciloscópio, ou seja sobre o eixo vertical.

A razão de usar o ciclo M1 como referência é que o TK85 (ZX81) literalmente executa a memória para desenhar a tela, e o ciclo M1 vai a nível baixo no início do ciclo de busca (fetch) das instruções.
Quando o ZX81 executa instruções na região correspondente ao D-FILE, existe um circuito que gera 'NOPS' para o Z80 para cada caractere na tela. Sendo assim, este sinal é uma boa referência de tempo para se checar os outros sinais.

Com uma referência fixa foi possível combinar várias formas de onda e combina-las numa figura única de forma a facilitar o entendimento (ou futuras pesquisas de pane).

Formas de onda do TK85

Olhando a figura acima vemos de cara uma coisa estranha. O sinal presente no pino 9 de IC5 (LS373) varia entre 0 e 1,2Volts. Isso estava assim também na placa defeituosa e foi exatamente esse comportamento que ontem me fez suspeitar de IC17 (LS04) e de IC5 (LS373). Acabei trocando IC5 porque apesar de tudo a saída da porta E de  IC17 invertia o sinal. Depois de trocado IC5 o comportamento do circuito não havia se alterado.

Geração do sinal SHIFT/LOAD
Como última e desesperador medida acabei trocando também IC17, pois sua porta C estava ligada diretamente em DD6 que quando tocada com o dedo ou a ponta de prova mudava o sinal produzido na tela (vide post anterior).
A conclusão é que embora bizarro esse circuito funciona assim mesmo. O que acontece é que na fase alta do sinal de REFRESH, as saídas de IC5 estão em tristate, e isso equivale a deixar o pino 11 de IC17 em aberto. Com isso, os 1,25 Volts são enxergados como nível alto e a saída representa o inverso do sinal de entrada com um pequeno detalhe: Na falta de algo para puxar a entrada do inversor (IC17-11) para cima, o sinal sobe relativamente devagar, formando uma rampa que causa um delay de aproximadamente 200ns na borda de descida do sinal no pino 10 de IC17. Não sei dizer se este atraso é proposital, teria que analisar mais ou fazer mais experimentos.

Continuando, o sinal de NOP 'atrasado' junto com o sinal MREQ (também atrasado por uma rede RC) e mais o sinal de 3.25MHz são combinados numa porta NAND de forma que um pulso baixo só aparecerá no momento em que os três sinais estiverem em nível lógico alto. Isso acontece entre na fase alta de clock, no final do ciclo de 'refresh', logo antes do início do ciclo de 'fetch' seguinte (o sinal nop segue mais ou menos o inverso do sinal de refresh)

Formas de onda em IC18C (LS10, TK85 funcionando)
Na placa defeitosa, os sinais estavam um pouco diferentes: O sinal de clock era um pouco mais bem comportado, e o sinal de NOP 'atrasado' por IC5 (LS373) apresentava uns glitches que desapareciam quando tocava-se o dedo ou a ponta de prova na linha DD6. O sinal MREQ' era igual.

Já a saída era muito estranha, em vez dos pulsos curtos apareciam dois pulsos de SHIFT/LOAD e era isso que fazia o registrador de deslocamento apresentar aquele monte de lixo na tela.

Formas de onda em IC18C (LS10, TK85 defeituoso)

Abrindo-se a varredura da tela para conferir os estados lógicos apareceu um suspeito: IC18. Aparentemente a saída estava simplesmente invertendo o sinal MREQ'.

Forma de onda 'esperada' em IC18 (vermelho) versus sinal atual (azul)
Comparando o sinal observado com o sinal desejado tinha-se a impressão de que a porta NAND não estava funcionando corretamente. Daí, dá-lhe trocar o LS10, Aproveitei para colocar um soquete.

IC18 (LS10) removido

Soquete instalado para IC18 (LS10)
Estava fácil demais.... não precisa nem dizer que não funcionou...

Então, pausa pra tomar um café e brincar com o cachorro enquanto pensa no problema...
Brincando com o Otto para refrescar as idéias.

Alguns biscoitos depois comecei a investigar outra a diferença que observei nos sinais: O clock. Como eu ainda tinha na memória do osciloscópio o clock do TK funcionando, fiz uma nova captura e sobrepus os dois sinais:

Clock 3.25MHz'. Branco: TK funcionando / Azul: TK com defeito


 Daí apareceu uma coisa que não tinha notado de início. O Clock do TK com defeito estava sobreposto a um sinal de aproximadamente 1,2Volts. Isso me fez lembrar da saída do LS367 que era reconhecida como nível alto daí refiz a análise dos sinais na entrada de IC18 considerando que o clock estivesse sendo enxergado pelo CI como em nível alto o tempo inteiro:
Considerando o Clock em nível alto, explicava-se o comportamento da saída.

Bingo!!! Considerando-se o Clock em nível alto o tempo inteiro, o comportamento estranho do sinal SHIFT/LOAD estava explicado!

O problema agora havia se transformado em estudar porque o clock estava diferente do que deveria. Analisando o circuito do TK novamente, vemos que o sinal de clock/2 (3.25MHz) saindo do pino 9 de IC4 (LS74) passa por uma rede diferenciadora (C3-R5) e vai para o pino 9 de IC18. Como o sinal estava passando, o capacitor poderia estar em curto ou o resistor poderia estar aberto.
Derivador de clock.
Deu um pouco de trabalho encontrar estes dois componentes (C3, R5) que estavam ao lado do jack de 'EAR'. Quando os encontrei verifiquei que a conexão de GND do resistor estava aberta.  Observando do lado de baixo da placa vi o problema:
Trilha danificada quando a placa foi canibalizada.
A conexão entre o terminal negativo do resistor R5 (e sabe-se lá o que mais, já que a trilha é grossa) e a ilha do jack de EAR que vai ao GND estava aberta! Esta trilha deve ter-se rompido quando a placa foi canibalizada e passou batido quando eu soldei o Jack para substituir o que estava faltando.

Consertei a placa usando fio rígido. Cortes, trincas e demais interrupções sempre devem ser reparadas soldando fio entre ilhas, pois quando o fio é soldado nas trilhas elas aquecem e tendem a descolar e depois de algum tempo o reparo pode romper-se novamente.

Trilha reparada.

 Depois do conserto, verifiquei a forma de onda dos sinais de CLOCK e SHIFT/LOAD. Desta vez estava tudo certo!  Até os picos que apareciam no sinal de "NOP" e a sensibilidade quando se tocava a linha DD6 desapareceram.
Formas de onda como esperado agora!
Formas de onda boas, o próximo passo foi ligar o monitor. Agora sim... SUCESSO!!!



 

O próximo passo vai ser soldar os pinos para os conectores do teclado e testar se a leitura e escrita no cassete estão funcionando.





















sexta-feira, 15 de maio de 2015

Ressuscitando um TK85 (3)

Hoje não foi um dia muito frutífero, mas a pesquisa continua...

Em primeiro lugar tive que conectar a placa do TK a um monitor. Como a TV de 5" cabe melhor na bancada do que o monitor LCD eu montei num protoboard uma versão melhorada do A/V Treloaded que usa menos componentes e tem melhor desempenho. Por desempenho entenda-se que a saída tem impedância de 75Ohms e acoplamento DC.  Eu batizei o circuito de 'TK85 AV Tetraloaded'. Poderia também ser Treloaded Plus, mas como eu na realidade removi componentes também poderia ser Treloaded Minus. Enfim, segue anexo circuito.

TK85 A/V Tetraloaded
Diagrama do circuito.

Depois de ligado o circuito na TV a imagem que apareceu estava cheia de artefatos, o que confirmou as observações de anteontem no osciloscópio.

Artefatos na tela.

Nas minhas observações o que achei estranho é que o registrador de deslocamento IC9 (Ls165) está recebendo dois pulsos de load dentro de um mesmo ciclo M1. Não me lembro de ser assim no outro TK.

Azul: SH/LD de IC9. Barras verticais: Ciclo M1
Uma coisa que achei estranha é que quando a ponta de prova é colocada na linha DD6, a imagem fica praticamente sem artefatos, muito embora o K do cursor tabém não esteja OK nessa situação.

Ao se encostar na linha DD6 o padrão de artefatos muda.
Fiz alguns testes mas nada conclusivo. Cheguei a desconfiar de alguns sinais e troquei os circuitos integrados IC5 e IC15 porém a situação continuou a mesma.
IC5 e IC17 com soquetes.

Também troquei as memórias por outras que eu tinha aqui mas a situação continuou igual. Só mudou um pouco os padrões na tela.

Amanhã vou anotar algumas formas de onda do TK que está bom e usar como comparação.