Registro de Desplazamiento 74164 con CCS


En esta nota les mostrare la forma sencilla de utilizar los registros de desplazamiento 74164 con un microcontrolador PIC compilado con CCS.

La idea de este dispositivo es ingresar los bit de forma serial junto a un clock, de esta forma los bit ingresados serie se mostraran en la salida de cada flipflop de forma paralela.

Para comprender aun más esto podemos visualizar el diagrama lógico del integrado.


Como podemos ver es simplemente un array de flipflop tipo D, donde el dato ingresado va pasando secuencialmente de un FF al otro mediante un pulso de reloj por ciclo, es decir ingresamos el primer bit, enviamos un pulso de clock y ese bit pasa de un FF al otro, dejando libre el primero para ingresar el segundo bit, así sucesivamente hasta que se completen los 8bit a mostrar.

Ahora les mostrare dos posibles aplicaciones en un circuito electrónico con Displays de 7 segmentos y con Leds.


Claramente en el circuito con displays use solamente 3 a modo ejemplo pero podría decir que es infinita la cantidad de displays a utilizar ya que los 74164 se pueden concatenar uno tras otro, la limitación se encuentra en el microcontrolador que debe tener memoria suficiente para almacenar la cantidad de datos necesarios a representar.


El circuito con leds es el mismo que el de displays pero en lugar de mostrar los números en displays se muestra cada bit de salida de los registros de desplazamiento a modo de crear por ejemplo un juego de luces.
Nótese que el último bit del 74164 es el que alimenta la entrada del siguiente.


Ahora vamos con el programa, se utiliza un PIC de la línea 12F ya que no necesitamos una gran cantidad de pines ni de procesamiento para realizar esta práctica.

El programa hace lo mencionado al principio, Pone el bit en la entrada de dato del 74164 y luego envía el pulso de clock para que este de desplace al FF siguiente. 

Esta tarea se realiza 8 veces para completar los 8bit de cada 74164, luego a su vez esta tarea se realiza 3 veces ya que son 3 los 74164, y cada vez que se realiza se modifican los bit a mostrar en los registros ya que la idea es mostrar datos diferentes o bien en este ejemplo que se lea 1,2,3 en los displays.

La forma de manejar estos 3 datos es cargando la palabra de 8bit de cada display en un vector y luego al recorrer este vector se mueve a la variable valor, una vez esto se ingresa al bucle que se encarga de cargar los 8bit en el 74164, la forma de utilización de esta, es aplicando una máscara mediante la función lógica AND y comparando contra un vector que posee los bit que queremos mostrar de forma ponderada (2,4,8,...,128).

#include <12F675.h>
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOCPD
#FUSES NOPROTECT
#FUSES NOMCLR
#FUSES NOPUT
#FUSES NOBROWNOUT
#use delay(int=4000000)
#define DATO PIN_A1
#define CLK  PIN_A0
void main(){
   int i,j;      
   byte valor;
//Variables para mascara  
   byte const bitMask[8]={1,2,4,8,16,32,64,128}; 
//Datos a mostrar en cada 74164    
   byte const ByteDatosSalida[3]={0b11110010,
                                  0b11011010,   
                                  0b01100000};
   while(true){

//Ciclo de recorrido de los tres 74164
      while(i<3){ 
//Intercambio de variables
         valor=ByteDatosSalida[i];  
//Rrecorrido de cada bit del 74164
         for(j=0;j<8;j++){ 
//Clock a nivel bajo 
            output_low(CLK);

//Salida de dato para 74164 con aplicación de mascara "&"
            output_bit(DATO,valor&bitMask[j]); 

//Demora de carga de datos
            delay_ms(30);  
//Clock a nivel alto
            output_high(CLK); 
//Incremento del contador del while
         }i++;  
      }
   }
}






 

9 comentarios:

  1. hola buen día podría explicarme la función AND output_bit(DATO,valor&bitMask[j]);
    no entiendo que funcion tiene la mascara de bits
    gracias

    ResponderBorrar
    Respuestas
    1. Hola como estas?, esa funcion es para realizar una mascara, la mascara es solamente para asignar un valor determinado de salida cuando tenes (al mismo tiempo) un valor en otra variable. En este caso hay un puerto que genera un barrido para el desplazamiento y luego para sincronizar este barrido con los datos, se va preguntando valor 1 a 1, es decir, con la funcion logia AND preguntas si el dato es 1 o 0, si es 1 lo envia a la salida y si es 0 no, esto lo hace para todo el vector, entonces al usar la funcion AND, si existe un 0, la multiplicacion por 0 siempre dara 0, entonces solo se enviara a la salida el DATO cuando el valor sea 1. Es un proceso que seria mas sencillo de comprender tal vez en un papel y plantear un ejemplo de valores, entonces vas aplicando al ejemplo la funcion AND y vas analizando el resultado.
      Fijate si podes ver alguno de los videos de la matriz 8x8 que tengo en youtube que explico el tema de la mascara de bits.
      Saludos!

      Borrar
  2. hola excelente publicación bien explicada gracias pero si quisiera usar registros
    tanto para filas como columnas para una matriz mas grande 32x32 tendria que repetir
    este programa para cada registro o que cambios tendria que realizar gracias

    ResponderBorrar
    Respuestas
    1. Hola, como estas, en realidad el programa ya esta echo para salir con un registro solo mediante RA0 y RA1, si queres poner otra expansion serial tenes que usar otros pines diferentes, por ejemplo RA2 y RA3, o los que elijas.
      Al programa que ya esta echo acá podes agregarle 32 salidas pero de la manera que esta planteado este programa no te conviene tanto, te diria que mires este otro link que esta mas optimizado para manejar 32 salidas.
      http://electgpl.blogspot.com.ar/2015/12/matriz-8x32-scroll-ampliable.html
      Saludos.

      Borrar
  3. Hola, soy Rodrigo y me puedes recomendar la mejor forma de aprender a programar en c?
    Actualmente sé programar en pic basic pro, pero quier aprender en c.

    gracias.

    ResponderBorrar
    Respuestas
    1. Hola, como estas?, es muy diverso el mundo de la programación, Tanto PIC como AVR tenes mucha bibliográfica sobre programación en C, hay muchos foros en español sobre PIC y AVR. Dentro de AVR tenes Arduino que si bien no es un C estándar como el de PIC, es similar y podes aprender con el, aunque te recomiendo que si vas a aprender C sobre AVR comiences con AtmelStudio con el compilador AVR-GCC que es C puro sin modificaciones como el Wiring de Arduino. Sino tenes C para PIC con CCS, MikroC, XC8, etc... son distintos compiladores pero son todos C puro como AVR-GCC.
      Saludos.

      Borrar
  4. Se debería conectar un resistor de 220ohms a cada pin de los displays de 7 segmentos, cierto?

    ResponderBorrar
  5. Hola, contestando anonimo, seria lo mas normal, de poner unas resistencias a cada segmento de 220 a 330 ohmios.

    ResponderBorrar
  6. Hola Electgpl. Muy bien este ejemplo, para un 74LS164, te pediria si me podias enviar un codigo para un CD4094, ya que este usa tres hilos, y me gustaria encender una fila de 16 led's independientemente. pondria un 12F675 y dos 4094. muchas gracias.

    ResponderBorrar