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?
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 CKDIV8
fusible. Parece que lo tienes cubierto con la medición CKOUT
, pero lo dejaré aquí para el beneficio de cualquier otra persona con problemas similares.
yippie
Isvara
Rdo
Isvara