Flip-flops e Shift-registers

Galerinha, certeza que vocês passarão o mesmo dilema que um dia passei: um MCU de 8 pinos é pequeno (poucos pinos de IO) e um de 16 é grande demais para o circuito. Qual a saída? E se eu precisar me lembrar de um bit e não quiser gravá-lo na memória do MCU? O que fazer? Descubra agora nessa aula!

Flip-Flops

Não vou explicar todos os tipos de flip-flops: darei um resumo geral sobre eles e explicarei apenas sobre os flip-flops do tipo D.
Os flip-flops, resumindo, são uma espécie de memória de estado ou bit, ou seja, você insere um dado nele e ele retém até que seja mudado ou apagado. O tipo de Flip-Flop que explicarei aqui é o do tipo D (existem outros, como o JK, RS dentre outros), que é o mesmo do CI4013, bem conhecido até.

Símbolo do Flip-Flop do tipo D
Este aí é o símbolo do Flip-flop do tipo D (o 4013 possui dois dentro). A função dos pinos seguem abaixo:

-Pino D: é a entrada de dados: 0 ou 1 lógico;
-Pino > (ou também referido por C ou CLK): é o clock: um pulso e o dado inserido no pino D é inserido nas saídas;
-Pino Q e Q: são as saídas, onde Q é a saída não-invertida (insere 1 sai 1, insere 0 sai 0) e Q é a invertida (entra 1 sai 0, entra 0 sai 1);
-Pino S: pino SET, quando colocado no nível lógico 1 colocará a saída Q em 1;
-Pino R: pino RESET, quando colocado no nível lógico 1 colocará a saída Q em 0.

No Flip-Flop do tipo RS você não terá os pinos CLK e D, ou seja, você usará os pinos R e S para controlar a saída.

Este é um CI TTL, ou seja, nenhuma entrada deve ser deixada flutuante! Se for ligar um interruptor, por exemplo, você terá que colocar um resistor de pull-up/down dependendo do caso, para quando o interruptor estiver aberto não deixar a entrada flutuante.

Para você entender o funcionamento, colocarei aqui três circuitos práticos para você montar na protoboard e entender:

1. Liga e deliga LED com apenas um botão

OBS: Ligue o pino 16 no positivo (5V) e o 7 no negativo.
O funcionamento é o seguinte: suponhamos que o circuito comece com a saída Q em 1: logo a saída Q estará em 0. Como a saída Q está ligada na entrada D, quando você apertar S1, dando um pulso no clock, o 0 será inserido no pino Q, desligando o LED. Como foi inserido um 0 em Q, Q está agora em 1 e se você der outro pulso de clock, este 1 será inserido em Q e levará Q a 0. "Sacou a jogada?".
R1 é o resistor de pull-down que eu havia falado acima, para não deixar a entrada flutuante e C1 é um capacitor para filtrar os ruídos do chave S1. Perceba que coloquei um transístor para ligar o LED: necessário pois o 4013 não possui grande capacidade de fornecimento.
S e R ficam ligados no negativo.

2. Definindo o estado inicial



Este circuito faz exatamente a mesma coisa que o anterior, mas veja o conjunto C2 e R4: perceba que no nó central deles é ligado o pino R, e apenas S está ligado ao negativo. C2 e R4 gerarão um pulso único pulso positivo no pino R devido ao tempo de carga de C2 (enquanto carrega, sua resistência estará baixa). Após C2 se carregar, R4 colocará o pino R no nível baixo (0).
Qual a utilidade disso? Os flip-flops, ao serem ligados, colocarão um nível aleatório na saída Q, e com esse conjunto (C2 e R4) agora você consegue definir qual será o estado inicial do circuito ao ser ligado, que no nosso caso, fara o LED iniciar desligado. Se quiser que o LED comece ligado, apenas inverta C2 com R4 ou então ligue o RESET (pino R) no negativo e o SET (pino S) no nó central do conjunto C2/R4.

3. Escolhendo o bit



Neste circuito, você poderá selecionar o bit a ser guardado através de S2. Escolha o bit e pressione S1 para transportar o bit para as saídas. Pode-se usar o truque do circuito acima para se definir o estado inicial.


Espero que você tenha entendido (na verdade espero que eu tenha explicado bem) o funcionamento deste flip-flop. Nesta página existem alguns exemplos de circuitos com Flip-Flops (alguns até passivos, ou seja, sem usar flip-flops mas tendo um circuito de mesma função. Achei esta página muito interessante).

Shift-Register

Imagine agora, se você pegar o primeiro circuito e cascatear os flip-flops? Observe o esquema abaixo:

Imagem pega "emprestada" da Wikipedia 
 Veja que todos os clocks estão ligados juntos, e a entrada D do próximo Flip-flop está ligada na saída Q do anterior.
 Suponhamos que inseri o valor 1 em Data In e dei um clock: Q1 ficará em 1 certo? Agora eu coloco 0 em Data In e dou outro clock: Q1 ficará em 0 e agora Q2 ficará em 1, ou seja, desloquei o bit! Como? Observe o esquema novamente: como o pino D do segundo flip-flop está ligado ao pino Q do primeiro, o dado no segundo será o antigo dado inserido no primeiro, pois este estava em Q! E a cada clock, você deslocara o bit: eis um shift-register ou registrador de deslocamento! Pode parecer confuso mas você entenderá.

Existem dois tipos de shift-registers: os SIPO (serial input parallel output) e os PISO (parallel input serial output). O do esquema acima é um SIPO, ou seja, você terá uma entrada serial e uma saída paralela. Os do tipo PISO você terá várias entradas e, a cada clock, você terá o dado de uma entrada na saída, sendo que a cada clock, você terá o dado da próxima saída. Observe:

Outra da wikipedia.
Os do tipo SIPO são geralmente usados para se ampliar o número de saídas de um Microcontrolador, e os PISO, o número de entradas. Nesta postagem, vou me ater apenas aos SIPO, pois este é o que usei até agora (e até porque entendendo um você entenderá o outro).

No nosso caso, usaremos o CI 74HC595, um shift-register bem barato com 8 saídas, ou seja, um byte de saída. Abaixo segue o esquema interno e a pinagem:

Imagem retirada do datasheet da ST. Veja que o esquema real é um pouco mais complexo do que o mostrado no início.


A função dos pinos segue abaixo:

-QA a QH: saídas (8 no total - um byte);
-QH':a saída do último flip-flop (vide esquema interno). Algo "equivalente" à QH (útil quando for feito o "cascateamento" deles);
-SRCLR: limpa os flip-flops de entrada;
-SRCLK: clock de entrada;
-SER: entrada serial de dados;
-RCLK: clock do registrador (transfere os dados dos flip-flops de entrada para os de saída);
-OE (ou G): Habilita as saídas do CI.

O funcionamento é bem simples:
Em SER inserimos o bit, e ao dar um pulso em SRCLK, inserimos esse bit em QA. Ao inserirmos outro bit e dar outro clock, esse bit será inserido em QA e o bit que estava em QA passará para QB. Quando tivermos inseridos o byte completo, ou seja, 8 bits, daremos um pulso em RCLK e transferiremos os bits dos registrados de entrada para os de saída, tendo então os valores agora nas saídas. Se precisarmos limpar os registradores de entrada, basta dar um pulso em SRCLR. Lembrando que ele limpara APENAS o registrador de entrada! Para limpar as saídas, de um pulso em SRCLR e depois em RCLK!
Resumindo:
-SER: bit a ser inserido;
-SRCLK: inserimos o bit de SER em QA;
-RCLK: os bits vão para as saídas correspondentes.

O circuito a seguir exemplifica a ligação do 74HC595 com LEDs:



Este é o circuito básico e pronto para ser ligado em um microcontrolador.
Um rápido exemplo de controle: caso você queira acender apenas o LED 4, você deve enviar o valor $10 (hexadecimal) ou 010000 (binário). Se você quiser acender os LED 7 e 2, enviará $42 ou %01000010. Perceba que os valores aqui serão espelhados: o bit 0 do byte enviado corresponde à saída QH, o bit 1 à QG, o bit 2 à QF e assim por diante. Porquê? Essa eu deixo para que vocês expliquem (isso ajudará a você entender bem a teoria por trás do funcinamento).

Caso você precise ligar mais Shift-Registers, siga o esquema abaixo:


Sempre que precisar mais faça como no esquema: ligue a saída QH' na entrada SER do próximo shift-register.
Agora, como temos dois Shift-registers, precisamos de 2 Bytes (ou 16 bits. No mikrobasic, pode-se usar uma word).

Bem pessoal, espero ter sido útil. O próximo post será um exemplo prático do uso de shift-registers com um PIC. Abraços e até a próxima!


Sim, foi feito com a ajuda de Shift-registers.
Essa "travada" é culpa da câmera!

Comentários

  1. Muito bom material. Gostaria de ver um tutorial completo de uma matriz de leds, com caracteres 8x8 rolantes, usando um pic 16F628A, uma memoria externa , registradores de deslocamento e codigo bem comentado, explicando passo a passo o que esta sendo feito. Espero ver este post em breve.Parabens pelo blog e pelo material disponibilizado, muito bom mesmo...

    ResponderExcluir
    Respostas
    1. Cara, esse vai demorar! e muito haha! Ainda to tentando aprender a escrever codigos rolantes na matriz e usar memória externa...Obrigado pelos elogios.

      Excluir
  2. Parabéns pelo artigo. É difícil achar conteúdo sobre eletrônica simples que contemple a prática citando o nome comercial do componente (no caso o 74HC595). Obrigado.

    ResponderExcluir
    Respostas
    1. Obrigado pelo comentário! Este é justamente o foco do blog: ir de forma direta e simples ao assunto. Muito obrigado.

      Excluir
  3. muito legal, vc sabe se tem como montar o mesmo flip flop mas com o ci 555 e da mesma forma que o estado inicial dele ao ligar seja sempre alto ?

    ResponderExcluir
    Respostas
    1. Não consegui imaginar como fazer tal circuito com o 555. Talvez se pesquisar na internet "flip-flop com 555" ache algo, aí no pino que colocará a saída dele em alto aplique a mesa técnica aplicada aqui.
      Abraços.

      Excluir

Postar um comentário