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.
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;
#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
//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
//Datos a mostrar en cada 74164
byte const ByteDatosSalida[3]={
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++;
}
}
}
//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[
//Demora de carga de datos
delay_ms(30);
//Clock a nivel alto
output_high(CLK);
//Incremento del contador del while
}i++;
}
}
}
hola buen día podría explicarme la función AND output_bit(DATO,valor&bitMask[j]);
ResponderBorrarno entiendo que funcion tiene la mascara de bits
gracias
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.
BorrarFijate 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!
hola excelente publicación bien explicada gracias pero si quisiera usar registros
ResponderBorrartanto 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
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.
BorrarAl 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.
Hola, soy Rodrigo y me puedes recomendar la mejor forma de aprender a programar en c?
ResponderBorrarActualmente sé programar en pic basic pro, pero quier aprender en c.
gracias.
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.
BorrarSaludos.
Se debería conectar un resistor de 220ohms a cada pin de los displays de 7 segmentos, cierto?
ResponderBorrarHola, contestando anonimo, seria lo mas normal, de poner unas resistencias a cada segmento de 220 a 330 ohmios.
ResponderBorrarHola 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