Autor Tema: Dudas con 74LS164  (Leído 29808 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Dudas con 74LS164
« Respuesta #45 en: 27 de Julio de 2006, 12:03:00 »
Hola Elesep....a ver si esto te sirve para entender un poco mas el proyecto:

Por razones de comodidad, el proyecto se distribuyo sobre tres placas de circuito impreso diferentes. La primera de ellas, encargada de la alimentación, control lógico y la comunicación con la PC es la que incluye el PIC, corazón del proyecto. Además, en ella se encuentra la etapa de alimentación, excepto el transformador, llave y fusible que deberán alojarse en el gabinete que contenga esta placa. La alimentación esta basada en un regulador de voltaje LM7805, capaz de entregar 500mA sin disipador, y hasta 1A si lo refrigeramos convenientemente. Si sacamos algunas cuentas, veremos que gracias al multiplexado nunca debería haber más de una fila encendida al mismo tiempo, que en el caso más desfavorable tendría 32 leds encendidos. Cada LED consume unos 15 miliamperes (5V / 330 ohms = 0.015A), por lo que el consumo de la “pantalla” es de 0.015 x 32 = 480mA, si esto sumamos el consumo del resto de la electrónica, el consumo total ronda los 600mA. El LM7805 de mi prototipo apenas se entibia sin utilizar disipador.
El PIC se encarga de generar los pulsos de CLOCK y DATOs (pines 17 y 18) que son enviados a la placa que tiene los conversores serie-paralelo 74LS167N. También tiene la posibilidad de conectarse a una PC vía RS-232 (ver mas adelante) y controla los drivers que proveen la corriente que alimenta cada fila del display. Como la corriente es muy elevada para ser entregada directamente por el PIC, se incluyeron 7 transistores BC327 para esta tarea.
Se utilizo un cristal de 4MHz y dos capacitores de 22 nF para generar los pulsos de reloj del micro en lugar del reloj interno, para lograr una mejor estabilidad con la temperatura, ya que en caso se utilizar la conexión RS-232 la velocidad es un tema delicado.
La segunda de las placas, que se conecta mediante un cable plano a la primera, es la encargada de controlar el display. Recoge los pulsos de CLOCK y los datos provenientes de la placa controladora vía el cable plano, y energiza las columnas que correspondan. Los 74LS164N se conectan a cada columna a través de una resistencia de 330 o 390 ohms. Si se quiere aumenta el brillo de los LEDS, pueden reemplazarse por resistencias de 220 ohms (o incluso menores), pero asegurándose que el tiempo de encendido de los leds no pase de unos milisegundos por vez para evitar su envejecimiento prematuro. También hay que prestar atención al consumo de corriente total, y posiblemente cambiar los transistores BC327 por BC640, capaces de manejar corrientes mas elevadas.
Por ultimo, la placa mas sencilla, pero a la vez mas laboriosa desde el punto de vista constructivo es la “pantalla” propiamente dicha, ya que esta formada por 224 diodos LEDs. Esta placa recibe las señales de control provenientes de la placa de los 74LS164N mediante pines de bronce que le otorgan soporte mecánico y eléctrico simultáneamente, y mediante 7 pequeños cables que son los encargados de seleccionar la fila que vamos a iluminar.

Sigo en el proximo post.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Dudas con 74LS164
« Respuesta #46 en: 27 de Julio de 2006, 12:06:17 »
Continuacion...

Programación:
La parte del software es la que seguramente nos costara mas trabajo, pero los resultados bien valen la pena.
Mas adelante adjunto el listado correspondiente al programa que genera el texto “POWER” para que sirva de ejemplo, pero la idea es que cada uno realice su propio software utilizando como punto de partida las ideas y datos que expondremos a continuación.
Como dijimos antes, la pantalla esta formada por una serie de filas y columnas. La intersección entre ambas contiene un LED. Para que este encienda, tiene que recibir simultáneamente un “0” en la fila, y un “0” en la columna.

La forma de generar un mensaje sobre el display es relativamente sencilla, si nos atenemos al siguiente algoritmo:

1)   Apagar todas las filas, escribiendo un “1” en PORTB.0 y PORTB.2 al 7
2)   Escribir los valores correspondientes a la primer fila en el registro de desplazamiento, teniendo en cuenta que el primer digito binario colocado corresponde al ultimo LED de la fila, y el ultimo en poner al de la primer columna.
3)   Poner un “0” en la primer fila (PORTB.0 = 0), esperar un tiempo, y volver a apagarla con PORTB.0 = 1.
4)   Repetir los pasos para las filas 2 a 7.

Los tiempos de demora que utilizamos en el programa de ejemplo permiten una visualización correcta, sin molestos parpadeos y con los LEDS brillantes. Hay que tener en cuenta que si utilizamos tiempos mayores para el encendido de cada fila, el brillo de los LEDS será mayor, pero también aumentara el parpadeo.
No utilizamos vectores ni otras alternativas que hubieran servido para crear un codigo mas compacto, buscando la claridad del programa, para que pueda servir como base a otros mas completos/complejos.



El registro de desplazamiento:
Vamos a detenernos un momento para explicar como se introducen los datos en el registro de desplazamiento. Lo primero a tener en cuenta es que los datos deben entrar de izquierda a derecha, es decir, el primer dato que introduzcamos sera “empujado” por los que vienen detrás hasta llegar a la ultima columna. En segundo lugar, hay que saber (recomendamos la lectura de la hoja de datos del 74LS164N) que el dato ingresa al registro en el momento que se produce la transición de “0” a “1” del pulso de CLOCK, por lo que se deberán seguir los siguientes pasos para ingresar cada uno de los 32 valores correspondientes a cada fila:

1) Fijar el valor del dato a escribir (   si DATA es 1, hacer PORTA.1 = 1, si no PORTA.1 = 0)
2) Esperar un par de microsegundos (WaitUs 2)
3) Poner la línea de CLOCK en estado bajo (PORTA.0 = 0).
4) Esperar un par de microsegundos (WaitUs 2)
5) Poner la línea de CLOCK en estado alto (PORTA.0 = 1). En este punto el dato entra efectivamente en el registro de desplazamiento.
6) Esperar un par de microsegundos (WaitUs 2)
7) Fin

Los tiempos de demora de dos microsegundos funcionan, pero se puede experimentar un poco con ellos, dado que según la hoja de datos la frecuencia máxima de trabajo del 74LS164N es de 25MHz., por lo que demoras menores deberían trabajar bien. (probe SIN el Waitus, o sea sin demora, y anda ok...).
Con estos tiempos, la escritura de los 32 bits de una línea demora unos 350 microsegundos, tiempo más que aceptable.

En el código fuente se puede ver que por cada línea a escribir en la pantalla se utiliza un bloque como el siguiente         


aux = %0010001011111001
Gosub escribo
aux = %0100011100000010
Gosub escribo
Fila1 = 0    
WaitMs 2
Fila1 = 1    
Goto loop
End

Básicamente, se llama dos veces a la subrutina “escribo” que comentaremos en un momento, con 16 bits en la variable “aux”.
Luego se enciende la fila escribiendo un “0” en el pin apropiado, se esperan un par de milisegundos, se apaga escribiendo un “1”, y se pasa a la fila siguiente.
La subrutina escribo se encarga de procesar el contenido de la variable “aux”, bit por bit, viendo si son “0”o “1” y escribiendo el dato correspondiente en el registro de desplazamiento. La instrucción “aux = ShiftLeft(aux, 1)” se encarga de rotar los 16 bits de la variable a la izquierda, para tomar el bit siguiente.

Sigo...
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Dudas con 74LS164
« Respuesta #47 en: 27 de Julio de 2006, 12:09:09 »
Código fuente
A continuación, el código fuente de ejemplo, en el BASIC del PIC Simulator IDE. Seguramente es 100% compatible con Proton u otros BASIC mas conocidos... E


'----------------------------
'Programa de ejemplo display 7x32
'Texto fijo: POWER
'
'PIC: 16F628A - 4Mhz XTAL, SIN RESET
'
'----- CONFIGURO PUERTOS-----
PORTA = 0
CMCON = 7  'Configuro PORTA como Digital I/O

'Configuro el portA:
TRISA.0 = 0  'Salida CLOCK
TRISA.1 = 0  'Salida DATA
TRISA.2 = 1  'Entrada Dip 0
TRISA.3 = 1  'Entrada Dip 1
TRISA.4 = 1  'Entrada Dip 2
TRISA.5 = 1  'Entrada Dip 3

'Configuro el portB:
TRISB.0 = 0  'Salida (Fila 1)
TRISB.1 = 1  'Entrada RS-232
TRISB.2 = 0  'Salida (Fila 2)
TRISB.3 = 0  'Salida (Fila 3)
TRISB.4 = 0  'Salida (Fila 4)
TRISB.5 = 0  'Salida (Fila 5)
TRISB.6 = 0  'Salida (Fila 6)
TRISB.7 = 0  'Salida (Fila 7)

'Simbolos
Symbol clock = PORTA.0
Symbol data = PORTA.1
Symbol fila1 = PORTB.0
Symbol fila2 = PORTB.2
Symbol fila3 = PORTB.3
Symbol fila4 = PORTB.4
Symbol fila5 = PORTB.5
Symbol fila6 = PORTB.6
Symbol fila7 = PORTB.7
clock = 0
data = 0

'Declaracion de variables
Dim col As Byte
Dim aux As Word


PORTB = 255  'Apago todas las filas antes de comenzar

'---------BUCLE PRINCIPAL------------
loop:
   aux = %0001111011111010
   Gosub escribo
   aux = %0010011100011110
   Gosub escribo
   fila1 = 0    
   WaitMs 2
   fila1 = 1    

   aux = %0010001000001010
   Gosub escribo
   aux = %0010100010100010
   Gosub escribo
   fila2 = 0    
   WaitMs 2
   fila2 = 1    

   aux = %0010001000001010
   Gosub escribo
   aux = %0010100010100010
   Gosub escribo
   fila3 = 0    
   WaitMs 2
   fila3 = 1    

   aux = %0001111000111010
   Gosub escribo
   aux = %0010100010011110
   Gosub escribo
   fila4 = 0    
   WaitMs 2
   fila4 = 1    

   aux = %0000101000001010
   Gosub escribo
   aux = %1010100010000010
   Gosub escribo
   fila5 = 0    
   WaitMs 2
   fila5 = 1    

   aux = %0001001000001001
   Gosub escribo
   aux = %1100100010000010
   Gosub escribo
   fila6 = 0    
   WaitMs 2
   fila6 = 1    

   aux = %0010001011111001
   Gosub escribo
   aux = %0100011100000010
   Gosub escribo
   fila7 = 0    
   WaitMs 2
   fila7 = 1    
Goto loop

End

'Subrutina que llena el registro de dezplazamiento
escribo:
   For col = 1 To 16
      If aux.15 = 0 Then
         data = 1
         WaitUs 2
         clock = 0
         WaitUs 2
         clock = 1
         WaitUs 2
      Else
         data = 0
         WaitUs 2
         clock = 0
         WaitUs 2
         clock = 1
         WaitUs 2
      Endif
      aux = ShiftLeft(aux, 1)
   Next col
Return


Por supuesto, el uso de vectores o matrices servira para hacer mas compacto el soft, pero me parecio mejor no usarlos para que se entienda bien el principio.... Espero te haya servido de ayuda. Cualquier duda, me preguntas.


Saludos! :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado elesep

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 42
Re: Dudas con 74LS164
« Respuesta #48 en: 27 de Julio de 2006, 13:55:40 »
Hola Aitopes

Muchas Gracias por la explicación, me ha quedado mucho mas claro todo el funcionamiento, y ahora que he resuelto mis dudas me pondre a hacer mi letrero luminoso, espero poder colocar mis avances, y denuevo dar las gracias has sido muy claro y preciso en tus explicaciones.

Saludos  Elesep

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Dudas con 74LS164
« Respuesta #49 en: 27 de Julio de 2006, 15:51:03 »
Estoy trabajando de a ratos (libres y pocos) en el generador de caracteres y conexion con la PC. Tengo implementados tambien algunos efectos de animaciones... Cuando pueda, los pongo aqui.

Saludos.  :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado elesep

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 42
Re: Dudas con 74LS164
« Respuesta #50 en: 27 de Julio de 2006, 19:30:07 »

Estaremos esperando esas animaciones que de seguro van a estar a la altura del proyecto que has realizado.

 Saludos.  :-)

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Dudas con 74LS164
« Respuesta #51 en: 27 de Julio de 2006, 19:54:09 »
Hola!
En realidad, las animaciones no son (al menos en teoria) demasiado complicadas. Te cuento lo que pense, por si queres ir haciendo algo:

Scroll vertical:
Simplemente, rotar entre si las filas: Fila0 --> Fila1, Fila1 --> Fila2, ....Fila6-->Fila0. Si queres el el cartel "aparezca" o "desaparezca" en lugar de rotar sobre si mismo, se pueden agregar 7 filas "virtuales" llenas de "1", lo que se verian como una fila completa apagada.

Scroll Horizontal:
El registro de dezplazamiento compuesto por los 4 74LS164N tiene 32 bits de largo. Si ponemos mas bits, los que entraron primero no se veran (por que seran "empujados" fuera de la pantalla). Si queremos realizar un scroll hacia la izquierda (es lo normal en estos letretros), podemos meter el texto (los 32 bits a mostrar, o mas si el texto es mas extenso) y luego 32 "1" para que el cartel se vea vacio. Despues de unas decimas de segundo, repetir todo pero con solo 31 "1"s, de manera que se vea al final del cartel la primer columna de nuestro texto. Seguir esperando y reduciendo la cantidad de "1"s de relleno hasta llegar a cero, con lo que se veran las 32 columnas de nuestro texto.

En fin, hay que ver si no me equivoco en nada, y por supuesto, codificarlo.

Saludos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado REYES12

  • PIC10
  • *
  • Mensajes: 1
Re: Dudas con 74LS164
« Respuesta #52 en: 19 de Agosto de 2014, 16:19:05 »
Hola!
En realidad, las animaciones no son (al menos en teoria) demasiado complicadas. Te cuento lo que pense, por si queres ir haciendo algo:

Scroll vertical:
Simplemente, rotar entre si las filas: Fila0 --> Fila1, Fila1 --> Fila2, ....Fila6-->Fila0. Si queres el el cartel "aparezca" o "desaparezca" en lugar de rotar sobre si mismo, se pueden agregar 7 filas "virtuales" llenas de "1", lo que se verian como una fila completa apagada.

Scroll Horizontal:
El registro de dezplazamiento compuesto por los 4 74LS164N tiene 32 bits de largo. Si ponemos mas bits, los que entraron primero no se veran (por que seran "empujados" fuera de la pantalla). Si queremos realizar un scroll hacia la izquierda (es lo normal en estos letretros), podemos meter el texto (los 32 bits a mostrar, o mas si el texto es mas extenso) y luego 32 "1" para que el cartel se vea vacio. Despues de unas decimas de segundo, repetir todo pero con solo 31 "1"s, de manera que se vea al final del cartel la primer columna de nuestro texto. Seguir esperando y reduciendo la cantidad de "1"s de relleno hasta llegar a cero, con lo que se veran las 32 columnas de nuestro texto.

En fin, hay que ver si no me equivoco en nada, y por supuesto, codificarlo.

Saludos.

Que tal soy nuevo por aca pero he leído este tema del foro y me interesa mucho trate de hacer lo que dices para hacer un scroll horizontal pero las letras me salen inclinadas podría alguien ayudarme a resolver este problema?? muchas gracias