9 votos

Cómo encontrar la línea UART libre para enviar datos

Tengo varias placas que se comunican entre sí con Rs485. Tienen ATMega microcontroladores de la serie como atmega168p o atmega8 . Cada tabla es libre de enviar datos en cualquier momento y tengo la limitación que lleva a No puedo usar Modbus . El número de tablas puede oscilar entre 5 y 10.

Mi problema es: Cómo puede una placa encontrar si la línea UART está libre para enviar datos, y si detecta que el bus está ocupado, esperar a que el autobús esté libre y luego enviar los datos propios?

¿Existe un indicador o registro especial que pueda cambiarlo automática o manualmente y que permita a la otra placa encontrarlo? La línea está ocupada ?

4 votos

Situaciones como ésta serían una de las muchas razones por las que el RS485 está siendo eliminado en favor del CAN.

1 votos

Debería haber utilizado el bus CAN. Ahora tienes que llevar la cuenta de capa 2 estado del autobús.

0 votos

¿cómo se trata la comunicación de 9 bits en este caso?

23voto

Tom Carpenter Puntos 7192

Bienvenido al mayor reto de los sistemas de comunicación semidúplex.

RS-485 no es un protocolo, es una norma que define las propiedades eléctricas de un enlace diferencial semidúplex(*). No hay nada en la especificación sobre cómo se deben enviar los datos a través de ese enlace, o de hecho cómo se utiliza el enlace.

Los transceptores RS-485 no tienen una señal/bandera/lo que sea de "línea ocupada" automática, ni tampoco los microcontroladores que tienen controladores RS-485 incorporados, ni los que utilizan un núcleo UART conectado a un transceptor externo.

Toda la implementación del control de flujo y del control de dirección se deja al protocolo que se utilice. Existen varios protocolos muy conocidos que utilizan controladores RS-485, como el Modbus. También puedes implementar cualquier protocolo que se te ocurra.

Para ayudarte, estas son un par de ideas de protocolos:

  1. Tienes un protocolo de tipo maestro-esclavo. En éste hay un nodo maestro que coordina el bus, y nodos esclavos que tienen cada uno 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 un esclavo está dirigido, puede responder a cualquier comando de una manera predefinida, por ejemplo, un paquete de respuesta de longitud fija.

    En este caso se evitan los problemas de que varios dispositivos quieran hablar al mismo tiempo porque el maestro está ahí para coordinarlo todo.

  2. Se podría utilizar alguna forma de programación por la que cada dispositivo del bus tenga un slot fijo en el que enviar datos a cualquier otro dispositivo. Una vez que su ranura se agota, debe dejar de enviar y permitir que el siguiente dispositivo hable.

    La programación podría ser realizada por los propios dispositivos sin necesidad de coordinación externa. El primer dispositivo habla y envía un mensaje diciendo que ha terminado. El siguiente dispositivo (por ejemplo, el de mayor ID) sabría entonces que puede ir. En caso de que un dispositivo no responda, se podría tener un tiempo de espera por el que cada dispositivo posterior en el programa podría decir: bueno, no he oído nada del dispositivo anterior a mí durante un tiempo, así que debe ser mi turno.


(*) Creo que también define una versión full-duplex utilizando dos enlaces diferenciales.

0 votos

Creo que en una configuración multimaster como la que tiene el OP el mayor reto es conseguir que las estaciones nuevas/reconectadas estén sincronizadas con las existentes, incluyendo un posible netsplit.

0 votos

Gracias Tom...creo que tus 2 propuestas conducen a una cosa... Enfoque maestro-esclavo ...es una buena forma si el emisor y el receptor tienen suficientes recursos...mientras que el uso de un atmega8 microcontrolador, creo que su plomo a la inestabilidad en el rendimiento del dispositivo

1 votos

Pero creo que si se usa SOF y EOF por una bandera para notificar a toda la junta que el la línea está ocupada pero debe poner un ID de la placa de destino para decir a una placa especial que el paquete Es para ti ¿Cuál es su opinión?

9voto

Gregory Kornblum Puntos 1282

Es muy similar a la comunicación por radio de los militares o la policía. Se requiere un protocolo. El maestro-esclavo es fácil y bueno para la mayoría de los casos. Pero otra opción es hacerlo como lo hacen los humanos:

  1. Escucha.
  2. Si alguien habla, espera.
  3. Si crees que nadie habla, puedes hablar tú.
  4. Espera la confirmación.
  5. Si no se recibe confirmación, vuelva a hablar.
  6. Si quieres emitir, pide a todas las emisoras que confirmen la escucha.
  7. Si quieres hablar con alguien que no puede oírte, pregunta si hay otra persona que pueda transmitirte.

Y así sucesivamente. Puede ser muy interesante ponerlo en práctica. Buena suerte.

0 votos

También se utiliza para la creación de redes: es.m.wikipedia.org/wiki/

0 votos

Esta es una buena manera, pero tienen un problema que si (por cualquier razón) una junta podría nit decir He terminado el bus está ocupado para siempre ...y si se utiliza un temporizador para detectar no está ocupado Esto obliga a una sobrecarga adicional para el microcontrolador, ¿tiene usted una manera de resolver este problema?

1 votos

También existe la posibilidad de que un chico brutal haga pedazos tu dispositivo. Lo siento, no he dicho que todo tenga solución.

3voto

Glenn W9IQ Puntos 659

Aquí tienes un par de posibilidades para resolver tu dilema.

  1. Implementar un sistema de paso de fichas. Cuando un dispositivo tiene el token, se le permite transmitir durante un periodo de tiempo limitado. A continuación, pasa el testigo al siguiente dispositivo. Hay que tomar medidas para los nodos perdidos que no pueden recibir y pasar el testigo.
  2. Mira la línea de recepción. Si está ocupada, genera un retardo aleatorio y vuelve a intentarlo. El retardo aleatorio ayuda a garantizar que ningún nodo pueda monopolizar las ventanas de transmisión. Todavía pueden producirse colisiones, pero una función de suma de comprobación puede determinar si el paquete recibido está intacto. Si no está intacto, el receptor puede solicitar una retransmisión.

0 votos

Para empezar el número 1, un token debe enviarse desde un tablero que funcione como Master ...en un solo bus todos los tableros reciben token, ¿cómo podría un token mantenerse en un tablero?

0 votos

@combo_ci puede designar un maestro o puede negociar el originador del token determinando la dirección de bus más baja o similar.

0 votos

@combo_ci podrías intentar pasarlo a un dispositivo concreto de la línea, uno que establezca la red

2voto

Jeremy Puntos 424

Cómo puede una placa saber si la línea UART está libre para enviar datos,

la respuesta general es que sin algún tipo de protocolo, no puede hacerlo de forma fiable. normalmente se depende de un controlador o árbitro para ver si una línea está ocupada o no. Una forma sencilla sería que un pin OD bajara una línea indicadora antes de la transmisión y la liberara después. Leyendo esa línea un transmisor puede determinar si el bus está disponible o no.

un sistema menos fiable pero más sencillo es integrar la tensión del bus (a través de una red r/c, por ejemplo).

¿y si detecta que el bus está ocupado, espera hasta que el bus esté libre y entonces envía sus propios datos?

el enfoque general es esperar un periodo de tiempo aleatorio y volver a intentarlo.

2voto

drt Puntos 334

Yo resuelvo este problema con mis diseños de esta manera:

en lugar de usar 2 pines para la comunicación, uso 3 pines. En distancias cortas funciona. El tercer pin es el indicador de línea ocupada. Este pin se tira hacia arriba desde el lado del maestro. Cuando alguien (MCU o lo que sea) quiere hablar:

  • comprueba el estado de este pin (INPUT).
  • si el pin es ALTO entonces hace que el pin sea bajo (OUTPUT)
  • y charlas.
  • Cuando el mensaje se transfiere libera el pin (INPUT) (alta impedancia) entonces el pin se pone en alto.
  • Si el pin está bajo, entonces espera un tiempo y vuelve a comprobar el ciclo del pin.

Esta es una implementación de la respuesta de Gregory Kornblum.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X