Serie a Paralelo con un 74HC595, empleo de la librería SPI

Ampliar los pines de salida digital con los que se dispone en una Placa programable ó microcontrolador, es uno de los problemas con los que en algún momento nos encontraremos, para ello existen múltiples IC's, en general todos basados en flip-flop tipo D y varias configuraciones de ellos.

Uno de los más comunes y utilizados es el integrado 74HC595. Este integrado se define como un "registro de desplazamiento de 8 bits con entrada serie, salida serie o paralelo con latch ("Registro guardado") de 3 estados.".Entonces puede usarse para controlar 8 salidas simultaneas usando unos pocos pines del microcontrolador (SERIAL). Se pueden colocar varios integrados de manera que ampliamos el numero de salidas hasta las necesitadas.

Antes de ver el IC en cuestión analicemos unos de sus componentes principales.

El Flip-Flop tipo D

Este arreglo lógico (llamado también biestable) resulta muy útil cuando se necesita almacenar un único bit de datos ("$1quot; ó "$0quot;).

El dispositivo de almacenamiento temporal es de dos estados (alto "$1quot; y bajo "$0quot;), cuya salida $Q$ adquiere el valor de la entrada $D$ (data) cuando se activa la entrada de sincronismo, $C$ (clock).

La ecuación característica del biestable D que describe su comportamiento es:

$Q_{siguiente} = D\,$

Veamos un vídeo de una simulación de su funcionamiento.


Bien, entonces son muy interesantes los flip-flop tipo D, pero no me interesa XD...

este vídeo solo es para mostrar el funcionamiento de 74595 y poder utilizarlo convenientemente.

Este es el Pinout del 74595


Este es el diagrama aproximado de configuración interna de un 74595.


Como podemos observar tiene varios de los conceptos explicados en el vídeo anterior, convierte serial a paralelo, y tiene un latch de 8 bits

Entonces para su empleo como "expansión de salidas" se necesitan al menos tres pines de comunicación serial.

  • Datos (DS).
  • Clock (SH_CP).
  • Latch ó Almacenamiento(ST_ST).

Los pines de MR y OE Realizan la función que describen, pone en cero todas la salidas de la comunicación serial (Master Reset) y coloca en alta impedancia las salidas de IC (Output enable).

Existe incorporado una función de arduino para un modulo de SPI (Serial Peripheral Interface) que si bien esta diseñado para ser mucho más potente que solo enviar datos seriales, nos evita la tarea de tener que programar la rutina que haga esto.

Para mas información sobre SIP ver >>aqui.

La función shiftOut de Advanced I/O de arduino, es una extensión de la librería SPI donde, en esta librería se pueden utilizar los pines dedicados para esta función en el arduino pero esta función permite utilizar otros por supuesto con las limitaciones de velocidad. A continuación veremos la sintaxis y parámetros de ella.

Sintaxis

    shiftOut(pinDatos, pinReloj, ordenBits, valor)


Parametros

    valor: los datos que rotar. (byte)
    pinDatos: el pin en el cual extraer cada bit (int)
    pinReloj: el pin que hay que conmutar cada vez que a un pinDatos le ha sido enviado el             valor correcto (int)

     ordenBits: en qué orden desplazar los bits; si hacia el MSBFIRST (bit más significante              primero) o hacia el LSBFIRST (bit menos significante primero).

Entonces esta función envía los datos, maneja el reloj y se encarga de ordenarlos para la transmisión, solo queda la función de latch por controlar.

Veamos el programa base para la comunicación.
//Pin conectado a SH_CP del 74HC595
int clockPin = 11;
//Pin conectado a DS del 74HC595
int dataPin = 10;
//Pin conectado a ST_CP del 74HC595
int latchPin = 9;
void setup() {
  //Configurar pines para controlar el Shift(register)
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop() {
  // Cuenta de 0 a 255 y muestra la salida en los leds
  for (int numeroamostrar = 0; numeroamostrar < 256; numeroamostrar++) {
    // Coloca el latchPin en bajo "0" para que los LEDs no cambien 
    // mientras se está enviando en bits:
    digitalWrite(latchPin, LOW);
    // cambiar los bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numeroamostrar);  
    // Coloca el latchPin en Alto "1" para que los LEDs cambien
    digitalWrite(latchPin, HIGH);
    // Retardo Antes del siguiente valor
    delay(500);
 }
}
Este es el programa utilizado en arduino para la comunicación de un 74595.
en el se toma un dato de 8 bits y se envía de forma serial cada 500ms

Los pines utilizados son:
  • Clock  11
  • Datos  10
  • Latch   9
Hay que acotar que el pin de el Latch no esta implementado en la función. El motivo de esto es que la Función fue diseñada para SPI, y este modo permite tener múltiples periféricos que escuchan los datos y son seleccionados independientemente con un pin por periférico, en este caso esta función la hace el latch.
Ahora veamos la simulación de un 74595 de forma manual y finalmente la integración con arduino.




Espero les sea util, hasta la próxima...

18 comentarios:

  1. sera que puedas dejar un link para descargar el circuito gracias

    ResponderEliminar
  2. Saludos David, primero gracias por leernos, imagino que es el archivo de la simulación, aquí te dejo el link con todos los archivos.
    https://drive.google.com/file/d/0B8Wo5H73NB9bN01KV3dLeGZpalk/edit?usp=sharing
    Saludos
    AngeleX

    ResponderEliminar
  3. saludos estimados amigos, me gustaria saber como controlar el mismo 595 pero con un pic16f877A

    ResponderEliminar
    Respuestas
    1. Hola Edgar, Primero gracias por leernos, desafortunadamente no tenemos una solucion practica con el 74595 y PIC, deberas hacer tus propias librerias, te dejo una hoja tecnica de aplicación de microchip para SPI, que te sirva como base para el diseño.
      Saludos
      AngelX
      http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

      Eliminar
  4. hola amigo muy interesante tu proyecto, estoy realizando un spokepov led rgb, por los momentos solo he diseñado un programa en visual basic que me convierte la imagen a radianes y a la vez me da la composicion de los rgb, ahora bien no tengo experiencia en arduino pero ya me estoy estudiando un libro, como puedo enviar esos datos al 74595?

    ResponderEliminar
  5. Buenisimo me despejaste algunas dudas amigo.

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Hola:

    Muy bien explicado el tema del 74HC595 como salidas digitales.
    ¿Harás algo similar con las entradas digitales como el 74HC165?

    Saludos.

    ResponderEliminar
  8. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
  9. Saludos, Muy Bien la explicación, puedo conectar 8 CI 74595 en cascada, o existe algun circuito o CI de mas salidas. tiene algun limite la conexión en cascada, Agradezco tu colaboración

    ResponderEliminar
  10. Hola,buen Blog!!,
    Podes conectar en cascada con otro registro teniendo en cuenta su clk de uno conectado al otro,Lo podes encontrar como ejemplo en web como: registro de desplazamiento en matriz"
    Saludos

    ResponderEliminar
  11. Cordial saludo, primero que gracias por la explicación, me despejaron la duda sobre el funcionmiento del IC. Una consulta, me podrian hacer el favor y decirme que software emplean para la simulación. Gracias

    ResponderEliminar
    Respuestas
    1. Hola Jeferson, gracias por leernos, si efectivamente es Proteus 8.1 de Labcenter Electronics.

      Eliminar
  12. hola, muy bueno el tutorial, me gustaria saber si me colaboraria o tienes un codigo para ir aprendiendo a controlar una matriz con arduino y el 595, me gustaria mostrar figuras y no letras, como una flecha...muchas gracias

    ResponderEliminar
  13. hola, alguien me ayudaria???..una matriz y los anodos van a arduino, los catodos al 595, pongo en alto las salidas de arduino o una sola...y toda la fila se enciende; como envio la orden al 595 para que solo encienda uno en especifico...me enseñan por favor???

    ResponderEliminar