Gzalo.com

Electrónica, programación y otras cosas

Expansión de puertos de entrada y salida

Hay veces en las que para alguna aplicación necesitamos más pines de salida o entrada de los que tenemos en el microcontrolador. Hay varias soluciones:

  • Usar algún chip PPI como el 8255 (caro, grande y lento), de interfaz paralela (nos usa 10 terminales)
  • Usar algún integrado expansor de E/S via I2C, como el PCF8575 (caro y dificil de conseguir)
  • Usar lógica 74xxx (relativamente barato, programación sencilla, facil de conseguir)

Expandir Salidas

La mejor solución es la tercera, es posible emplear un 74x164 (sin latch) o 74x595 (con latch) para expandir la cantidad de salidas. La ventaja de estos integrados es que se pueden poner en cascada, y así agregar 8 puertos por cada integrado agregado.

Básicamente son shift registers, es decir, una cadena de flip-flops del tipo D encadenados, por lo que uno puede ir "empujando" datos por un lado y tener acceso a los 8 bits:

Diagrama shift register

Generalmente tienen 3 terminales de control:

  • Clock: Al dar un pulso, los datos se van "desplazando" por los flip flops, y un dato nuevo entra al FF de la izquierda
  • Datos: Marcan qué bit agregar a la izquierda al dar un pulso de clock
  • Reset: Al dar un pulso, hace que todos los bits pasen a 0

Algunos (como el 74x595) tienen una terminal más, que hace que los datos pasen a la salida. Es decir, los cambios se hacen sobre flip flops internos (que no controlan las terminales físicas) y al activar esa terminal extra los bits aparecen en las terminales:

Diagrama shift register con latch

Conviene elegir el shift register con latch en el caso de que las salidas necesiten persistencia (es decir, si las salidas están conectadas a cargas reales, como relés o motores), para evitar que en una terminal haya un valor incorrecto (aunque sea por milisegundos).

Por lo tanto, si queremos escribir una tira de bits en estos shift registers, debemos hacer esta secuencia:

  1. Por cada bit: (empezando por el de más a la derecha)
    1. Poner ese bit en la terminal de "Dato"
    2. Hacer un pulso en la terminal de "Clock"
  2. Hacer un pulso en la terminal de "Latch" (si hay), para hacer que se activen las salidas correspondientes

Es posible poner varios shift register en cascada, de la siguiente manera:

Shift registers en cascada

Un ejemplo útil de ésto es poder manejar varias matrices de leds, unicamente con pocas terminales de un microcontrolador:

Esquemático matrices de leds

Expandir Entradas

Para las entradas, es posible usar integrados como los 4014. Básicamente es similar a las salidas, con la diferencia que los shift registers son de entrada paralela y salida serial. Este sería la secuencia para leer los bits:

  1. Hacer un pulso en la terminal de "Latch", para que el integrado guarde en los FF internos el valor de las terminales
  2. Por cada bit[i] que se quiera leer: (desde la derecha)
    1. Leer de la terminal de "Dato", ese es el bit[i]
    2. Hacer un pulso en la terminal de "Clock"
    3. Incrementar i

La forma de expandir los shift registers para obtener más puertos de entrada es la siguiente:
Shift register para expandir entradas

Comentarios