¿Puedo conectar varios registros de desplazamiento SN74HC595 por separado (sin conectarlos en cadena) al mismo Arduino?

Soy una especie de novato en toda esta idea de los registros de desplazamiento y la biblioteca de manejo de registros de desplazamiento de Arduino. Encontré muchas demostraciones en línea, donde los registros de turnos están conectados en cadena. Pero necesito conectar varios registros de desplazamiento a mi Arduino sin conectarlos en cadena. Mi sentido común dice, ¡Sí! puedes, pero no estoy muy seguro y no tengo ese IC a mano para poder construir físicamente el circuito y probar.

Soy muy tímido e incómodo para hacerles esta pregunta a ustedes si resulta una pregunta estúpida. Así que... por favor ten piedad de mi alma :)

¿Por qué no se pueden encadenar los SR?
son para dos circuitos diferentes, reduce la complejidad de la codificación y algunos otros problemas con el tiempo... Pero también se puede hacer encadenando los SR... @uint128_t
No te preocupes, es una buena pregunta, aunque quizás podría mejorarse con algunos detalles sobre por qué quieres hacer esto, porque como puedes ver, la mayoría de la gente (incluyéndome a mí) piensa que es la forma incorrecta de hacerlo.

Respuestas (5)

Sí. Cada registro de desplazamiento generalmente requiere tres pines (datos, pestillo, reloj), pero si su aplicación permite compartir relojes o ambos, el número de pines requeridos será menor.

Tenga en cuenta que si dos registros de desplazamiento están conectados por separado (sin pines compartidos), no se pueden actualizar simultáneamente (nota al pie: puede usar el periférico SPI para controlar los registros de desplazamiento, y esto puede ejecutarse mientras golpea otros pines, por lo que tipo de puede actualizar los registros de desplazamiento simultáneamente.

Para ampliar el uso compartido de pestillo/reloj (suponiendo que esté golpeando pines y no esté usando el periférico SPI):

Latch compartido : los SR se actualizarán (los registros internos se engancharán a las salidas) simultáneamente. Sin embargo, aún tendrá que registrar los datos en ambos SR por separado. La secuencia sería "desenclavar, datos de reloj 1, datos de reloj 2, enclavar".

Bloqueo/reloj compartido : puede actualizar los SR simultáneamente y registrar los datos en una sola secuencia. En su bucle de reloj, simplemente actualiza ambos pines de datos. Entonces, la secuencia es "desbloquear, sincronizar ambos flujos de datos, bloquear". Esto es más rápido, pero para muchas aplicaciones, esta distinción no importará.

¿Qué pasa si comparto el pasador del pestillo? ¿Se pueden actualizar simultáneamente entonces? Gracias @uint128_t
@Khaliddhali mira mis ediciones.

¿Por qué necesita conectarse sin conexión en cadena?

La forma más rápida y fácil de actualizar todos sus registros de desplazamiento, utilizando las herramientas simples existentes de Arduino, es conectarlos en cadena.

En el software, lo que hace es asignar una matriz de bytes, tantos bytes como 595 tenga. Un solo comando cambiará toda la matriz a todos los 595.

Si una razón para no conectar en cadena es que algunos 595 no deben actualizarse, simplemente cargue el byte correspondiente con los datos antiguos y ese 595 se actualizará con los mismos datos, sin ningún problema técnico. Si tiene diferentes procesos para diferentes 595, simplemente cree un alias de sus propios punteros en el búfer de salida, cada proceso puede actualizar solo sus propios bytes.

Si no conecta en cadena, tendrá que repetir la función de salida de bytes SPI para diferentes pines, lo que consume un exceso de tiempo, así como un exceso de pines.

Una vez que se ha iniciado la transferencia de búfer, utiliza hardware, por lo que no supone una carga adicional para el programa. Tendría que ser una canalización muy grande de 595 para que la latencia a través de ellos fuera significativa. Recuerde que si maneja todos los pines de enganche en paralelo, todas las salidas se actualizarán exactamente al mismo tiempo, independientemente de su posición en la tubería.

Si bien puede hacer esto, si necesita muchos de ellos y todos ellos son individuales en lugar de encadenados, podría ser más fácil usar un expansor GPIO I2C, por ejemplo, el PCA8574. Cada uno de estos chips proporciona 8 pines que se pueden controlar de forma independiente. Se conectan a través del bus I2C y se pueden configurar en una de las 8 direcciones, por lo que puede usar 8 de ellas con solo 2 pines de su controlador. Esto se puede ampliar utilizando también PCA8574A (que tienen una parte fija diferente de su dirección) a 16 chips por bus. Arduinos tiene un solo puerto I2C de hardware, pero también puede controlar un bus I2C desde pines IO ordinarios, por lo que puede aumentarlo fácilmente para controlar más si es necesario.

Por supuesto, hay una desventaja en el hecho de que los pines se controlen individualmente, y es que si desea cambiar los pines de salida de forma sincrónica, no podrá hacerlo. Pero si ese no es un requisito, creo que usar expansores GPIO es una ruta más simple y ampliable para controlar una gran cantidad de salidas.

La respuesta es Sí. La pregunta es perfectamente válida y es aplicable en ciertos escenarios donde se necesita una precisión de microsegundos y sin gpios. Conectar en cadena dos chips 595 y enviar dos bytes tomaría el doble de tiempo que enviar solo uno.

Digamos que tiene una información completa de 8 bits que debe actualizarse con frecuencia en uno de ellos, y solo controla los bits que necesitan actualizaciones menos frecuentes en otro.

Podría darse el lujo de perder un gpio en tal escenario.

Solo necesita asignar pines STCP separados a cada 595 en este caso. DS y SHCP podrían ser compartidos.

Pero no estoy muy seguro y no tengo ese IC a mano para poder construir físicamente el circuito y probar.

puede hacerlo, más fácil con HC164 que con HC595 pero definitivamente factible: usar el pasador de pestillo como mecanismo de selección de chip.