Comunicación de un microcontrolador con una imagen de maestro a 32 esclavos, bitbang

0

Estoy intentando comunicarme con 32 microcontroladores (PIC 12f675). Estos se utilizan para controlar 32 motores de CC y 2 sensores para cada PIC. Así que solo quedan dos pines para comunicarse con el dispositivo maestro. Quiero enviar señales (la cantidad de rondas a rotar y la dirección) a estos 32 esclavos en el dispositivo un maestro .

El PIC 12F675 no tiene hardware I2C o SPI. Así que quiero comunicarme con alguna técnica de bitbang. (PIC 12F675 corriendo a un reloj interno de 4 MHz)

¿Cuál es la mejor manera de hacerlo? (Prefiero usar C idioma (xc8))

    
pregunta Asith Niwantha

2 respuestas

3

Si el cableado lo permite, el método más simple es tener un cable que sea una salida del maestro a todos los esclavos, y el otro es un cable de retorno compartido por todos los esclavos al maestro, y dar a cada esclavo un " dirección "codificada" que también está codificada dentro del maestro. El uso de tal enfoque y que cada esclavo se comunique solo cuando se habla, eliminará la necesidad de arbitraje.

Si tiene algún tipo de interrupción periódica en el maestro y el esclavo, sugeriría usar una comunicación normal estilo UART con la condición adicional de que la línea de traansmit estará inactiva durante al menos 12 bits antes de cualquier comando, pero todos los bytes de cada comando se enviarán consecutivamente con al menos 1.1 pero no más de 5 bits de parada entre ellos. Entonces, cualquier esclavo que decida que un comando no le interesa puede ignorar todo lo que sucede a menos que o hasta que vea la línea inactiva por lo menos 10 veces al bit.

El cable de retorno de datos podría implementarse utilizando un enfoque de colector abierto / drenaje abierto (use una resistencia de pull-up y haga que los esclavos tiren del cable cuando quieran enviar un "0" y lo dejen flotando cuando no), pero eso sería lento y sensible al ruido. La inmunidad a la velocidad y al ruido podría mejorarse si no se utiliza el método de colector abierto / drenaje abierto, sino que los nodos incluyen un circuito como el siguiente en sus cables de salida:

simular este circuito : esquema creado usando CircuitLab

Si el PIC hace que la salida sea alta, el bus será alto y, de la misma manera, si el PIC hace que la salida sea baja. Si el PIC deja la salida flotante sin ningún pull-ups interno habilitado, lo que debería hacer siempre que no tenga nada que decir, otros dispositivos en el bus podrán subirlo o bajarlo sin impedimentos.

    
respondido por el supercat
1

Al mencionar Rx y Tx desea tener comunicación bidireccional.

Iría por el antiguo protocolo UART. No es necesario un reloj, por lo tanto, su código puede concentrarse en un pin a la vez. Hay muchos códigos de ejemplo de UART bit bang por ahí.

Edición de publicación:
Para el canal de retorno (Tx en los esclavos) tienes que asegurarte de que los salves no interfieran entre sí. Primero se asegura de que solo un esclavo esté transmitiendo a la vez. El método más simple es que los esclavos solo responden después de que reciben un comando de 'lectura' del maestro. Todos los esclavos que no transmiten tienen su salida en triple estado (vea el comentario de @supercat más arriba)

Entonces es bueno tener una resistencia de pull-up en la línea, por lo que se encuentra en un estado definido si ninguno de los esclavos está activo (todos son enunciados)

He implementado un único protocolo de retorno UART como el de un producto comercial. Si lo haces bien funciona. La diferencia es que, en mi caso, la salida de un esclavo se estableció en 0 y yo controlaría el pin de triple estado para simular una salida de colector abierto. De esa manera no hay cortocircuito si accidentalmente hago un error en el programa. Recientemente hubo una pregunta sobre la equivalencia de coleccionista abierto y tri-estado en el intercambio de pila, pero ya no puedo encontrarla.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas