Lectura I2C solo si un esclavo tiene datos a enviar

Hola a todos

Estoy usando un UNO como máster de otros 4 esclavos (UNO también), en un bus I2C, todo me funciona correctamente, desde el máster controlo los esclavos para mover servos y salidas digitales.

En cada escavo hay varios pulsadores conectados a entradas digitales, que también mueven los mismos servos y salidas digitales

Hasta aquí todo bien, quisiera que el maestro recibiera notificación cuando se pulsa una tecla en algún esclavo, esto será de forma excepcional muy pocas veces.

He conectado un pin digital de los esclavos a una entrada de interrupción del máster para solo leer el bus I2C cuando haya una tecla pulsada y no estar leyendo continuamente en un bucle, con esta solución, necesito un cable mas en el bus.

¿Alguien me puede ayudar para hacerlo de otra forma?

Gracias por anticipado, Saludos

Solo te quedan dos opciones:

  • Dejarlo como lo tienes.
  • Conectar todos los puertos seriales en paralelo (¿es seguro hacerlo?), pero implementando un sistema de direccionamiento, similar a I2C; y de algún modo señalar cuando el canal de transmisión al maestro está ocupado, ya que no hacerlo, los datos "colisionan" y se corrompen cuando más de un esclavo transmite al mismo tiempo.

I2C no fue diseñado para una comunicación "full-duplex", y mucho menos para que un esclavo llame la atención del maestro (a menos que implementes una línea de IRQ como lo estás haciendo ahora).
Los puertos seriales cumplen ambos requisitos, pero conectarlos a manera de bus... es un quebradero de cabeza.

¡Así que decide ahora!

La solución es que uses SPI en lugar de I2C.
Es de muy alta velocidad, asi que tu comunicación será mas fluida que con I2C.

Si quieres velocidad con cada esclavo puedes conectarlos asi

Pero tendras que polearlos para conocer que les ocurre, lo mismo que ahora con I2C o sea.. no sirve.

Sin embargo si usas esta configuración en cascada, si podrás.

Te dejo link para que lo leas y aprecias las posibles ventajas.

surbyte:
La solución es que uses SPI en lugar de I2C.

No es que no haya mencionado SPI porque se me olvidará, de hecho lo omití a propósito.

¿Por qué? Lee con atención:

sls_h0e:
He conectado un pin digital de los esclavos a una entrada de interrupción del máster para solo leer el bus I2C cuando haya una tecla pulsada y no estar leyendo continuamente en un bucle, con esta solución, necesito un cable mas en el bus.

¿Alguien me puede ayudar para hacerlo de otra forma?

Le tengo entendido que lo que busca es alguna forma de comunicación donde los esclavos puedan llamar la atención del maestro, pero sin agregar líneas adicionales. SPI NO TIENE ESA CARACTERÍSTICA, las acciones siguen dependiendo del maestro.
Lo más cercano es el Serial o USART, pero en apenas dos líneas para múltiples esclavos, no es para nada fácil.

A menos que exista alguna arquitectura rara de múltiples maestros, o donde los dispositivos de algún modo pueden cambiar roles en tiempo real; de lo contrario es imposible sin una línea adicional que por lo menos sirva para señalar que el bus está ocupado (mecanismo para evitar colisiones de datos).

Hola

Muchas gracias por vuestras sugerencias, me miraré el SPI.

Saludos

Le tengo entendido que lo que busca es alguna forma de comunicación donde los esclavos puedan llamar la atención del maestro, pero sin agregar líneas adicionales. SPI NO TIENE ESA CARACTERÍSTICA, las acciones siguen dependiendo del maestro.

Pero si tiense los nodos en cascada y estas leyendo constantemente todos los bits involucrados, supongamos
4x8 = 32 bits algo que sabemos es muy rápido, con cada lectura tendras el estado de los bits porque el nodo responderá via MOSI al sistema.

El SPI es bidireccional y en ese formato en cascada se lee todo de ida y de vuelta.