11 votos

¿Qué podría evitar el inicio de un microcontrolador?

Descripción del problema

Tengo problemas ocasionales de arranque en algunas placas con un ATmega2561. En aproximadamente el 10% (parece fluctuar mucho) el procesador no parece arrancar en el primer encendido. Solo un ciclo de encendido permite que el MCU arranque.

He investigado en línea y probado diferentes cosas. Hice varias hipótesis y las probé, pero no he podido desacreditar ninguna de ellas.

He revisado la hoja de datos varias veces pero no pude encontrar ninguna pista sobre lo que podría estar haciendo mal.

Reproducción

El problema se manifiesta de la siguiente manera:

  1. Enciende la energía
  2. El software no arranca (no hay comunicación en UART, no hay parpadeo de LED, ambos deberían ocurrir cuando el software se ejecuta.)
  3. Apaga la energía y espera 10 segundos
  4. Vuelve a encenderla
  5. El microcontrolador arranca

Si apago la energía por >3 minutos, el problema vuelve a aparecer. Si una placa tiene el problema, es perfectamente reproducible. Reemplazar el microcontrolador resuelve el problema.

También he revisado la energía. El microcontrolador funciona a 5V. Los 5V se encienden en unos pocos microsegundos y son sólidamente estables (verificado con un osciloscopio y multímetro en configuración Min / Max.)

Además: Puedo programar el microcontrolador a través de ISP si está en ese estado colgado.

Hipótesis

Hipótesis 1

El resonador cerámico externo no arranca debido a una configuración incorrecta de los fusibles

Pude desacreditar eso midiendo la frecuencia con un osciloscopio y configurando el microcontrolador para usar el oscilador interno R/C (que debería arrancar.)

Hipótesis 2

Algo con el circuito de reset externo

El Reset/ es alto y estable 200ms después del encendido (ese es el tiempo en que el reset externo se pone en bajo).

Hipótesis 3

El MCU está en un estado indefinido por alguna razón desconocida después del arranque

Poner el reset en bajo durante cualquier cantidad de tiempo no hizo que el microcontrolador se iniciara.

Parece que se me han acabado las ideas. Además: Esta placa tiene un cargador de arranque que uso para cargar una aplicación. Si hay una aplicación válida, el cargador de arranque inicia de inmediato la aplicación en su primera línea de código. El problema existe independientemente del estado. No inicia en el cargador de arranque ni en la aplicación. Si no es un problema de hardware, debe ser de software, pero lo único común entre la aplicación y el cargador de arranque es básicamente una línea de código C (que llama a algunas funciones para leer de la EEPROM y FLASH para verificar si hay una aplicación válida instalada.)

¿Alguien tiene alguna idea de cómo abordar este problema? ¿Podría ser un problema de software? ¿Por qué no sucede en todos los microcontroladores?

Actualización:

Como se sugirió en los comentarios, he medido AVcc en relación con Vcc durante el encendido.

CH1: Vcc, CH2: Aref

El Canal 1 (amarillo) es Vcc, el Canal 2 (cian) es Aref

Eso parece ser el problema. Aref (y también AVcc) está aumentando mucho más rápido que Vcc.

¡RESUELTO! (al menos así parece)

Agregar una resistencia frente al LM7805 que crea el Aref y AVcc para limitar la corriente (y por lo tanto cargar los condensadores más lentamente) hizo que el AVcc se encendiera después de Vcc y ahora una placa que tenía el problema arranca normalmente.

(CH 1 = AVcc, CH2 = Aref

AVcc (amarillo) y Aref (cian)

13voto

Justme Puntos 201

Cómo alimentas la MCU puede ser la fuente de problemas.

Aplicar voltajes a los pines de entrada/salida y al pin AREF antes de que se apliquen las fuentes principales digitales VCC y analógicas AVCC significa que los diodos de protección de los pines de entrada/salida a las fuentes tienen que conducir corriente de pinzamiento de entrada a los pines de suministro, lo que pone estrés adicional a las estructuras internas de la MCU y podría elevar los voltajes de suministro y encender la MCU con voltajes más bajos de lo esperado. La MCU podría terminar en algún estado interno inesperado donde no funcione correctamente incluso después de un pulso de reinicio. Uno de esos problemas podría ser una condición de bloqueo, que solo se resuelve retirando la alimentación del circuito.

La pregunta actualizada muestra que AVCC y VCC tienen alrededor de 1V de diferencia entre ellos durante el tiempo de subida de suministro, por lo que su diferencia excede los límites seguros de 300mV.

9voto

Neil Foley Puntos 1313

Los sospechosos habituales aquí serían:

  • Una fuente de alimentación de mala calidad con transitorios, etc.
  • Capacitores incorrectos en los pines de reinicio o de alimentación.
  • Los pines de suministro de MCU se alimentan en momentos diferentes. Por ejemplo, si tiene un LDO de alta precisión relativamente rápido como Vref a un ADC, pero alimenta todo el MCU desde un regulador de interruptor relativamente lento. Esto provocará un bloqueo o la detección de baja tensión.
  • Mala soldadura de MCU o de un cuarzo externo/resonador externo. O en caso de que se utilicen filtros PLL externos para el reloj del sistema, problemas con elecciones incorrectas de valores de componentes.
  • Configuraciones incorrectas de otros pines vitales como pines de selección de modo/pines de modo de prueba, donde te desvías de las recomendaciones del fabricante por cualquier motivo.
  • CRT (tiempo de ejecución de lenguaje C) escrito por charlatanes. En muchos casos, el CRT entregado con la cadena de herramientas está roto y no maneja cosas fundamentales como configurar el perro guardián y LVD o configurar relojes externos antes de ejecutar todo el código de inicialización. Así que en caso de que sigas agregando variables al programa, el CRT eventualmente enloquecerá durante el inicio, o quizás nunca terminará antes de que se agote el tiempo de espera del perro guardián, ya que fue diseñado por personas incompetentes. Aproximadamente el 90% de todos los CRT en el mercado tienen problemas de diseño como estos, o al menos todavía no he visto uno correcto.

1voto

user332493 Puntos 11

También me enfrenté al mismo problema, es decir, que el MCU no arrancaba a pesar de que no había ningún problema con Vcc = 5 V.

Después de leer todos los comentarios anteriores, finalmente, se solucionó mi problema. Lo que hice fue añadir un condensador de 10 F lo más cerca posible del pin Vcc del MCU. Eso es todo. Mi MCU empezó a funcionar.

0voto

Toor Puntos 777

¿Cómo estás identificando que "no se está iniciando"? ¿Qué más hay en la placa con los MCUs? ¿Hay algo que podría detener el MCU si se está encendiendo demasiado lento? ¿Quizás otro IC al que el MCU espera que responda a un mensaje serial?

Porque si es así, lo más probable es que sea un problema de software.

Ningún par de componentes es igual. No hay razón para esperar que dos MCUs tarden exactamente el mismo tiempo en encenderse y comenzar a ejecutar código, al igual que no hay razón para esperar que otros componentes tarden el mismo tiempo en encenderse.

Lo único que debe suceder es que un MCU que se inicie un poco más rápido se empareje con componentes auxiliares que se inicien un poco más lentamente.

Haz que tu código del MCU espere un poco después de encenderse antes de empezar a hacer cualquier cosa.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X