sexta-feira, 6 de junho de 2014

Temporização da leitura do teclado nos TKs

Em muitos micros da década de 80 a leitura do teclado utiliza duas operações, sendo uma de escrita, onde se seleciona a linha desejada e outra de leitura, onde se obtém o estado das teclas da linha selecionada.

Como exemplo segue parte da rotina SENSMAT do MSX

...
1459  OUT (0AAh),A
145B  IN A,(0A9h)
...

Nos TKs (e ZXs) a seleção da linha é feita utilizando-se a parte alta das linhas de endereço, o que implica que a seleção da linha ocorre na mesma instrução que a leitura.

...
;; KEY-LINE
L0296:  IN A,(C)
...

Nos TKs o clock do Z80 é de aproximadamente 3,57MHz, o que significa que cada ciclo de clock dura aproximadamente 280ns.

Olhando-se o diagrama de temporização do manual do Z80 podemos então ter uma idéia da temporização envolvida na leitura do teclado dos TKs:


A execução da instrução "IN" dura 4 ciclos de clock : T1, T2, TW e T3.

Logo no início do ciclo T1, o Z80 ativa a linha de endereços. Nesse momento acontece a seleção da linha. A partir deste momento, o barramento de endereços fica estável até o final da execução.

Logo após o início do ciclo T2, os sinis /IORQ e /RD são ativados. Só a partir deste momento é que é possível identificar que o TK está fazendo a leitura do teclado.

Ao final do ciclo T2 o Z80 insere automaticamente o ciclo de espera TW. É neste momento (mais precisamente na borda de descida do CLOCK) que o Z80 faz a amostragem do sinal /WAIT. O tempo transcorrido desde a descida do sinal de /IORQ à amostragem do sinal de /WAIT é de aproximadamente 390ns

Quando acontece a borda de descida do sinal de CLOCK no ciclo D3 o Z80 amostra o estado das colunas, Mas note que é necessário que o sinal de dados seja válido um pouco antes, para que o Z80 consiga armazenar internamente o estado das linhas de dado (tempo de acomodação). Com isso o tempo transcorrido entre a descida do sinal de /IORQ e os dados estarem estáveis no barramento para serem lidos pelo Z80 é de aproximadamente 600ns

Um pouco após a leitura, ainda no ciclo T3 os sinais/ IORQ e /RD são desativados.

Em resumo:
 - O tempo de resposta para a ativação do sinal /WAIT do Z80, caso este seja utilizado, é de apenas 390ns
- O tempo de resposta necessário para ativar o valor das colunas (teclas) no barramento do Z80 é de apenas 600ns

Estes tempos caem para 350ns e 560ns se considerarmos uns 40ns de atraso nas lógicas de decodificação.

Para se ter uma idéia dos requisitos necessários a um microcontrolador para atender a estes tempos, vamos considerar alguns exemplos:

AVR:
A latência mínima para atender a uma interrupção é de 7 ciclos de clock

Para acionar um pino de saída, no caso o WAIT são necessários mais pelo menos 2 ciclos de clock. No total temos então 9 pulsos de clock.
Para atender isso em menos de 350ns o AVR precisaria de um clock de aproximadamente 26MHz

...
  IRQ:                 ; 7 ciclos de latencia
  cbi   PORTB,WAITPIN  ; 2 ciclos de clock
...

Já para o caso de escrever diretamente na porta de saída precisamos de uns 12 ciclos. Para atender isso em menos de 560ns precisaríamos de um clock de  21,5MHz

...
  IRQ:                 ;  7 ciclos de latencia
  in SavStatus,SREG    ; +1 Salva Status
  in YL,PIND           ; +1 lê o valor das linhas A8..A15
  ld temp,Y            ; +2 temp=memoria[YH:YL]->prepara dado
  out DDRB,temp        ; +1 escreve dado
                       ;=12 ciclos
...

 Uma solução intermediária é utilizar um flip flop para gerar o sinal de /WAIT ao mesmo tempo em que ativa uma interrupção no microcontrolador. Com isso o Z80 passa a esperar microcontrolador ler as linhas de endereço, preparar o dado para a saída, depois escrever a saída e finalmente ativar o flip flop de forma a liberar o Z80.



Nenhum comentário: