2 de ago de 2012

Expansão de I/O - 74HC165

Quando precisamos utilizar um grande número de pinos de I/O em um microcontrolador e não os dispomos, podemos fazer uso de vários recursos, dentre eles a técnica de multiplexação de pinos ou a utilização de registradores de deslocamento.

A última técnica foi utilizada neste projeto com o intuito de demonstrar como conectar cinco teclas e um encoder rotativo (potenciômetro sem fim) ao microcontrolador utilizando apenas 3 pinos de I/O.

74HC165

74HC165

O circuito integrado 74HC165, consiste de um conversor paralelo serial de 8 bits que pode funcionar em uma frequência máxima de operação de 10MHz, possui dois pinos de clock, sendo um deles atribuído para inibição do mesmo possui ainda, um pino responsável pelo carregamento  das informações contidas em suas entradas para um latch interno que é transferido posteriormente de forma serial a cada pulso de clock.

Portanto, para transferirmos a informação contida em suas entradas, precisamos primeiramente carregar estas informações e  depois aplicar 8 pulsos de clock.

Neste exemplo conectamos um encoder rotativo com push-botton e mais 4 chaves tact, onde a cada 1ms obtemos seus estados que ficam armazenados na variável Teclas_8bits.

Encoder

O esquema abaixo utiliza um CI 74HC165 conectado ao hardware escolhido.

Esquema

Podemos efetuar a conexão de mais de um CI 74HC165 para obtermos um maior número de I/Os disponíveis, no exemplo abaixo podem se ver a utilização de dois CIs contendo o total de 16 chaves tacts.

2x74hc165


Software

O software responsável pela leitura do 74HC165 consiste basicamente de um loop for para deslocar os bits e armazenar os valores na variável que irá conter os estados das entradas, neste processo efetuamos o uso de lógica digital para trabalhar os bits da variável, isto é feito dentro da rotina SN74165_8bits().

unsigned char SN74165_8bits()
{
char count;
char bitval;
char teclas_8bits = 0;
Clock = 1;
Load = 0;
Load = 1;
Clock = 0;
for(count=0; count<8; count++)
   {
    bitval = Ser_in;
    teclas_8bits |= (bitval << (7-count));
    Clock = 1;
    Clock = 0;
   }
return(teclas_8bits);
}

Na linha abaixo podemos observar a aplicação de diversos recursos disponibilizados pelo compilador, para que seja possível maximizar a eficiência do código gerado, sendo a utilização de agrupamentos de operadores e a análise de mais de uma condição na mesma linha de comando.

teclas_8bits |= (bitval << (7-count));


Análise dos sinais de controle

Utilizando a ferramenta de Analisador Lógico disponível na placa PK2Lab podemos observar o funcionamento do código e obter os tempos de clock e load aplicados no CI.

Captura 1


Nesta tela acima podemos observar os sinais Load no canal 1, o sinal Clock no canal 2 e a resposta do CI 74HC165 através do sinal Ser_in no canal 3, neste caso os bits dos dois últimos pinos estão em nível alto.

Captura 2

Nesta tela podemos ver o primeiro e último pino em nível alto.

Na aba de trigger, o ajuste [ Ch1=\ ] indica  que o sinal começará a ser capturado quando o pino Load, passar do nível alto para o nível baixo, ou seja, o sinal de trigger ou disparo é sensível a borda de descida.


DSC00948

Código do projeto