Cuando IO está limitado en un uC, ¿cómo se aleja la lógica del uC?

8

Por ejemplo, si tuviera un Arduino con 4 pines de E / S digitales, ¿cómo podría encender de forma independiente> 4 LED o leer el estado de> 4 botones?

cheesysam
fuente
¡Pregunta sobre los PIC en el título y luego se refiere a un Arduino!
Leon Heller
2
@LeonHeller: luego solicite una aclaración y / o edite la pregunta usted mismo. Aunque en este caso uno podría simplemente sub "uC" para PIC / Arudino.
Chris Laplante
2
Estoy de acuerdo en que el hardware es más barato de mantener.
jippie
3
@jippie - Y luego la respuesta geek es: "¿Qué es una novia?" :-)
stevenvh
1
Sugeriría reconsiderar su respuesta aceptada. Ignacio es incorrecto (hay tres señales, no dos), Bruno es más completo (Ignacio no menciona la entrada, por ejemplo), y tiene una solución original para guardar un pin adicional.
stevenvh

Respuestas:

4

Un registro de desplazamiento como el 74595 le permitirá tener muchas salidas con solo 2 conexiones: un pin de datos y un pin de reloj. Establece el pin de datos en el siguiente valor que desea mover al registro y luego pulsa el pin del reloj.

Ignacio Vazquez-Abrams
fuente
Eso es genial. Así que lo he leído y solo para aclarar, ¿con uno de esos puedo tener 8 salidas ejecutándose usando hasta 2 pines arduino? ¿Asumo que no puedo usarlos como entradas también?
cheesysam
3
@cheesysam - "Con dos puede tener 16 salidas. Con tres, 24, y así sucesivamente". Eso no es correcto Necesita 3 pines: datos, reloj y pestillo, sin importar cuántos dispositivos desee conectar. La respuesta de Bruno es más precisa. Además, no hable sobre el 74595, esa es la tecnología TTL original, que ha estado muerta y enterrada durante décadas. Quieres el 74HC595.
stevenvh
1
@stevenvh: "... con uno de esos puedo tener 8 salidas ...". Además, ¿estás seguro de que no quieren el 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams
1
@Ignacio - "con dos .." es confuso, como se puede leer como "con dos E / S", como hice yo. Lo siento. 74F595? ¿Para marcar por un controlador de 16 MHz? No lo creo. El 74F consume mucha energía y la velocidad no le brinda ningún beneficio. 74LVX es solo 3.3 V, por lo que no interactúa con Arduino. ¿Qué hay de malo con 74HC? Es la familia lógica estándar.
stevenvh
2
"¿Qué tiene de malo el 74HC?" Absolutamente nada. ¿Qué hay de malo en omitir el "XX"?
Ignacio Vazquez-Abrams
7

Bruno dio una buena respuesta, pero me gustaría tomar algunas notas.

El infame 70 mA
El 74HC595 se usa a menudo como E / S extendida, y se usa con frecuencia para controlar una serie de LED. Lo que a menudo se pasa por alto es que puede operarlo fuera de especificaciones de esta manera. La hoja de datos dice que la corriente de suministro total no debe ser superior a 70 mA, clasificaciones máximas absolutas (AMR), por lo que es mejor que se mantenga alejado de eso por algún margen. ¡Por lo tanto, 8 LED a 10 mA es demasiado, y a 20 mA excederá AMR en no menos del 130%! El límite probablemente se deba a la capacidad de corriente de los cables de unión, y luego la corriente demasiado alta puede no solo deteriorar el rendimiento de la pieza, sino que la dejaría permanentemente fuera de servicio si ese cable se rompiera.

Pero anoche me desperté porque tenía una idea . El límite de 70 mA va para Icc y corriente de tierra, entonces ¿por qué no dividir nuestro total u 80 mA y dejar que Icc tenga la mitad y corriente de tierra la otra mitad? Todo lo que tiene que hacer es hacer referencia a 4 de los LED a tierra (activo alto) y los otros 4 a Vcc (activo bajo). Luego, la corriente de los primeros proviene de Icc, la corriente de los otros va a tierra. Podrá utilizar LED de 15 mA de esta manera. (Es tan simple que me siento como un idiota por no haberlo pensado antes).

Los relojes combinados
pensé que Bruno había guardado un pin de E / S adicional al combinar el reloj de la caja registradora con el del pestillo. Parece que interpreté mal su respuesta. Todavía quiero ampliar esta opción.

¿Qué pasa entonces? La tabla en la página 5 de la hoja de datos dice:

los contenidos del registro de desplazamiento se desplazaron; los contenidos anteriores del registro de desplazamiento se transfieren al registro de almacenamiento y a las etapas de salida paralelas

(resaltado por mí)
Entonces, no son los datos nuevos sino los anteriores los que se están bloqueando. No es un problema real, solo asegúrate de cambiar un bit ficticio adicional para bloquear los últimos datos, o todo será un pin incorrecto.

La combinación de los relojes también significa que las salidas se alternarán todo el tiempo mientras se cambian nuevos datos. La función del pestillo era en realidad evitar eso. En muchos casos, esto no será un problema, si puede hacerlo rápido, pero en el peor de los casos puede obtener efectos no deseados. El peor de los casos podría ser usar el 74HC595 para multiplexar una pantalla a una frecuencia de exploración muy alta + tener una cadena muy larga de registros de desplazamiento + tener todos los 1 excepto un 0, un LED que está apagado + una habitación oscura. Dado que ese LED ve que todos los 1 pasan cada cierto tiempo en una habitación oscura, puede iluminarse muy débilmente.

O si combina esa multiplexación de alta frecuencia con una salida de control de relé. Todos los ceros y luego un 1 para el relé pueden significar que la salida del relé no es lo suficientemente alta como para entrar.

De acuerdo, esos son casos extremos, pero mantendría el reloj de serie y el de pestillo separados siempre que sea posible si desea multiplexar, o de lo contrario tener altas tasas de actualización.

stevenvh
fuente
1
+1 ¡Gran idea que tuviste anoche! Nunca vi esto mencionado en ningún lado hasta ahora. Por otro lado, creo que malinterpretaste la respuesta de Bruno. Se refería a combinar la señal de reloj de 74XX595 y 74XX165 juntas y combinar la señal de cierre de 74XX595 y 74XX165 juntas.
m.Alin
@ m.Alin - Sí, parece que lo hice. Gracias por señalar eso. Editaré mi respuesta, pero la dejo como una posibilidad.
stevenvh
Por supuesto, definitivamente es una posibilidad que otros han recomendado. Vale la pena abordarlo.
m.Alin
@ m.Alin - Creo que la razón por la que no se usó antes es porque los usuarios no sabían sobre el límite de 70 mA, o no les importaba :-(. ¡Ahora me voy a la oficina de patentes! ;-)
stevenvh
3
Ya de vuelta. La oficina estaba cerrada. Todos estaban en la iglesia.
stevenvh
6

Estoy de acuerdo con Ignacio con respecto al uso de un registro de desplazamiento 74XX595, serie en paralelo para expansión de salida, pero en realidad necesitará 3 conexiones, una para datos , una para reloj y una habilitación de enganche que transferirá los datos del registro de desplazamiento interno a los pestillos de salida.

Diagrama de 74LS595

Para la expansión de las entradas, puede usar un 74XX165, paralelo en el registro de desplazamiento de salida en serie, esto permitirá tener hasta 8 botones por 74XX165.

ingrese la descripción de la imagen aquí

Lo bueno de este enfoque es que puede conectar en cadena varios registros de desplazamiento que permiten un mayor número de entradas o salidas, y mejor, puede mezclar 74XX595 y 74XX165 permitiendo y tener cualquier número de entradas o salidas.

Además de eso, puede compartir las señales de reloj y de pestillo, lo que reduce la cantidad de conexiones necesarias y simplifica enormemente el software. De esta manera, solo necesitará 4 conexiones para cualquier número de cualquiera de estos registros de desplazamiento:

  • Reloj (compartido con todos los registros de desplazamiento)
  • Latch Enable (compartido con todos los registros de desplazamiento)
  • Entrada de datos (conectado a la salida en serie del último registro de desplazamiento de la cadena)
  • Salida de datos (conectado a la entrada en serie del primer registro de desplazamiento de la cadena)

Editar

Mientras buscaba un diagrama, encontré en este sitio web una forma muy inteligente de reducir a 3 el número de conexiones requeridas. Consiste en usar el mismo pin para la entrada y salida de datos.

El software hará algo así para cada pulso de reloj:

  1. Configurar pin como salida
  2. Establecer el valor de los datos
  3. Enviar un pulso de reloj
  4. Configurar pin como entrada
  5. Lee los datos

Diagrama

Bruno Ferreira
fuente
1
Los excesivamente entusiastas pueden controlar la salida del registro de desplazamiento solo cadenas como esta con un solo pin de salida, y probablemente también las de entrada-salida. Pregúntame cómo lo sé :-). Esto se logra mediante el uso de retrasos R / C en los datos y el enganche, con el reloj conectado directamente al pin de salida. La secuencia exacta depende de la polaridad relativa del disparador de borde para el reloj y el pestillo, pero estos generalmente están diseñados para funcionar juntos de esta manera.
Russell McMahon
Y como dije en mi respuesta, también puedes combinar ambos relojes, por lo que solo necesitas dos pines. Es una idea inteligente, pero no voy a votar esto por segunda vez. Una vez es suficiente :-)
stevenvh
No veo la necesidad de cambiar la última salida del 74HC595 al 74HC165. ¿Alguien podría explicar esto? Según tengo entendido, 16 pulsos de reloj serían suficientes para ambos, configure las salidas del 2 x 74HC595 (16 salidas) y lea las entradas del 2 74HC165 (16 entradas), sin esta conexión.
@Dario: Tener la última salida del 74HC595 en el 74HC165 es una forma "gratuita" de permitir que un controlador que sepa que la cadena no sea más larga que cierta longitud determine que la cadena está conectada y cuánto tiempo dura . Si sería aceptable registrar todos los '595 bajos en el inicio, y si el primer' 165 tendrá al menos una entrada alta, el código puede incluso determinar cuántos '595 y' 165 hay.
supercat
5

Nick menciona expansores de E / S, y definitivamente vale la pena examinarlos. Digikey enumera más de mil de ellos, elegiré uno con una interfaz I2C como ejemplo, porque eso requiere la menor cantidad de pines de E / S; mínimo dos

El NXP PCA9505 tiene 40 pines de E / S configurables, el equivalente a cinco 74HC595. Es una solución un poco más cara, pero obtienes mucha más funcionalidad para eso:

  • Cualquier pin de E / S se puede configurar como entrada o salida
  • Pullups de 100 kΩ en todos los pines de E / S (el PCA9506 no tiene pullups, lo que puede ser relevante para aplicaciones de baja potencia)
  • Todas las salidas pueden hundir 15 mA simultáneamente, para un paquete total de 600 mA
  • Una salida de interrupción de cambio hace que el escaneo continuo de las entradas sea superfluo
  • Solo dos cables para conectar al microcontrolador.

Lecturas adicionales
GPIO expansores , NXP folleto
PCA9505 hoja de datos

stevenvh
fuente
4

Para una solución sin circuitos integrados adicionales, puede usar técnicas como Multiplexación y Charliplexing :

Multiplexación (no se muestran resistencias limitantes de corriente):

LEDs multiplexados

La forma en que funciona la multiplexación es bastante simple: en el ejemplo anterior, si queremos encender el LED1, configuramos el pin C1 para que salga alto y el PIN R1 para que salga bajo, todos los demás pines pueden ser altos o Hi-Z (configurados para entrada, alto impedancia que los hace parecer "desconectados")
Si deseamos encender el LED5, configuramos el pin C2 para que salga alto y R2 para que salga bajo.

La cantidad de pines necesarios para controlar x LED puede calcularse con 2 pines para n 2 LED, por lo que, por ejemplo, para 16 LED necesitamos (√16) * 2 = 8 pines.

Charlieplexing:

Charlieplexing

Diseño esquemático alternativo (más ordenado) (sugerido por Supercat):

Charlieplexing 2

Esto es un poco más complejo, pero usa menos pines para manejar un mayor número de LED. Por ejemplo, podemos usar solo 5 pines para controlar 20 LED como en el ejemplo anterior (en comparación con al menos 10 pines con multiplexación matricial "normal" (no debe confundirse con el uso de un IC en cuyo caso el número de pines necesarios es log2 (nLED)

Para una solución externa, puede usar cosas como registros de desplazamiento o multiplexores como 74HC595 y 74HC151.
Un registro de desplazamiento toma un flujo de entrada en serie de datos sincronizados y salidas paralelas (SIPO In Parallel Out SIPO) o viceversa (PISO).
Generalmente tienen 8 salidas (o entradas) pero puede encadenar tantas como desee para ampliar cosas. La desventaja es que la velocidad que puede actualizar se divide por el número de salidas por entrada (por ejemplo, para un registro de 8 salidas, si tiene un reloj de entrada de 8MHz puede actualizar a 1MHz, para 16 salidas de 500kHz, etc.)

Estas técnicas también pueden funcionar a la inversa para las entradas.

Oli Glaser
fuente
Esta respuesta muestra cómo usar Charlieplexing para botones de entrada multiplexados: electronics.stackexchange.com/a/37362/8627
jippie
Una forma más fácil de dibujar una pantalla Charlieplexed es simplemente dibujarla como una cuadrícula NxN con la diagonal despoblada.
supercat
@supercat: acabo de pellizcar el primer ejemplo de google images. Acabo de agregar otro ejemplo: ¿es este el tipo de diseño que quería decir?
Oli Glaser
@OliGlaser: Sí, aunque sugeriría mover las resistencias a las uniones fila-columna. Si lo hace, entonces será posible manejar nueve LED a la vez, siempre que los controladores de lado alto o bajo puedan acomodar eso. Alternativamente, uno podría dejar las resistencias donde están pero agregar un transistor en cada unión fila-columna (para el esquema como se muestra, un NPN con la base en la fila, el emisor en la columna y el colector conectado al riel positivo ) Agregar el transistor reduciría en gran medida la fuerza de accionamiento del lado alto requerida para operar nueve LED a la vez.
supercat