¿Por qué mi AVR actúa de manera extraña (restablecimientos, daños en los datos) al recibir algunos bytes en el UART?

2

Tengo un ATmega644 conectado a otro dispositivo usando el UART. Después de recibir unos pocos caracteres en el UART, el dispositivo se reinicia y / o actúa extraño. Algunos ejemplos de este comportamiento:

  • El código antes de que se ejecute de nuevo el bucle principal, pero MCUSR es 0 (es decir, no hay reinicio "real")
  • El código dentro del bucle principal se ejecuta a pesar de que no se presionaron los interruptores conectados a las entradas (los pullups están configurados correctamente).
  • A veces el MCU simplemente se cuelga
  • A veces, los puertos que no estaban configurados como salidas actúan como salidas (por ejemplo, los LED conectados a ellos se iluminan aunque el DDR para ese puerto es 0).

El dispositivo está utilizando un cristal externo de 18.432 MHz y el UART está configurado en 19200 baudios. Se alimenta con 5V; el pin RX está conectado a un 3V3 RPi.

    
pregunta ThiefMaster

4 respuestas

0

Esto generalmente es causado por fusibles CKSEL incorrectos. El ATmega644 debe configurarse para conducir el cristal en modo "Oscilador de giro completo" para velocidades de reloj superiores a 16 MHz; para ciertas otras MCU, esta opción parece ser un bit de fusible separado llamado CKOPT o CLKOPT

En mi caso, el uso de CKSEL = 0111 lo solucionó, pero la mejor manera de averiguar los fusibles adecuados es mediante el uso de una calculadora de fusibles y luego verificando los resultados en la hoja de datos antes de escribirlos.

    
respondido por el ThiefMaster
4

Incluso si el problema con esta configuración en particular era otra cosa (como se señaló en otra respuesta), otra razón común es que el controlador está funcionando fuera del "área de operación segura" con respecto a la velocidad de reloj de Vcc VS.

Con una velocidad de reloj de 18.432 MHz, el dispositivo necesitaría al menos aproximadamente 4.2V para funcionar correctamente.

    
respondido por el Rev1.0
2

¿El comportamiento intermitente es a menudo el resultado de tapas de desacoplamiento de energía faltantes o insuficientes cerca de su controlador? Como regla general, 100nF para cada pin etiquetado Vcc, lo más cerca posible de los pines de alimentación del controlador. Mientras está en ello, siempre es bueno revisar dos veces los rieles de alimentación con un voltímetro (y un osciloscopio cuando esté disponible).

    
respondido por el jippie
0

¿Es posible que haya conectado el puerto RS232 de la computadora directamente a los pines UART de la MCU ATmega?

Las oscilaciones de voltaje + y - del puerto RS232 causarán estragos en el funcionamiento correcto del silicio MCU. Ese caos podría provocar cualquiera de los síntomas de falla que ha descrito.

Normalmente, un puerto RS232 de una computadora PC tiene sus líneas protegidas a través de una parte traductora de nivel de voltaje que las convierte a niveles de voltaje compatibles con la MCU. Si no tiene esto en su lugar, se requiere un cambio en su configuración.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas