Hay varios tipos pero los que aquí nos interesan son los del tipo Serial-Paralelo y Paralelo-Serial, esto significa que en el primer caso los bits "entran" en forma serial (uno a uno) y "salen" de forma paralela, en el segundo caso entrar en paralelo (todos juntos) y salen en serie.
Unos de los integrados que hacen esto, entre muchos otros, son el 74HC595 y el 74HC165, que son Serial/Paralelo y Paralelo/Serial respectivamente.
El pinout del 74HC595 es el siguiente:
Los pines marcados como Q0-Q7 son salidas y reflejan el estado interno de cada bit cuando es activado poniendo a nivel alto el pin 12 (STCP), los datos ingresan de forma serial por el pin 14(DS) cada vez que el pin SHCP pasa de estado bajo a alto ( de 0v a 5v).
También se pueden enlazar varios integrados iguales de modo que ampliamos la cantidad de bits. para ello agregamos un segundo integrado y conectamos la patilla DS a la patilla Q7' del primero.
La secuencia seria la siguiente:
1.Se pone el pin DS en el estado del bit que se quiera ingresar
2.Pin SHCP en bajo
3.Pin SHCP en alto
4.Se repite el proceso hasta enviar los 8 bits
5.Se coloca el pin STCP en bajo
6.Se coloca el pin STCP en alto
y de esa forma aparece el byte en las salidas.
Pinout del 74HC165:
De manera similar funciona el 74HC165 solo que a los bit los "lee" todos juntos.
Aquí las entradas son D0 a D7 y la salida es Q7, PL es el Load y cuando pasa a estado bajo carga los valores de las patas D0-D7 en "memoria" y dandole pulsos altos y bajos a CP los datos van saliendo bit a bit.
Para encadenar varios basta con conectar Q7 de un integrado con DS del siguiente y leer la pata Q7 del último.
Este es el diagrama de conexión para leer 16 bits (2bytes) con dos integrados enlazados:
La forma de proceder sería asi:
Se pone en bajo el Load para tomar el estado de todas las entradas (b0 a b15) luego se envia la señal de reloj poniendo en bajo y luego en alto Clk y se lee el estado de DI (Data-In). Recordar que en DI aparecerá primero el bit mas significativo (MSB).
Esta técnica es válida para controlar un display LCD, o multiplexar cualquier dato.
Aquí esta el código en CSS C:
#include <16f84a.h> #define Clk Pin_A0 #define Load Pin_A1 #define DI Pin_A2 #use fast_io(a) #use fast_io(b) int Leer_Shift (void); void main(void){ set_tris_A(0b10100); set_tris_B(0b00000000); do{ if (input(pin_a4)==true) output_b(leer_shift()); }while(true); } int Leer_Shift (void){ int t; int Lectura=0; output_low (Load); // Pongo a low Load para "cargar" el estado de las output_high(Load); // entradas y paso a high para poder leerlas. for(t=0;t<=7;++t){ // Hago un ciclo de 8 pasos (0 - 7) Lectura<<=1; // Roto los bits de la variable temporal Lectura+=input(Di); // y le sumo el valor del ultimo bit leido output_low(Clk); // La transicion low-to-high hace que la output_high(Clk); // memoria interna del integrado rote. } return Lectura; }
En el ejemplo, Clock se conectaría al pin 0, Load al pin 1 y DI al pin 2 del Puerto A. Pero este programa solo leerá de b8 a b15, para leer b0 a b15 se deberá usar Int de 16 bits para guardar los datos o dos de 8 bits y guardarlos en variables diferentes. Aparte de todo esto se deberá hacer un bucle de 16 ciclos en lugar de los 8 para leer 1 byte.
Con este circuito el único pin exclusivo para el funcionamiento del registro es el pin A2 (Data in) ya que los otros se pueden conectar a otros circuitos sin que afecten a este.
SiLMuP (todavía en construcción) utiliza un 74HC595 para controlar el display LCD y por el mismo bus controlar las teclas de función y un 74HC165 para leer el estado de los sensores de líneas.
De esta forma controla un display LCD, 4 teclas de función, 8 sensores siguelineas, y proximamente mas sensores y bumpers para obstaculos con 6 pines del pic y solo 3 son exclusivos.