ATmega1284 funcionando muy lentamente hasta que se vuelva a flashear

Cuando enciendo mi ATmega1284, se ejecuta extremadamente lento, probablemente menos de una décima parte de su velocidad normal, a juzgar por los LED cíclicos que ejecuta. Está configurado para usar el oscilador interno sin divisor, y he confirmado que CKOUT está dando un reloj de 8 MHz.

Restablecerlo no ayuda, pero si lo ISP (solo flash, no fusibles), de repente comienza a funcionar a toda velocidad nuevamente. lfuse es 0xA2 (oscilador RC interno, sin divisor).

¿Cuál es la causa probable de esto? ¿Qué más debo probar?

solo despues de encender? Y una vez que parpadeó, funciona bien, ¿hasta que enciende y enciende? ¿Es eso lo que estás diciendo?
Acabo de encenderlo un par de veces y vuelve a la velocidad correcta. Entonces, tal vez sea el primer encendido después de estar apagado por un tiempo. Voy a apagarlo un poco y ver si eso hace la diferencia.
¿Resolviste este problema? Me pregunto cuál era el problema.
No hice. No he podido reproducirlo de manera confiable, lo que hace que probarlo sea un poco difícil.

Respuestas (1)

Aquí hay una lista de verificación de algunas cosas que pueden ayudar a localizar el problema:

  • Si está utilizando interrupciones de cualquier forma, asegúrese de que las líneas de E/S relacionadas siempre se mantengan en estado estable. Por ejemplo, si tiene un botón conectado sin un pull-up/down, tal vez factores externos estén causando que oscile. La aparente lentitud puede deberse a que el procesador dedica todo su tiempo a atender las interrupciones.

  • Asegúrese de que los condensadores de desacoplamiento adecuados estén en su lugar. Si bien eso puede parecer poco probable porque la programación parece borrarse, también puede ser una condición del oscilador que se borra moviéndolo físicamente o aplicando una fuente de voltaje externa durante la programación.

  • Verifique que generalmente esté ejecutando todo dentro de las especificaciones. Por ejemplo, cuando se trata de LED, si observa la parte inferior de la hoja de datos del ATmega1284 de la página 324 , verá que ciertos grupos de pines de E/S tienen un límite de corriente total de 100 mA.

  • Has mencionado que el problema es difícil de repetir. Puede valer la pena tomar nota de las condiciones ambientales, como la temperatura, la cercanía de teléfonos celulares, etc., en el momento en que ocurre. Para los circuitos que funcionan con baterías, tal vez verifique el voltaje de la batería en ese momento, para los que funcionan con la red, piense en cosas como los acondicionadores de aire que pueden degradar la calidad de la energía.

  • Si solo ha fabricado un único dispositivo si es práctico, podría valer la pena construir un segundo sistema en caso de que haya encontrado un componente defectuoso o dañado algo durante el ensamblaje/desarrollo. Si no, al menos probaría con otro AVR.

  • Si bien no es una buena solución a largo plazo, tal vez podría ver si habilitar el temporizador de vigilancia solucionará el problema detectando la operación lenta del programa y reiniciando.

  • Has mencionado alrededor de diez veces más lento. Tal vez podría ralentizar los bucles de tiempo en gran medida para dar un tiempo de ciclo esperado de, digamos, 10 segundos. Entonces podrás medir la hora exacta con un cronómetro y hacerte una idea más precisa. Si fue exactamente 8 veces, indicaría algo extraño con el CKDIV8fusible. Parece que lo tienes cubierto con la medición CKOUT, pero lo dejaré aquí para el beneficio de cualquier otra persona con problemas similares.