sexta-feira, 8 de dezembro de 2006

Registradores de deslocamento: Mais testes

Apesar do longo tempo que se passou deste a última postagem sobre o leitor de MMC, as atividades de desenvolvimento não pararam. Este tempo foi gasto na investigação de um funcionamento errático do circuito, mais especificamente do registrador de deslocamento de entrada, o 74*595.

O que acontecia é que quanto este registrador continha valores com muitos bits 1, isso bagunçava de alguma maneira o barramento do MSX, gerando um "glitch" no sinal IORQ. Este "glitch" bagunçava toda a sistemática do gerador de clock automático.

Descobrir este problema não foi tarefa fácil, e no momento ainda não tenho causa certa, mas tudo leva a crer que seja causado por incompatibilidade entre a família lógica "HC", do registrador de deslocamento, e a lógica interna do MSX, baseada em chips LS. Um mau funcionamento era até de certa forma esperado, pela mistura de famílias lógicas, mas nunca imaginei que isso fosse bagunçar o próprio barramento do Z80.

Para chegar onde cheguei, foram necessárias várias e várias horas de testes, checando suposições. A descoberta do "glitch" só foi possível por causa de uma das ferramenteas de auxílio à construção do circuito: Um contador externo. Se eu tivesse um osciloscópio talvez já tivesse detectado o problema e resolvido há mais tempo. Utilizando-se o contador, observa-se que quando o "glitch" aparece, em vez da contagem avançar de 1 em 1, ela avança de 2 em 2.

Em linhas gerais, o processo de eliminação do problema consistiu em checar se o endereçamento era feito corretamente. Foi onde se descobriu aparecimento eventual do "glitch".

Em seguida, descobriu-se uma condição específica que fazia o "glitch" aparecer, que era a leitura de um valor "FF".

Depois isolou-se o sinal que transfere os dados do registrador de deslocamento para o latch interno do 595, onde se constatou que o simples recebimento serial do valor "FF" não causava o surgimento do problema.

Depois constatou-se que o problema estava do "latch" interno do 595 para o buffer de saída.

Depois foi preciso isolar todos os circuitos restantes da linha em que o "glitch" aparecia. Tentou-se islolar o sinal de saída do segundo decodificador via um buffer, mas o "glitch" continuava aparecendo.

Em seguida foi feito um programa em assembler que desabilitava todas as outras interrupções, e fazia uma leitura na porta 12. O "loop" de atraso ("delay") é para poder acompanhar visualmente o acendimento dos LEDs do contador.
ORG 9000H
DI
LOOP: LD HL,5FFFH
IN A,(12)
DELAY:
DEC HL
LD A,L
OR H
JR NZ,DELAY
JR LOOP

Com esse programa rodando, descobriu-se que o "glitch" surgia na própria linha IORQ do Z80!

Para eliminar a possibilidade de que qualquer leitura de um valor FF pudesse proporcionar um "glitch", o programa acima foi adaptado para ler a matriz do teclado do MSX, que retorna o valor "FF" se nenhuma tecla estiver sendo pressionada (li a linha 0 do teclado). Nessa situação, o "glitch" não acontecia, o que era bom sinal.

Em seguida, o 74HC595 foi desconectado e em seu lugar foi conectado um 74LS244, cujas entradas foram conectadas a um resitor de pullup com um jumper para selecionar um valor "0" ou "FF". Com este circuito, foi possível ler (tanto o valor "0" quanto) o valor "FF" sem que o "glitch" surgisse.

Conclusão: O 74HC595 é inadequado ao circuito. Em seu lugar tenho como opções imediatas:

1) Utilizar um 74HCT595, compatível com a família LS
2) Utilizar um 74HCT4094


74LS244 em teste, no lugar do HC595

Nenhum comentário: