¿Cuáles son algunas de las razones por las que mi atmega32u4 pierde el programa cuando se desconecta de la alimentación?

Tengo dos placas diferentes que ejecutan el mismo código con el mismo chip (ATMega32u4).

Resumen del problema

El problema es que la segunda placa parece perder el programa que se ha enviado al chip si pierde energía.

Ambas placas tienen conectores mini USB y obtienen energía de USB y ambas funcionan a 5v.

Primera Junta (de Trabajo)

La primera placa es una SparkFun Pro Micro "oficial".sparkfun pro micro

Segundo tablero (defectuoso)

El segundo tablero es una imitación de ese tablero que compré en Amazon. Puede ver los detalles de esa placa en: Placa de imitación Pro Micro en Amazon

NOTA : No espero que nadie examine perfectamente esos tableros y me diga el motivo exacto. Solo estoy agregando esa información en caso de que alguien note algo completamente diferente que indique el problema.

Programando las Tarjetas

Cuando programo las placas, configuro el Arduino IDE en la placa Pro Micro a 5v y 16Mhz y el programa funciona igual de bien en ambas placas. Luego ejecuto el tablero de imitación y funciona perfectamente. Es un pequeño programa que recibe datos de bluetooth y muestra los datos en otro lugar.

Pérdida de energía, pérdida de programa flasheado

En la primera placa, la programé una vez hace semanas y funciona después de estar apagada durante días. Obviamente, esa es la forma en que se supone que debe funcionar.

En la segunda placa, si pierde energía, parece perder el programa.

¿Cosas comunes para verificar?

Me pregunto si hay algunas cosas comunes que pueda verificar para determinar por qué el programa parece haberse perdido.

¿Hay cosas obvias que me estoy perdiendo? ¿Es posible que el fabricante no haya conectado algo correctamente que podría causar esto? Quiero decir, ¿es este un problema común con la fabricación de placas? Tengo 5 de estas placas de imitación y he probado dos hasta ahora y ambas parecen tener el problema.

Cualquier ayuda es muy apreciada.

Editar: información adicional

Encontré la siguiente información en una revisión en Amazon:

Al igual que algunos otros revisores, mi Pro Micro parecía estar perdiendo el boceto cuando se desconectó de la alimentación. Sin embargo, ahora me he dado cuenta de que Pro Micro en realidad no está perdiendo el boceto, hay un problema completamente diferente. Cuando el Pro Micro se vuelve a conectar a la alimentación, por alguna razón, el cargador de arranque no está ejecutando el boceto. Si luego realiza un reinicio suave conectando el pin RST a tierra, al reiniciar, el cargador de arranque comienza a ejecutar el boceto con éxito.

Entonces, el problema se puede solucionar conectando un botón al pin RST y presionando el botón cada vez que conecta el Pro Micro para que se reinicie y ejecute el boceto. Es molesto que el problema exista, pero al menos es viable.

  1. ¿Alguien puede explicar este fenómeno?
  2. ¿Podría haber otra solución que sea una solución automatizada, en lugar de presionar un botón cada vez?
Una pregunta como esta realmente debería ser respaldada por su software, o un caso de prueba mínimo que demuestre el problema, ya que es muy probable que el problema no sea la pérdida del programa per se, sino alguna condición que requiere el software. ¿Has probado a conectar y desconectar el USB, sin programar? ¿Ocurre el problema si enciende el ciclo inmediatamente después de la programación, o solo cuando lo deja reposar durante días?
Sus comentarios son definitivamente algo a considerar. Los probaré y volveré sobre lo que encuentre. Gracias.
@daylight, considere editar su título para que se ajuste mejor a la situación que realmente tiene.

Respuestas (4)

¿Alguien puede explicar este fenómeno?

Sí, el cargador de arranque instalado simplemente espera un nuevo boceto indefinidamente, sin agotar el tiempo y sin ingresar al existente después de un cierto período.

¿Podría haber otra solución que sea una solución automatizada, en lugar de presionar un botón cada vez?

Instale un nuevo gestor de arranque. Tengo un boceto descrito en mi página sobre la grabación de cargadores de arranque que instala el cargador de arranque Leonardo. Creo que el cargador de arranque Pro Micro es similar o idéntico (después de todo, es el mismo chip).

Solo necesita una segunda placa (su otro Micro serviría) para usar para la programación. El cableado para un Leonardo se describe en mi página; sin embargo, consulte a continuación para el Micro. El código está en los bocetos de Arduino en GitHub , en particular en el directorio "Atmega_Board_Programmer".

Debe conectar las dos placas de la siguiente manera:

SCK  <--> SCK  (pin labelled 15 on the Pro Micro board) *
MISO <--> MISO (pin labelled 14 on the Pro Micro board)
MOSI <--> MOSI (pin labelled 16 on the Pro Micro board)
VCC  <--> VCC
Gnd  <--> Gnd
D10  <--> Reset (pin labelled 10 on the programming board to Reset on the
                 board to be programmed)

* Por lo que puedo decir de su foto y el esquema

Placa Pro Micro

Posiblemente (probablemente) después de instalar el cargador de arranque, la placa se identificará en su PC como Leonardo y no como Micro, pero eso no importa ya que es el mismo chip subyacente.

Esta es una gran respuesta definitiva. También revisé su sitio y es muy agradable y útil. Creo que esta es la respuesta, pero aún no he podido conectar todo. Esta noche lo probaré y si flashear el nuevo cargador de arranque funciona, lo marcaré como la respuesta. Gracias
Ahora voy a marcar esto como la respuesta, porque tenías razón y necesitaba instalar un nuevo cargador de arranque en mis tableros de imitación. Esa era la respuesta que necesitaba para saber en qué dirección ir. Muchas gracias. Mi solución fue ligeramente diferente porque tengo un programador usbasp, por lo que agregaré una respuesta con esos detalles para cualquier otra persona que tenga este problema. Es genial tener un sitio fantástico como este para obtener instrucciones.

Bueno, las MCU atmega están basadas en flash, por lo que nunca deberían "perder el programa" sin un ciclo de borrado explícito. Sin embargo, es posible que algo esté impidiendo que el chip inicie su programa. ¿Ha intentado leer el programa almacenado en el chip después de apagar y encender la placa y compararlo con el original? Si coincide, esto descartará que el programa se 'pierda'. Eso deja un par de posibilidades. Uno es un problema con el circuito de reinicio que impide que el chip salga del reinicio hasta que se conecte el cable USB y se inicie el software de programación. Otro posible problema es que el chip tiene instalado un gestor de arranque defectuoso que no inicia automáticamente el código de usuario. Esa podría ser una solución bastante simple, simplemente actualice el cargador de arranque correcto usando un programador ISP u otra placa que Está configurado para actuar como un programador ISP. Otra posibilidad es que el chip en sí sea una imitación... en cuyo caso todas las apuestas están canceladas.

Estas son todas cosas buenas a considerar. Tomaré cada uno y los probaré. Ha proporcionado algunas cosas valiosas para pensar y probar. Realmente lo aprecio. Podría ser que el cargador de arranque no pudiera iniciar el programa después de que se haya quedado sin energía. Esa es buena. Gracias de nuevo.
Acabo de encontrar a otra persona que menciona haber perdido el boceto. Con la información que agregué al final de mi pregunta, ¿indica una respuesta más específica? Gracias.
¿Está activado el detector de caída de tensión en las puntas de los fusibles? Es posible que el chip no esté realizando el reinicio de encendido correctamente debido, por ejemplo, a un aumento lento de la fuente de alimentación. Habilitar el detector de caídas de voltaje con un umbral razonable puede corregir el problema al garantizar que el chip solo intente salir del reinicio una vez que el voltaje sea lo suficientemente alto.
Además, ¿ha intentado restablecer la placa para ver si eso hace que se inicie su programa? Si es así, entonces eso descarta la memoria del programa y el gestor de arranque como posibles causas.

Tengo un programador usbasp, así que después de leer la excelente respuesta de @nick-gammon y sonaba como si solo necesitara actualizar un nuevo gestor de arranque en mis placas de imitación, quería probarlo.

No sabía exactamente lo que tenía que hacer, así que decidí ir y hacerlo rápido.

Al principio, navegué por el excelente sitio web de @nick-gammon y encontré el gestor de arranque de leonardo, pero me di cuenta de que no era un archivo .hex directo, así que cuando lo probé y obtuve un error, pensé que no iba a funcionar. trabajo para mi configuración.

configuración de hardware

En primer lugar, tengo un conector de 10 pines en mi programador usbasp que se parece a lo siguiente:conector de 10 pines

Así es como se ve mi cableado de hardware en la placa de imitación. Es una imagen fea, pero al menos la he etiquetado.pro micro etiquetado

Un par de cosas a tener en cuenta son que @nick-gammon mencionó que D10 sería el reinicio, pero en mi caso no lo es. En cambio, puede ver que mi línea de reinicio estaba conectada al pin RST en el tablero que está justo encima del VCC. Y sí, los colores de los cables son extremadamente confusos para el VCC y el RST, pero las etiquetas son correctas.

Obtener el archivo hexadecimal del cargador de arranque Como mencioné en mi pregunta original, quería que estas placas de imitación funcionaran como mi SparkFun Pro Micro original (más cara). Revisé el sitio de sparkfun y me proporcionaron el cargador de arranque que usaron. Eso es muy bonito y tuve suerte de poder conseguirlo. Puede obtenerlo en: https://www.sparkfun.com/products/12640 y luego hacer clic en el enlace Arduino Addon Files . Obtendrá un archivo zip y luego puede descomprimirlo y buscar en la carpeta \sparkfun\avr\bootloaders\caterina\ y encontrará un archivo .hex llamado: caterina-promicro16.hex. Estaba suponiendo que este sería el archivo del gestor de arranque.

Parece que:archivos de chispa

Flashear el cargador de arranque usando AVRDude

Después de todo eso, fui a la línea de comando y encendí AVRDude. Le di el siguiente comando (asegurándome de tener el archivo caterina-promicro16.hex disponible en el mismo directorio, por supuesto).

avrdude -c usbasp -p m32u4 -U flash:w:Caterina-promicro16.hex

Si todo está cableado correctamente, verá lo siguiente cuando el cargador de arranque se muestre en su ATMega32u4.avrdude hace su trabajo

Cuando vi todo eso me emocioné! Pero, todavía no podía estar seguro de que esto iba a resolver mi problema. Para hacer eso, tuve que abrir Arduino IDE y flashear en mi programa original.

Seguí adelante e hice eso y probé el programa. Funcionó.

Desenchufe y vuelva a intentarlo

Después de eso, necesitaba desconectar la placa de imitación y ver si perdería el programa, o si simplemente lo cargaría como debería. Lo probé y funcionó muy bien, así que lo desconecté varias veces y funcionó siempre. Mi programa siempre se está ejecutando ahora como esperaba que fuera.

Además, compré 5 de estas placas de imitación y las estoy cargando, dos hechas hasta ahora y ambas funcionan fantásticamente.

Gracias por toda tu ayuda @nick-gammon.

Me alegro de que haya funcionado. Espero que esos cables estén soldados a los pines y no solo tocándolos. :) Nick Gammon mentioned that D10 would be the reset- no entendiste ese bit. D10 en el tablero de programación se conecta a Restablecer en el tablero de destino , por lo que al conducir D10 bajo, el programador reinicia el tablero de destino.
I found the leonardo bootloader, but I could tell it wasn't a straight up .hex file- los gestores de arranque están en la descarga IDE. Busque en la carpeta "cargadores de arranque". En la carpeta "caterina" hay un archivo Leonardo-prod-firmware-2012-12-10.hex, que es el archivo .hex del gestor de arranque de Leonardo. Para el Micro sería Micro-prod-firmware-2012-12-10.hex.
Tienes razón, estaba confundido con el reinicio de D10. Además, esos cables no estaban soldados. Tengo 5 de los tableros para cargar y como es algo de una sola vez, bueno... :) Gracias por explicar la otra parte con los archivos del cargador de arranque. De nuevo, gracias por todo. Sin su ayuda nunca hubiera podido llegar a una solución como esta. Estas imitaciones cuestan solo $ 4 y el Pro Micro original costaba $ 20. :)

Sí, noté un problema similar con mis antiguas placas AT89s52, algunas veces la placa de desarrollo actúa muerta y vuelve a funcionar después de un reinicio.

No estoy seguro, pero la fuente de alimentación puede contener picos de voltaje o algunos ruidos que pueden hacer que la MCU actúe como muerta. Esto puede suceder porque los capacitores no pueden filtrar esos picos al principio usando un adaptador bien regulado (adaptadores de alta calidad) que puede resolver el problema. y también use un poco de IPA y limpie toda la tabla.

Como otros amigos sugirieron, pruebe también con las cosas del gestor de arranque.