Hemos estado utilizando ATmega48/88/168/328 los microcontroladores con éxito durante muchos años en muchos de nuestros productos. Ahora hemos considerado a cambiar a partir de la Una y PA variantes a la nueva PB variante (porque vamos a necesitar los pines extras, temporizadores y UARTs en nuevos productos, porque es más barato, y porque parece que el viejo variantes será descontinuado), así que nos cambiamos a cabo una ATmega328A con un ATmega328PB. Parece ir de mal en peor muy a menudo después de las interrupciones de energía. Estos problemas nunca se produjo con la edad variantes.
Regular las interrupciones de energía son normales para el caso de uso de nuestros productos. Utilizamos una fuente de poder (como este) para 5V, y capacitores en el 220µF rango en el ATmega de VCC, para mantener el SRAM vivo por las interrupciones de energía en el rango de varios minutos, para almacenar interno de los estados que no son de misión crítica, pero aumentar significativamente la experiencia de usuario está disponible al instante después de un reinicio (estos estados de cambio, a menudo suficiente para hacer la EEPROM no apto). Esto siempre ha funcionado.
Sin embargo, con la nueva ATmega328PB, después de una interrupción de la alimentación, el chip se restablece sin una condición de reinicio que se encuentra en MCUSR, y el reloj parece ir de mal en peor.
- el marrón de salida del detector se establece por fusible. Hemos probado todos los disponibles bodlevel, el problema sucede en todos ellos.
- utilizamos externo de 20 MHz, también se establece correctamente por fusible.
- tratamos de 3 chips diferentes, así que no fue una sola soldadura u otro fallo de hardware.
Después de que se produce el fallo, el reloj de frecuencia de los conjuntos de 2.5 x velocidad más lenta, lo que indica que el mcu está siendo desplazado por el de 8 MHz oscilador interno. Sin embargo, a veces la desaceleración es de alrededor de 6x. Esto significa que no puede ser un error de software cambiar el divisor de reloj, ya que no puedo configurar los fusibles de software, y el divisor de reloj no se puede dividir el reloj de 2.5 o por 6.
Por lo tanto, mi primer sospechoso era el nuevo Reloj de Detección de Fallo de fusible. Sin embargo, no importa si está encendido o apagado, el comportamiento sigue siendo el mismo.
Para descartar software peculiaridades, escribí un simple programa de prueba desde cero, lo cual no hace otra cosa sino que alterna una salida con 100 Hz de un temporizador de interrupción, y se indica con el Led después de cada reinicio que restablecer las condiciones fueron activados (como lectura de MCUSR). El resto del hardware también fue eliminado, sólo el mcu y el regulador están allí (y el indicador led con resistencias en serie).
Los resultados
Aproximadamente 2/3 del tiempo, nada interesante sucede. Después de la interrupción de la alimentación, la mcu reanuda su trabajo, tanto en el brown-out reset y power-on reset indicadores de encendido.
(en la imagen, el rojo es el tensado de pin, y el azul es VCC. En esta imagen, el 2.7 V bronwn es claramente visible. Hice las mismas pruebas con el otro marrón-ajustes de salida, los resultados son exactamente los mismos, así que voy a omitir las fotos)
Aproximadamente 1/3 del tiempo, en el mencionado fallo se produce, y cuando el poder está de vuelta de nuevo, ninguno de los brown-out reset y power-on reset indicadores se iluminan! El resultado es diferente, como si el mcu fue marcando con un extraño reloj. No es caótica, sin embargo, mantiene marcando con la misma frecuencia.
Curiosamente, en esta situación, el brown-out detector parece ser totalmente inactivo, debido a que después de la próxima interrupción de la alimentación (donde la correcta reloj es a veces restaurado, a veces no), es claramente visible que la salida se mantiene la alternancia después de brown-out ha sido aprobada. En tales situaciones, el reloj a veces se hace más rápido, otras veces se vuelve más lento:
Durante estas pruebas he utilizado 16K CK/14CK + 4.1 ms para la puesta en marcha de retraso (pero el 65 ms retardo de no evitar los problemas).
Aquí está una foto ampliada, donde se puede ver claramente que la VCC alcanza un estado estable a 5 V en menos de 2 ms:
En la imagen de arriba, el mcu se inició correctamente.
Curiosamente, cuando no, la tensión llega a un establo 5 V incluso antes (parece que muchas partes de la mcu no poder, por lo que consume menos corriente durante el arranque)
Abajo es una imagen de un fallido inicio:
Por favor, tenga en cuenta que el software se pone en marcha después de más de 85 ms después de la tensión de alimentación se ha estabilizado, en lugar de la 10.5 ms requerido de otra manera. Los fusibles para el retraso de inicio de la misma, 16K CK/14CK + 4.1 ms.
Lo que también es interesante tener en cuenta, es que después de que el suministro se apaga, el VCC se estabiliza en alrededor de 1,1 a 1,2 Voltios (el viejo, ATmega328A variante bajó a alrededor de 0.6 - 0.7 V). Mantiene que durante varios minutos. Si tengo que esperar el tiempo suficiente (en el orden de la mitad de una hora o más), el mcu siempre se inicia correctamente! Así que parece que el problema es que hay 1.1 Voltios alrededor, que, según la hoja de datos, no se garantiza que sea suficiente para que un power-on reset. Pero debería ser suficiente para que un brown-out reset!
Excepto para estas situaciones, el brown-out detector funciona bien. Es visible en la primera imagen (la señal de salida se detiene cuando la bodlevel se ha alcanzado, y la caída de tensión se ralentiza, como partes de la mcu se cierran). Me hicieron pruebas cuando he reducido el VCC a ligeramente por debajo de la bodlevel y se deja subir de nuevo de nuevo, el mcu siempre se reinicia correctamente, bajo tales condiciones, con sólo el brown-out reset indicador se ilumine.
¿Me olvido de algo obvio, o no la ATmega328PB tener un grave error en sus brown-out detector?
EDITAR:
Curiosamente, estos problemas sólo surgen cuando se interrumpe el suministro antes de que el regulador. Si puedo interrumpir después de que el regulador (o el uso de un laboratorio de la fuente de alimentación), los problemas nunca llegan a suceder. Como si la forma de la creciente tensión causado los problemas. Sin embargo, como se puede ver en la última imagen, el aumento de tensión es bastante agradable y se estabiliza rápidamente.
EDIT 2
He probado con 16 MHz en lugar de los 20 MHz, pero los mismos problemas ocurren.