Según mis cálculos, diría que el problema es un error de velocidad de transmisión en exceso. El valor colocado en el registro UxBRG
determina en última instancia su velocidad de transmisión. Dado que el valor del registro debe ser un número entero, el valor obtenido de las fórmulas de velocidad de transmisión prescrita (en la hoja de datos) se redondea al número entero más cercano y se coloca en el registro; siempre hay algún error, la pregunta es '¿cuánto?' y '¿Es tolerable?'. Ya que está usando FCY / 2 (= 72/2 = 36 MHz) como reloj periférico y está usando el modo de velocidad estándar (es decir, BRGH = 0, también evidente porque está dividiendo por 16), entonces, para 1152000 baudios, según a la fórmula:
UxBRG = (FPB / 16 / BaudRate) - 1
UxBRG = (36000000 / 16 / 115200) - 1 = 18.53 = 18
Para calcular la cantidad de error que tenemos al truncar 18.53 hasta 18,
Baud Rate = FPB / 16 * (UxBRG + 1)
Baud Rate = 36000000 / 16 * (18 + 1) = 118421 // approximate
% Error = ((118421 - 115200) / 115200) * 100 = 2.79 %
El error de velocidad de transmisión aceptable difiere según el dispositivo y si sus dos dispositivos de la misma clase hablan entre sí (por ejemplo, PIC a PIC), pero en general está de acuerdo en que el 2% es un buen máximo para la mayoría de los casos y el 2.79% supera ese valor. Entonces, para resolver este problema, hay 2 formas en que puedo verlo:
-
En su lugar, use 72 MHz como el reloj periférico, si es posible.
UxBRG = (72000000 / 16 / 115200) - 1 = 38.06 = 38
Baud Rate = 72000000 / 16 * (38 + 1) = 115384
% Error = ((115384 - 115200) / 115200) * 100 = 0.16 %
Este error es aceptable.
-
Cambia del modo de velocidad estándar al modo de alta velocidad. Esto implica configurar BRGH
o, usando su biblioteca, llamar a OpenUART1
de esta manera:
OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE, (FPB/4/BAUDRATE)-1 );
Con este cambio, los nuevos valores son:
UxBRG = (36000000 / 4 / 115200) - 1 = 77.125 = 77
Baud Rate = 36000000 / 4 * (77 + 1) = 115384
% Error = ((115384 - 115200) / 115200) * 100 = 0.16 %
El mismo error que antes, sigue siendo aceptable.