Problemas de velocidad en la placa convertidora casera de RS232 a TTL

Todavía estoy tratando de depurar esta placa convertidora de RS232 a TTL que hice, que se muestra a continuación.

Mi placa RS232 a TTL y mi configuración

Ahora creo que he reducido el problema a la velocidad :

  • funciona bien a 57.600 baudios;
  • pero inserta algunos errores durante la comunicación a 115.200 baudios.

Esta vez probé la placa con un firmware de eco simple a continuación, que básicamente repite todo lo que ingresa al puerto serie.

void setup() { 
  Serial.begin(57600);
}
void loop() {
  if (Serial.available() > 0) {
    Serial.write(Serial.read());
  }
}

A 57.600 baudios, devuelve una serie de Bcaracteres sin errores, como se muestra a continuación.

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

A 115.200 baudios, se producen algunos errores en la salida.

BBÂBBBBBBBBBBBBBBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBB
BBBBBBBBÂBBBBBBBBBBBBBBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBÂBBBBBBBBBBBBBBBBBBBBBB

La tasa de error parece ser bastante constante y siempre es la misma. Tenga en cuenta que la diferencia entre los códigos char By ÂASCII es solo un bit negado y otro desplazado una posición a la izquierda.

B - 01000001
 - 11000010
    ^     ^

La hoja de datos de MAX232 dice que funciona hasta 120 kbps, así que creo que mi placa está causando el problema.

Entonces, esa es la nueva evidencia que tengo hasta ahora. Mi pregunta es: ¿ Cuál sería la razón probable de los problemas con mi convertidor?

Aquí hay una foto del diseño de mi tablero, si eso ayuda. Ignore los LED TX y RX, los he desconectado.

ingrese la descripción de la imagen aquí

¿Tu placa usa un cristal de 16 MHz igual que un Arduino? Eché un vistazo a wormfood.net/avrbaudcalc.php y el error será del 3,7%; debería estar bien si el convertidor USB es preciso (que normalmente lo son), pero podría valer la pena verificar el tiempo de bits de la línea TX en ambos con un alcance.
@PeterJ: sí, mi tablero de destino, donde se encuentra el ATmega328, tiene un cristal de 16 MHz, como un Arduino.
@PeterJ: obtengo un error de aproximadamente 4.5% en 115,200, que es compatible con esa tabla. Pero no obtengo el 2,1% por 57.600 (obtengo cero). Pero me sorprendería si esa fuera la causa de mi problema, porque tengo una placa Arduino Single Sided Serial que tiene un convertidor similar y no muestra esa tasa de error a esa velocidad. De todos modos, ese es un consejo útil, ¡gracias!

Respuestas (2)

Probablemente sea el cristal en tu tablero objetivo.

Una roca de 16 MHz probablemente no pueda generar un reloj de 115200 baudios exactamente lo suficiente. Durante un flujo continuo de caracteres lo suficientemente largo, los relojes de los dos dispositivos se desincronizarán. Eventualmente, obtendrá un error de trama y un carácter incorrecto, y los dispositivos se resincronizarán en el siguiente flanco descendente (bit de INICIO).

El hecho de que sus errores sean aproximadamente periódicos tiende a respaldar esta hipótesis. Vi un problema similar (a una velocidad mucho más baja) en una línea de módem a una minicomputadora hace muchos, muchos años.

Si puede alimentar su UART con un reloj que es exactamente correcto para 115200, hágalo y vea qué sucede. (Si tiene acceso a un generador de señales realmente bueno y CARO, utilícelo).

Puede que sea eso, si. Pero lo más extraño es que tengo otra placa convertidora (sin el IC MAX232, solo usando el truco del transistor) que no me da el mismo problema, incluso conectada a la misma placa Arduino de destino. Debe ser algo en la placa del convertidor que agrega ruido o error, pero no estoy seguro. No tengo un generador de señal de gama alta, pero probaré la placa con mi alcance (nuevamente) solo para verificar el tiempo. ¡Gracias! +1
@Ricardo: cuando prueba la placa, puede intentar configurar su patrón de prueba para que sea un flujo continuo de U mayúscula. El código ASCII es 0x55, lo que le brinda una onda cuadrada perfecta a la mitad de la velocidad en baudios. Sonda en ambas direcciones.

Supongo que es un problema de cristal de 16MHz como se menciona en el comentario. Debería obtener un 3,7 % a 115200, no un 4,5 %. Por lo tanto, tal vez 0% @ 57600 en lugar del 2.1% de la hoja de datos puede ser una inexactitud del cristal. De todos modos, tampoco puedo usar 115200@16MHz contra ningún dispositivo serie "preciso". No hay problema en la placa Arduino 2560 usando 2560<->16u2<->cadena USB porque 2560 y 16u2 tienen el mismo cristal (es decir, error de baudios) y la velocidad de serie del USB es solo una velocidad virtual.

Intente hacer eco de char con más bits e inspeccione qué cambio de bit ocurre en respuesta.

El error se revela muy bien si conecta el analizador lógico con el decodificador UART ;-)