errores de transmisión de USART con CP210x

1

Estoy enviando los resultados de ADC desde un controlador ATmega16 a una PC a través de CP2102 . Baudrate: 0.5Mb / s, 8 bits de datos, 1 bit de parada, sin paridad. He escrito un software para visualizar los datos recibidos. Este es un ejemplo de los resultados de ADC de muestrear una señal de onda sinusoidal:

Enalgúnmomento,miPCestababajounacargapesadayesteeselresultadoquetuve:

En mi pregunta anterior asumí que estos picos fueron causados por el propio ADC . Sin embargo, ahora se ve claramente que estos picos son causados por errores de transmisión.

Por lo que entiendo, este problema ocurre debido al desbordamiento del búfer de CP210 TX. ¿Mi suposición es correcta? Y si es así, ¿qué se puede hacer para evitar esto?

Además de estos picos, también he encontrado otro problema. Estoy enviando dos bytes consecutivamente (ADCL y ADCH). Lo que he notado es que a veces se intercambian los bytes recibidos (es decir, se recibe ADCH antes de ADCL).

He volcado algunos datos donde ocurren los picos (el primer byte es ADCH, el segundo es ADCL y el número es el valor entero resultante)

Ejemplo 1:

821 : 00000011, 00110101
803 : 00000011, 00100011
783 : 00000011, 00001111
1018 : 00000011, 11111010
740 : 00000010, 11100100
718 : 00000010, 11001110
694 : 00000010, 10110110

Ejemplo 2:

229 : 00000000, 11100101
237 : 00000000, 11101101
246 : 00000000, 11110110
255 : 00000000, 11111111
10 : 00000000, 00001010
276 : 00000001, 00010100
289 : 00000001, 00100001

Actualización: se agregó rutina de inicialización de inicio de sesión

#define F_CPU 16000000UL
#define USART_BAUDRATE 500000
#define BAUD_PRESCALE ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)

void USARTInit() {
    UBRRH &= ~(1 << URSEL);
    UBRRH = (unsigned char) (BAUD_PRESCALE >> 8);
    UBRRL = (unsigned char) BAUD_PRESCALE;
    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // 1 stop bit, 8-bit data length
}

Actualización: agregó una prueba simple para usart

He deshabilitado ADC y he reemplazado mi rutina principal con un simple bucle:

for (uint16_t i = 0; i < 1023; i++) {
    USARTSendByte(uint8_t(i));
    USARTSendByte(uint8_t(i >> 8));
}  

Cuando inicio el terminal en mi computadora y pongo el sistema bajo una gran carga (muchos procesos en segundo plano) a veces recibo resultados como estos:

...
252 : 00000000, 11111100
253 : 00000000, 11111101
254 : 00000000, 11111110
255 : 00000000, 11111111
0 : 00000000, 00000000
257 : 00000001, 00000001
513 : 00000001, 00000010
769 : 00000001, 00000011
260 : 00000001, 00000100
261 : 00000001, 00000101
...
    
pregunta Ashton H.

1 respuesta

1
  

Por lo que entiendo, este problema ocurre debido al desbordamiento del búfer de CP210 TX. ¿Mi suposición es correcta?

No tenemos suficientes detalles para responder esto, pero suena muy probable.

  

Y si es así, ¿qué se puede hacer para evitar esto?

El CP210x proporciona las señales de protocolo de enlace RS232, por ejemplo. RTS / CTS - pero eso requeriría un búfer para los datos de UART en el ATmega.

Intente usar un búfer grande en el lado de la PC: las transferencias USB funcionan sin muchas intervenciones de CPU en la mayoría de los casos. Tenga en cuenta que no puede eliminar la pérdida de datos cuando la carga de la PC es demasiado alta, solo puede intentar migrarla con algún tipo de protocolo.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas