PIC16F1788: ¿cómo puedo determinar de manera confiable cuándo se completa la transmisión del byte EUSART?

2

Tengo una aplicación donde envío mensajes semidúplex en un bus RS485.

Mis dispositivos esclavos en este bus normalmente están en modo de recepción, escuchan los comandos, y cuando reciben un comando, cambian al modo de transmisión y transmiten una respuesta al maestro.

Los esclavos usan el EUSART de un microcontrolador PIC16F1788.

Me he dado cuenta de que el último byte en esta respuesta a veces está dañado.

Tengo una teoría de que esto podría deberse a que el último byte del mensaje no se transmite completamente antes de que el esclavo deshabilite el controlador en el chip de interfaz RS485 que estoy usando, y por lo tanto cortando el último byte.

Mi código de espera hasta que se haga la transmisión es así:

while (TRMT==0)
{
}
RS485_DRIVER_ENABLE=0;

RS485_DRIVER_ENABLE es un #define asignado a un pin de salida conectado a la habilitación de transmisión en el chip RS485.

Leyendo el manual de PIC:

enlace

Dice:

"El bit TRMT permanece libre hasta que todos los bits se hayan salido del registro TSR".

Sin embargo, lo que realmente me interesa es que todos los bits se transmitan, por lo que lo anterior parece no ser exactamente la garantía correcta que me gustaría.

¿Debo agregar un retardo de, por ejemplo, 2-3 bits después de que se indique la TRMT?

¿Hay alguna "mejor práctica" para este tipo de cosas?

    
pregunta avl_sweden

1 respuesta

1

Acabo de ver la hoja de datos. El indicador TRMT se establece cuando el registro de cambio de transmisión está vacío, pero antes de que se haya enviado el bit de parada (la figura 28-3 muestra que se estableció a medio camino). Esto significa que probablemente esté golpeando el bit de parada, lo que está causando los errores observados. Podría valer la pena confirmarlo con un osciloscopio si tiene uno, pero parece la explicación más obvia.

La solución más simple es retrasar al menos un tiempo de bit de parada después de su bucle de sondeo TRMT. Otra opción es habilitar el modo de 9 bits y hacer que el bit adicional sea otro bit de parada, aunque luego enviará dos bits de parada entre bytes secuenciales, lo que reducirá ligeramente el rendimiento de los datos.

    
respondido por el Jon

Lea otras preguntas en las etiquetas