sábado, 25 de fevereiro de 2012

Medição dos tempos

Com o circuito ligado no MSX, mas ainda sem o sinal /Wait conectado ao barramento, fiz a medição dos tempos. O resultado encontra-se nas fotos abaixo.

A primeira foto está na escala de 500ns por divisão. O canal superior foi tomado no pino 5 do HCT139 e mostra a decodificação dos sinais [A0*/CS*/RD], ou seja o momento em que o MSX lê a porta B da PPI. O canal de baixo foi tomado na saída /Q do flip flop e mostra o tempo em que o sinal /WAIT fica acionado que corresponde ao tempo que o microcontrolador (ATMEGA8 @8MHz) leva para reconhecer a interrupção, ler os bits da porta C da PPI, colocar o dado correspondente na porta de saída e limpar o flip-flop para liberar o Z80. Tudo isso é feito em aproximadamente 4us.

500ns por divisão

A segunda foto foi tirada na escala de 50ns por divisão e mostra o "pulo do gato"...
O canal de cima continua indicando a decodificação do sinal de leitura da porta 0xA9 do Z80. Já o canal de baixo mostra o sinal de CLOCK do Z80. Note que o tempo que esse sinal permanece em nível baixo é de aproximadamente 700ns.  Pois bem, por volta de 50ns antes da subida deste sinal fica a borda de descida do pulso T3 que é o momento em que o Z80 efetivamente amostra o sinal da instrução IN. Só que o dado já tem que estar estável no barramento um pouco antes, mais ou menos uns 75ns (aproximando pelo desenho do data sheet). Assim, temos um pouco mais de 500ns para responder ao Z80, e isso é bem difícil de fazer com um microcontrolador sozinho. Aí é que está o pulo do gato.

50ns por divisão. 

A terceira foto também está na escala de 50 ns e mostra o tempo decorrido desde a descida do sinal do decodificador (canal de cima) até o momento do acionamento do flip flop (canal de baixo). Este tempo corresponde aos atrasos da primeira metade do HCT139. Deve-se levar em conta ainda que antes do decodificador do meu circuito ainda há mais atrasos, devido ao decodificador da PPI (interno ao MSX) e também o buffer dos sinais de controle do Z80 (pelo menos o Hotbit tem esse buffer). Então, observando a a foto anterior, a borda de descida do sinal de decodificação está um pouco depois do meio da parte alta do pulso de clock T2, enquanto no data sheet do Z80 os sinais /IORQ e /RD descem logo após a borda de subida do pulso T2.

50ns por divisão


2 comentários:

Anônimo disse...

E ai Daniel! Por acaso vc já deu uma olhada nesse link?
link: http://www.caro.su/msx/kbd4msx.htm

Acho que pode te ajudar em alguma coisa.

Ademir Jorge

Danjovic disse...

Obrigado pelo link.
Dei uma olhada no código desse adaptador. Ele usa interrupção por mudança de estado das portas, e gasta entre 9 e 11 ciclos de clock para responder com o dado. Usando o clock interno de 8MHz do AVR isso dá entre 1125 e 1375 nanosegundos. Considerando que se tem 4,5 microssegundos reais entre o OUT da instrução anterior o e IN então o tempo dá, mas é possível ter situações onde o adaptador não vai funcionar (no caso do programa dar "out" apenas uma vez e posteriormente ficar somende dando INs.