Tengo varias placas que se comunican juntas con Rs485. Tienen ATMega
microcontroladores en serie como atmega168p
o atmega8
. Cada placa es libre de enviar datos en cualquier momento y tengo limitaciones que conducen a que no pueda usar Modbus . El número de tableros puede variar de 5 a 10.
Mi problema es: ¿cómo puede encontrar una placa si la línea UART es libre de enviar datos, y si detecta que el bus está ocupado, espere hasta que el bus esté libre y luego envíe sus propios datos?
¿Hay un indicador o registro especial que pueda cambiarlo automática o manualmente y dejar que la otra placa encuentre que la Línea está ocupada ?
Respuestas:
Bienvenido al mayor desafío con los sistemas de comunicaciones half-duplex.
RS-485 no es un protocolo, es un estándar que define las propiedades eléctricas para un enlace diferencial half-duplex (*). No hay nada en la especificación sobre cómo se enviarán los datos a través de ese enlace, o de hecho cómo se usa el enlace.
Como tales transceptores RS-485 no tienen señal automática / línea "bandera ocupada" / lo que sea, ni los microcontroladores que tienen controladores RS-485 incorporados, ni los que usan un núcleo UART conectado a un transceptor externo.
Toda implementación de control de flujo y control de dirección se deja a cualquier protocolo que utilice. Existen varios protocolos bien conocidos que utilizan controladores RS-485, como Modbus. También puede implementar cualquier protocolo que se le ocurra.
Para ayudarlo, estas son algunas ideas para protocolos:
Tiene un protocolo de tipo maestro-esclavo. En esto hay un nodo maestro que coordina el bus y nodos esclavos, cada uno de los cuales tiene un identificador único.
Los nodos esclavos no pueden enviar ningún dato hasta que el nodo maestro envíe específicamente comandos dirigidos a ellos. Una vez que se direcciona un esclavo, puede responder a cualquier comando de alguna manera predefinida, digamos un paquete de respuesta de longitud fija.
En este caso, evita los problemas de varios dispositivos que desean hablar al mismo tiempo porque el maestro está allí para coordinar todo.
Podría usar alguna forma de programación mediante la cual cada dispositivo en el bus tiene una ranura fija en la que enviar datos a cualquier otro dispositivo. Una vez que se agota su ranura, debe dejar de enviar y permitir que el siguiente dispositivo hable.
La programación podría ser realizada por los propios dispositivos sin coordinación externa. El primer dispositivo habla y luego envía un mensaje diciendo que está hecho. El siguiente dispositivo (por ejemplo, el que tiene la siguiente ID más alta) sabría que podría funcionar. En caso de que un dispositivo no responda, podría tener un tiempo de espera por el cual cada dispositivo posterior en el cronograma podría decir: bueno, no he sabido nada del dispositivo antes que yo, por lo que debe ser mi turno.
(*) Creo que también define una versión full-duplex usando dos enlaces diferenciales.
fuente
atmega8
microcontrolador, creo que conduce a la inestabilidad en el dispositivo actuaciónEs muy similar a la comunicación por radio de los militares o la policía. Se requiere un protocolo. Master Slave es fácil y bueno para la mayoría de los casos. Pero otra opción es hacerlo como lo hacen los humanos:
Y así. Puede ser muy interesante de implementar. ¡Buena suerte!
fuente
Aquí hay un par de posibilidades para resolver su dilema.
fuente
la respuesta general es que sin algún tipo de protocolo, no puede hacerlo de manera confiable. normalmente confía en un controlador o árbitro para ver si una línea está ocupada o no. Uno simple sería un pin OD tirando una línea indicadora hacia abajo antes de la transmisión y soltándola después. Al leer esa línea, un transmisor puede determinar si el bus está disponible o no.
Un sistema menos confiable pero más simple es integrar el voltaje del bus (a través de la red ar / c, por ejemplo).
El enfoque general es esperar un período de tiempo aleatorio y volver a intentarlo.
fuente
Resuelvo este problema con mis diseños de esta manera:
en lugar de usar 2 pines para comunicación, uso 3 pines. A distancias cortas funciona. El tercer pin es el indicador de línea ocupada. Este pin se levanta del lado maestro. Cuando alguien (MCU o lo que sea) quiere hablar:
Esta es una implementación de la respuesta de Gregory Kornblum.
fuente
Puede usar la pila de protocolo BACnet de código abierto para la comunicación por microcontrolador en RS485 si no desea usar Modbus. Esencialmente, solo pasa un token que le dice a cada dispositivo cuándo puede enviar, similar a la topología de token-ring y Ethernet. Aquí hay un par de enlaces para comenzar:
http://www.chipkin.com/bacnet-mstp-installation-rs485-and-cables/ http://bacnet.sourceforge.net/
fuente
Software de control de flujo
Tanto el software como el control de flujo de hardware necesitan software para realizar la tarea de reconocimiento. Esto hace que el término control de flujo de software sea algo engañoso. Lo que se quiere decir es que con el control de flujo de hardware, hay líneas adicionales en el cable de comunicación que indican condiciones de comunicación. Con el control de flujo de software, que también se conoce con el nombre de control de flujo XON-XOFF, los bytes se envían al remitente utilizando las líneas de comunicación estándar.
El uso del control de flujo por hardware implica que deben existir más líneas entre el emisor y el receptor, lo que conduce a un cable más grueso y costoso. Por lo tanto, el control de flujo de software es una buena alternativa si no es necesario para obtener el máximo rendimiento en las comunicaciones. El control de flujo de software hace uso del canal de datos entre los dos dispositivos, lo que reduce el ancho de banda. Sin embargo, en la mayoría de los casos, la reducción del ancho de banda no es tan sorprendente como una razón para no usarla.
Se han predefinido dos bytes en el juego de caracteres ASCII para usar con el control de flujo de software. Estos bytes se denominan XOFF y XON, porque pueden detener y reiniciar la transmisión. El bytevalue de XOFF es 19, se puede simular presionando Ctrl-S en el teclado. XON tiene el valor 17 asignado que es equivalente a Ctrl-Q.
Usar el control de flujo de software es fácil. Si se debe posponer el envío de caracteres, se envía el carácter XOFF en la línea, para reiniciar la comunicación nuevamente se utiliza XON. El envío del carácter XOFF solo detiene la comunicación en la dirección del dispositivo que emitió el XOFF.
Este método tiene algunas desventajas. Uno ya se discutió: el uso de bytes en el canal de comunicación ocupa algo de ancho de banda. Otra razón es más severa.
El protocolo de enlace se utiliza principalmente para evitar una saturación del búfer del receptor, el búfer en la memoria utilizado para almacenar los bytes recibidos recientemente. Si ocurre un desbordamiento, esto afecta la forma en que se manejan los nuevos caracteres en el canal de comunicación. En el peor de los casos en que el software se ha diseñado mal, estos caracteres se descartan sin verificarlos. Si dicho personaje es XOFF o XON, el flujo de comunicación puede sufrir daños graves. El remitente proporcionará continuamente nueva información si se pierde el XOFF, o nunca enviará nueva información si no se recibió XON.
Esto también es válido para las líneas de comunicación donde la calidad de la señal es mala. ¿Qué sucede si el mensaje XOFF o XON no se recibe claramente debido al ruido en la línea? También es necesaria una precaución especial para que la información enviada no contenga los caracteres XON o XOFF como bytes de información.
Por lo tanto, la comunicación en serie utilizando el control de flujo de software solo es aceptable cuando las velocidades de comunicación no son demasiado altas, y la probabilidad de que se produzcan desbordamientos del búfer o daños en los datos es mínima.
CSMA de alta velocidad
Para la alta velocidad como la detección de portadora CSMA de ethernet , se ha analizado el acceso múltiple, detección / evitación de colisión, con temporizadores de retroceso aleatorio para determinar la probabilidad estocástica de optimización.
fuente