74HC595. y un poco de codigo para un PIC.

Todos los Microcontroladores y sus diferentes "familias". Todo este espacio es tuyo para mostrar tu código, consultar con los que más conocen del tema y para disfrutar de estos increíbles y poderosos componentes electrónicos.

Moderador: HJ

74HC595. y un poco de codigo para un PIC.

Notapor Switchxxi » Jue May 16, 2013 8:13 pm

--- Introducción ---

Muchas veces tenemos un microcontrolador que anda perfecto para una tarea pero lamentablemente no posee la cantidad de pines que uno necesita. Una solución es comprar un microcontrolador con mas pines. Muchas veces la diferencia en precio es grande. Otras uno puede estar experimentando en fase de aprender y por eso, como yo, se decanta por otro método.

En mi caso estoy trabajando con un PIC12f675 el cual posee solo 5 pines I/O y 1 que solo es entrada. Como se ve la cantidad de pines disponible no es mucha.
En el circuito que uso necesito disponer de 8 salidas para comandar una red DAC R-2R. Acá es donde generalmente uno de afuera diría: usa un PIC16f628 o si necesitas un ADC un PIC16F88.

Supongamos ahora, para el que aconseja eso, que mi circuito es un POV LED que tiene de comandar 36 LEDS. ¿ Irse a un PIC32 ? ¿ un FPGA ?.
Es acá donde un poco de conocimiento sobre los expansores de puertos puede ser útil y es a lo que apunta esta guía.


---- El registro de desplazamiento 74HC595 ---

Como se sospecha usare el registro de desplazamiento 74HC595 el cual posee entrada serial y salida paralela.

Imagen

Como se ve el diagrama parece complicado pero no es tan así, veremos que es mas fácil de manejar de lo que parece.

Tenemos:

1 Linea de entrada de datos serial.
4 Lineas de control.
1 Linea para hacer cascadas (se pueden conectar "infinitos" circuitos).
8 Salidas de datos.

Pin a pin que hace cada cosa:

PIN desde el 1 al 7 y el 15: Empezando por lo mas fácil estos ocho pines serán por donde uno obtendrá la salida paralela. Acá se conectaran los LEDs, motores, circuitos, etc, que uno quiere comandar.
El pin 15 sera el de menos peso -LSB- y el 7 el de mayor peso o -MSB- (esto para tener en cuanta cuando se envíe los datos serialmente, luego debido a que es uno el que controla que dato aparece en cada salida el dato de menor peso o mayor peso podrá ser cualquiera dependiendo de que se envíe al circuito).

PIN 10: Siguiendo por lo fácil, el pin 10 es el de reset. Este pin resetea, al ponerlo a GND, la cuenta que lleva el dispositivo en el desplazamiento como así también limpiando las salidas que pasaran a 0.
Pin que generalmente no se usa cuando los pines del micro que controla el 74595 no son muchas con lo que habrá que ponerlo a VCC para dejar al registro sin resetear.

PIN 13: Habilitador de salidas. Este pin "conecta" las salidas. En caso de que este a VCC -salidas desconectadas- las mismas estarán flotantes o también llamado en HI-Z o de alta impedancia.
En caso de conectarlo a GND las salidas estarán "conectadas" con lo que ahora los pines están a 0 o 1 dependiendo de lo que se le haya enviado al registro a través del micro.

PIN14: Entrada serial de datos. Por este pin se ingresa, uno a uno, los bits que compondrán la salida. Para validar cada bit habrá que hacer uso del siguiente pin:

PIN11: Pulsos de reloj para validar los bits de entrada. Al recibir este pin un flanco de subida desplaza el contenido del registro hacia la derecha almacenando el valor en el bit 0 del registro de desplazamiento.

PIN12: Una vez se haya enviado los 8 bit que compondrán la salida, enviándole un pulso a este pin, en el flanco de subida, pasara todo lo que este guardado en el registro de desplazamiento hacia las salidas (Registro de almacenamiento). La salida permanecerá inalterable aun cuando se vuelva a ingresar datos y solo cambiara cuando, mediante este pin (pin 12) se vuelva a dar un pulso para actualizar las salidas con el segundo valor que se cargo.

PIN9: Por ultimo, como dijimos que se pueden colocar mas registros en cascada el micro deberá enviar no ya 8 bits sino 16 bits (por ejemplo si tenemos solo 2 registros en cascada). Al ingresar el 9no bit, el primero que se ingreso saldrá por este pin (pin 9) y entrara al pin 14 del siguiente registro para acumularse ahí.
Si es complicado supongase lo siguiente: hay una mesa en donde entran 4 cajas; coloco una caja, luego y empujando a esta (desplazándola) coloco otra y así hasta que en la mesa haya 4 cajas. Ahora si coloco otra caja, al no entrar mas, la de la punta caerá al suelo perdiéndose.
En una cascada el pin 9 vendría a ser un puente por donde se deslizaría esta caja que en el otro caso se perdería e iría a parar a una segunda mesa. Obviamente cuando coloque 8 cajas terminare con las dos mesas llenas con 4 cajas cada una (osea dos registros de desplazamiento de 4 bits llenos y listo para transferir ese contenido a las salidas).

En el caso de una cascada todos los pines 10, 11, 12 y 13 estarían conectados a los respectivos pines de los otros registros mientras que el pin 9 del primer registro estaría conectado al pin 14 del segundo, a su vez el pin 9 del segundo estaría conectado al pin 14 del tercero y así sucesivamente.


--- Código ASM para PIC y algo de optimización ---

El código para manejar un 74HC595 no es tan difícil:

Código: Seleccionar todo
Envia595
      movlw   0x08
      movwf   Conta      ; Cargamos un contador para contar los 8 bits.

A1
      bcf   GPIO, DS
      btfsc   Dato, 7
      bsf   GPIO, DS   ; Ponemos en la salida el bit correspondiente MSB primero.

      bsf   GPIO, SHCP
      bsf   GPIO, SHCP   ; Damos un pulso para validar el bit que acabamos de colocar.
      
      rlf   Dato, f      ; Desplazo para colocar el siguiente bit a sacar.

      decfsz   Conta, f   ; Compruebo si ya saque los 8 bits.
      goto   A1   

      bsf   GPIO, STCP
      BCF   GPIO, STCP   ; Doy un pulso para pasar los 8 bit almacenados a la salida.

      return


Ahora bien, hagamos las cuentas de cuanto tardara en enviar los 8 bits suponiendo un tiempo de ejecución de cada instrucción de 1us (reloj de 4Mhz) para hacer cálculos fáciles: Dado que es una función tengo:

1. 2us para ir, 2us para volver = 4us.
2. Cargar "Conta" con 8 = 2us.

3. Leer que valor es el bit y sacarlo = 3us.
4. darle el pulso al registro para almacenar el bit = 2us.
5. Rotar el dato = 1us
6. Comprobar si ya se enviaron los 8 bits = 3us.

7. Dado que del paso 3 al 6 lo tengo que hacer 8 veces seria (3+2+1+3) * 8 = 72us

8. Por ultimo darle el pulso para pasar los datos guardados en el registro a las salidas = 2us.

Ahora si hacemos cálculos nos da que todo eso tarda: 4 + 2 + 72 + 2 = 80us para enviar un byte. O, lo que es lo mismo, actualizar la salida unas 12500 veces por segundo... No me gusta... MMM... me pregunto si se podrá hacer de otra forma... Veamos:

Código: Seleccionar todo
Envia595
      bcf   GPIO, DS
      btfsc   Dato, 7
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 6
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 5
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 4
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 3
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 2
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 1
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bcf   GPIO, DS
      btfsc   Dato, 0
      bsf   GPIO, DS

      bsf   GPIO, SHCP
      bcf   GPIO, SHCP
      
      bsf   GPIO, STCP      ; Pasa el valor alamacenado a las salidas.
      bcf   GPIO, STCP

      return


Ahora bien, alguien que vea el código podrá pensar que tarda mas pero es lo mismo que preguntar: ¿ que vale mas un billete de 10 pesos o 10 de 1 peso ?. Por un lado tiene el problema de que ocupa mas código y cuando estamos apretados ya con el resto quizás no sea viable usarlo, pero en mi caso prefiero optimizar velocidad a código, así que hagamos los cálculos a ver cuanto tarda en enviar los 8 bits (teniendo en cuenta, como en el caso anterior un reloj de 4Mhz osea 1us por instrucción):

1. Como en código anterior es una función tendré 2us en llamarla y 2us en volver de ella = 4us.

2. Enviar un bit al pin del micro 3us
3. Enviar el pulso al registro para validarlo = 2us

4. Como se ve ese pedazo de código (paso 2 y 3) se repite 8 veces para enviar los 8 bits por lo que tardara (3 + 2) * 8 = 40us

5. Enviar el pulso para pasar los datos guardados en el registro a las salidas = 2us.

Si hacemos las cuentas, en este caso para enviar los 8 bit tardara 4 + 40 + 2 = 46us o lo que es lo mismo, actualizara la salida 21739 veces por segundo... Pequeña diferencia ¿ No ?


--- Conclusión ---

Como se ve no es difícil usar el registro de desplazamiento y se obtienen varias ventajas. Por el lado del software vimos que en cierto punto uno debe pararse y evaluar que es lo que necesita: ¿ Optimizar código ? u '¿ Optimizar velocidad ? es acá cuando saber un poco de ensamblador puede ser de una gran ventaja ya que un compilador no importa si fuese C, basic, pascal, habrá terminado con la primera aproximación que como vimos es la mas lenta. Desde luego los compiladores poseen opciones para incrustar pedazos de código en ensamblador y es ahí donde sobresaldremos si tenemos los conocimientos necesarios al usar las herramientas en tareas finas.


Saludos.
- Javier -
Última edición por Switchxxi el Mar Jun 04, 2013 10:51 am, editado 2 veces en total
En mis circuitos, el humo no se cobra, va de regalo.
            Imagen
Avatar de Usuario
Switchxxi
 
Mensajes: 215
Registrado: Sab Mar 23, 2013 4:10 pm
Ubicación: Bs. As - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Mario » Jue May 16, 2013 8:43 pm

Buen trabajo Javier!

Muy bien explicado con el ejemplo de la optimización y los tiempos de instrucción.
Respecto a lo último, cuando hablas de incrustar ASM en lenguajes de alto nivel, me ha sido muy útil en aplicaciones específicas usando BASIC.

Gracias por el trabajo. :D
Saludos!
Mario
En Servisystem, hay una sección de Montajes que puede llegar a interesarte. Hay muchas ideas útiles y montajes electrónicos para construir. No te olvides: todo lo que sea importante, también estará en el Blog.
Avatar de Usuario
Mario
Administrador del Sitio
 
Mensajes: 428
Registrado: Vie Ene 28, 2011 7:22 am
Ubicación: Principado de San Nicolás de los Arroyos

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Guerra » Vie May 17, 2013 9:37 pm

Hola amigos del foro!!! Switchxxi excelente la propuesta, la verdad es que son sencillos de usar y resuelven cuando se necesitan puertos extra. En lo personal, los he usado con el bus SPI a 1MHz y encadenando 13 integrados 74HC595 y trabajaron bien.
Muchas Gracias por la explicación.
Saludos. ;)
N.Guerra
Guerra
 
Mensajes: 35
Registrado: Jue Mar 21, 2013 3:25 pm

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Switchxxi » Vie May 17, 2013 9:46 pm

Hola... No solo son sencillos de usar sino como tu comentas también aceptan trabajar a altas frecuencias, el 74HC595 tiene un limite de 100Mhz con lo que es muy rápido para enviar información a una cadena de ellos.

Si se posee los integrados adecuados y obviamente un buen diseño de la placa (100Mhz ya no es para cualquiera, ni mucho menos para mi xD) se pueden hacer maravillas con los registros =).

Saludos.
- Javier -
En mis circuitos, el humo no se cobra, va de regalo.
            Imagen
Avatar de Usuario
Switchxxi
 
Mensajes: 215
Registrado: Sab Mar 23, 2013 4:10 pm
Ubicación: Bs. As - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Corsario007 » Mar May 21, 2013 9:01 pm

hola

Interesante circuito integrado, no lo conocia, para realizar esas operaciones utilizaba un 74LS164 y un 74HC573, hasta que encontre el 74HC4094 que es casi el mismo que el 74HC595 asique si alguien no puede conseguir el 74HC595 y se encuentra diseñando un circuito lo puede reemplazar por el 74HC4094 que es practicamente el mismo, lo unico diferente esque no tiene el pin de reset pero si quieres limpiar el registro es sensillo en via 8 ceros.

saludos.
Mi país es el Mundo y mi religión es hacer el bien.Thomas Paine.
Corsario007
 
Mensajes: 14
Registrado: Vie Abr 12, 2013 11:25 pm

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Switchxxi » Mar May 21, 2013 9:46 pm

Hola...

Eso es lo que tiene de bueno el 74HC595 es un integrado que reúne los CI 74164 y 74573 en un mismo encapsulado. De acorde a la aplicación puede ser beneficioso o no. En mi caso use el registro para construir un DAC con lo que si hubiese usado el 74164 si o si hubiese requerido colocar el 74573 para que la salida no varíe mientras envío los datos.

Interesante el 744094 como reemplazo, lo único que mucho no me gusta es que los pines de salida quedan medio cruzados para rutearlos en el PCB, en cambio el 74595 los tiene todos a excepción de uno en un solo lado. Pero siempre es bueno conocer alternativas.

Saludos.
- Javier -
En mis circuitos, el humo no se cobra, va de regalo.
            Imagen
Avatar de Usuario
Switchxxi
 
Mensajes: 215
Registrado: Sab Mar 23, 2013 4:10 pm
Ubicación: Bs. As - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor elgarbe » Lun Jun 03, 2013 11:27 pm

Javier, los calculos de tiempo los hiciste para una frecuencia de 4mhz, verdad? o sea que a 20mhz sería 5 veces más rápido y tardaría unos 10useg en llenar el registro?

se consigue alguna mejora significativa usando SPI?

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Switchxxi » Mar Jun 04, 2013 10:35 am

Hola, Elgarbe.

Los cálculos están echos a partir de un reloj de 4Mhz que luego el pic divide por 4 osea que en realidad es 1Mhz efectivo (1us por instrucción salvo los saltos que tardan 2us).
Me olvide de aclarar que tome esa frecuencia porque use el oscilador interno del pic12f675 y ademas quedaba mas redondo para hacer los cálculos.

Si usas un cristal de 20Mhz, efectivamente, usando la segunda aproximación por software tardaras poco mas de 9us en llenar y sacar los 8bit por los pines del 74HC595.

En mi caso, el PIC12F675 no tiene ningún periférico de comunicación serial así que si o si había que hacerlo por software. Si posees un micro con interfaz SPI integrada la cosa se vuelve increíblemente mas rápida ya que básicamente el protocolo que usa el 74HC595 es el SPI. Debes tener presente que hay que configurarlo en el modo 0 (aunque debería funcionar también en el modo 2) ya que el 74HC595 valida los datos en flancos de subida y darle la máxima frecuencia que permita el micro para el reloj del SPI. El 74HC595 tiene un limite de 100Mhz (no comprobado por mi, solo digo lo que el datasheet. Igual a esa frecuencia ya hay que tener cuidado en el diseño del PCB).

La otra ventaja es que pones el dato a sacar en el registro correspondiente, le das a iniciar y puedes seguir con las demás rutinas ya que trabaja independiente por lo que no pierdes tiempo esperando a que se termine de enviar todo el dato. Ademas, creo (Debería revisar), que tienes interrupción para cuando se termina de enviar los datos dando mas flexibilidad al programa.

Si usas el periférico de comunicación SPI integrado no debes olvidar que cuando termine de enviarle el dato (los 8bits), si o si, deberás darle el pulso al pin 12(STCP), por software, para pasar los datos acumulados a la salida en el 74HC595 sino el dato quedara dentro del registro interno del 74HC595 y jamas llegara a los pines, dado que el protocolo SPI no contempla esa parte ;)

Saludos.
- Javier -
En mis circuitos, el humo no se cobra, va de regalo.
            Imagen
Avatar de Usuario
Switchxxi
 
Mensajes: 215
Registrado: Sab Mar 23, 2013 4:10 pm
Ubicación: Bs. As - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor elgarbe » Mar Jun 04, 2013 10:49 am

Perfecto!
El año pasado hicimos un reloj POV con una columna de 7 led girando de forma vertical y como manejaban los led con salidas del uC directamente no tenía problemas.
Este año queremos, con el mismo grupo de chicos, hacer un reloj pov, pero simil analógico con el motor de un ventilador. como los led a comandar serían unos 60 nos vino bien este artículo para hacer los primeros cálculos y estamos muy justos, a 20MHz puede funcionar. Por eso preguntaba por el SPI. Una vez que pasen en limpio los cálculos de lo que podemos hacer con este sistema a 20MHz veremos si hacemos algo simple de baja resolucion para arrancar y luego pasamos a usar el SPI (tengo que estudiarlo primero ya que nunca lo use)...
Ya les ire contando los avances!

Saludos y gracias por esta explicacion.
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: 74HC595. y un poco de codigo para un PIC.

Notapor Switchxxi » Mar Jun 04, 2013 11:02 am

Si quieres puedes darle una revisada a estos proyectos:

POV para una bici con 60 leds (30+30) que es lo que quieres hacer ademas que poseen un software que te pasa un archivo BMP con el dibujo a una tabla para cargar en el micro, aunque ahí usan un ATTINY, transformarlo para PIC no debe ser tan difícil mas cuando la parte tediosa ya esta echa. http://www.ladyada.net/make/spokepov/index.html

Y este, que no tiene nada que ver con un POV, pero si usa el puerto SPI para enviar datos y crear patrones de video. Dado que el protocolo SPI funciona independientemente del programa hay mas tiempo para acomodar la información mientras el periférico SPI va enviado los datos, al menos es una interesante aproximación y te sirve para ver un poco como usa el SPI: http://mondo-technology.com/dcvideo.html

Saludos.
En mis circuitos, el humo no se cobra, va de regalo.
            Imagen
Avatar de Usuario
Switchxxi
 
Mensajes: 215
Registrado: Sab Mar 23, 2013 4:10 pm
Ubicación: Bs. As - Argentina

Siguiente

Volver a Microcontroladores

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron