AVR desprogramándose a sí mismo

8

¿Alguien más ha tenido casos en los que un AVR dejó de funcionar misteriosamente después de varios meses, pero la reprogramación lo devolvería?

Estoy ejecutando un montón de atmega328 en la red de sensores inalámbricos. Ahora he tenido 3 veces (en aproximadamente un año) cuando uno de ellos acaba de dejar de trabajar. Volveré a grabar el programa y volverá a funcionar. No siempre es la misma unidad, por lo que no parece que sea un chip defectuoso.

Parece que sería una cosa bastante desastrosa que evitaría que las personas utilicen AVR, por lo que obviamente hay algo sobre mis circunstancias particulares. Me preguntaba si alguien más se ha topado con él y podría tener algunos consejos.

Estoy funcionando a 3,3 V de las baterías, por lo que el voltaje bajará demasiado para funcionar una vez cada dos meses y tengo que reemplazar los recargables. Los módulos utilizan el modo de suspensión y el temporizador de vigilancia para dormir durante 60 segundos, realizar una lectura, enviarlo por radio a la estación base y luego volver a dormir. Los módulos son compatibles con arduino, así que no he volteado el bit "No me dejes volver a grabar este".

    
pregunta edebill

4 respuestas

6

¿Estás usando BOD? Ocasionalmente, pueden suceder cosas desagradables si un chip se desvanece.

    
respondido por el Leon Heller
6

Probablemente la Detección de salida marrón es la forma correcta de hacerlo, pero ...

Tuve un problema solo software que causó síntomas muy similares, aunque mucho más rápido. Creo que algunos errores en C ++ (¿compilación?) Provocaron daños en la pila y la función se devolvió fuera del programa real, ejecutando instrucciones aleatorias. No estoy seguro de lo que ocurrió a continuación, pero la única forma de solucionarlo fue volver a grabar el programa (al parecer, algunas de esas instrucciones aleatorias incluían la escritura en la memoria del programa).

El error fue solo un destructor que fue llamado en el momento equivocado. Hacer la variable global (por lo que nunca fue destruida) solucionó el problema. El problema era muy fácilmente reproducible (tardó aproximadamente un minuto en activarse) y con una potencia muy estable. La configuración particular fue Arduino + WaveShield usando la biblioteca WaveHC, pero creo que esto podría suceder a cualquiera que use C ++.

Si prefieres los idiomas de bajo nivel, accidentalmente hice casi lo mismo en el ensamblaje, pero milagrosamente esto nunca causó más que problemas de tiempo esporádicos: la mayoría de las instrucciones tienen una longitud de 2 bytes, pero algunas son más largas, y calculé la distancia de salto Yo mismo y salté en medio de una instrucción de 4 bytes. Se volvió a alinear con bastante rapidez, pero no es difícil imaginar algo como esto en una ruta de código que rara vez se usa y que causa locura.

    
respondido por el Jack Schmidt
3

También he visto que los capacitores de desacoplamiento Vcc insuficientes / mal colocados / faltantes causan efectos similares. ¿Tiene desacoplamiento local lo más cerca posible del IC? (Se prefiere el tipo cerámico 100nF - 1uF)

    
respondido por el Adam Lawrence
2

Otro factor que puede hacer que los dispositivos pierdan su memoria son las descargas electrostáticas (ESD).

La colocación de algunos varistores en todos los conectores externos que están sujetos a exposición puede aliviar este problema. Lo he visto antes en algunos productos comerciales basados en microcontroladores PIC de Microchip, por lo que no es extraño.

Hay algunos varistores útiles que también funcionan como condensadores de filtro (en el orden de 10-150 pF). Consulte estos enlace

Son pequeños, baratos y protegerán su dispositivo. Colóquelos lo más cerca posible de los conectores que traen señales externas a la placa, y dirija todos los rastros inmediatamente lejos de las patas del conector.

    
respondido por el smashtastic

Lea otras preguntas en las etiquetas