Hola chicos.
Estoy investigando una serie de circuitos para el control automático de la dirección de escritura/lectura en un bus RS485 con ModBus como protocolo. Estos circuitos controlan al transceptor, ya sea un MAX485 o similar, actuando sobre los pines DE/RE poniendo al chip en modo emisión o recepción.
Si me preguntáis ¿para qué? Obviamente para ahorrarme un pin del Arduino. No es que sea algo importante pero me gustaria entender bien dichos circuitos.
Veamos el primer circuito basado en un inversor 74xx14:
Cuando no estamos transmitiendo la señal TX se encuentra en estado HIGH. Vamos a suponer que hemos conectado hace un rato el circuito, por lo tanto el condensador C estará ya cargado. Por lo tanto en la entrada del inversor tendremos un valor HIGH y la salida será LOW. En este estado el MAX485 tiene la unión de patillas DE/RE a nivel bajo lo que indicará que está en modo recepción.
Cuando enviamos un byte lo primero que ocurrirá será un start bit en la señal, es decir, un cambio a nivel bajo de la señal TX. En ese momento el condensador se descargará rápidamente a través del diodo D, haciendo que la entrada del inversor se ponga a LOW. La salida del inversor se pondrá a nivel alto poniendo a su vez al MAX485 en modo escritura.
Obviemos los datos de momento. Al terminar la transimisión del byte se producen los bits de parada y si no enviamos nada mas la señal TX vuelve a estar en HIGH. Como el condensador estaba descargado empieza a cargarse lentamente a través de la resistencia R. Hasta que el valor de tensión no alcance un nivel suficiente para que el 74xx14 lo acepte como nivel alto, la señal permanecerá en modo escritura. Cuando la tensión alcanza dicho valor el inversor cambia su salida poniéndose a LOW de nuevo (en modo lectura).
¿Que pasa con los datos? Generalmente cuando se produzca el start bit el chip pasa a modo escritura y debe permanecer así al menos hasta que se haya enviado todo el byte. Para una trama Modbus un byte suele ser: un bit de inicio, 8 de datos y dos de parada; haciendo un total de 11bits.
Dependiendo de la velocidad o baud rate estos bits tardaran mas o menos en enviarse, por ejemplo, para una velocidad de 9600 baudios, un bit tarda 1/9600s, por lo tanto para un byte completo se tardan unos 1.15ms.
También se deben tener en cuenta los tiempos entre caracteres (T15) y entre paquetes (T35). En ModBus estos tiempos son fijos para velocidades superiores a los 19200 baudios y son T15=750us y T35=1.75ms.
Si la velocidad es inferior el tiempo ha de ser calculado. T15 y T35 representan el tiempo en enviar 1.5 caracteres y 3.5 caracteres respectivamente.
Curiosamente el tiempo T15 es muchas veces obviado y muchos programas de PC no lo controlan, aunque nuestro Arduino suele ser más preciso y puede perfectamente controlar esos tiempos.
El circuito no es invención mia, si no que es uno de los circuitos más conocidos y usados en la red, solo hace falta hacer una busqueda en google y vereís que ya hay módulos RS485 que usan dicho circuito.
El "pero" que veo es que he visto muchos circuitos y muchos valores distintos del valor de la resistencia y el condensador. Y no le veo la razón a dichos valores.
Por ejemplo, para una velocidad de 9600 baudios usando 8N2 tenemos que el tiempo será de unos 1.15ms. Si fijamos el valor del condensador a 100nF y aplicamos la formula simple de carga del condensador (T=RC) obtendremos un valor de resistencia de 11k5. Si tomamos en cuenta el tiempo t15 la señal deberá permanecer en LOW al menos 1.725ms, aplicando la formula de nuevo la resistencia será de 17k2. He visto valores de resistencia muy superiores a esos en casi todos los circuitos y no me cuadran para ninguna velocidad.
No sé si es que se me escapa algo del circuito o qué. ¿Vosotros qué opinais?
He intentado hacer una simulación en proteus pero no soy capaz de ver el retraso a no ser que exagere mucho el tiempo.