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.




Nenhum comentário: