El programa AVR no se inicia a veces

0

He escrito un pequeño firmware de vigilancia que se ejecuta en un ATtiny85. La idea del firmware es:

  1. espere 10 segundos después del encendido e ignore la señalización durante ese tiempo
  2. después de eso, se espera que la señal se reduzca con una frecuencia no inferior a una vez cada 100 ms y no menos frecuente que una vez cada 65 segundos, y al fallar una de las expectativas, establece una señal de reinicio para 10us, y luego se reinicia en el paso ( 1).

Obviamente (y posiblemente de forma gratuita) programé esto en Arduino utilizando la ATtiny board description , que asigna los pines como:

LaconfiguracióndemisfusiblesseprogramadelasiguientemaneraatravésdeAVRDude:

avrdude-pt85-cdragon_isp-Pusb-u-Uefuse:w:0xff:mavrdude-pt85-cdragon_isp-Pusb-u-Uhfuse:w:0xdf:mavrdude-pt85-cdragon_isp-Pusb-u-Ulfuse:w:0xe2:m

Estasconfiguracionescorrespondena:

  • OsciladorRCinternoa8MHz,6CK/14CK+64ms
  • SalidaderelojenPORTB4deshabilitado
  • Nodividirelrelojpor8internamente
  • Deteccióndeexclusióndedatosdesactivada
  • NoconservarlamemoriaEEPROMatravésdelciclodeborradodechip
  • EltemporizadordevigilanciaNOsiempreestáencendido
  • Descargadeprogramasenserie(SPI)habilitada
  • DebugWiredeshabilitado
  • Restablecimientohabilitado
  • Autoprogramacióndeshabilitada.

Alosfinesdeladepuración,generaunaondacuadradadelciclodetrabajodel50%delanchodepulsode100msduranteeseperíodoinicialde10segundos,yunciclodetrabajodel50%delanchodelpulsode200msdespuésdelperíodoinicialde10segundos.

Paraunabuenamedida,aquíestáelfragmentodeesquemaqueacompañaaesto:

La gran mayoría de las veces, la señal de depuración se comporta como se describe. Sin embargo, en muy raras ocasiones, he observado una señal baja plana en la salida de depuración, sin onda cuadrada. He examinado las líneas de alimentación y reinicio del ATtiny85 en un alcance en esta condición, y no parece haber ninguna indicación de que se produzca una condición de reinicio bloqueado o apagado.

¿Cómo demonios, entonces, mi programa no puede iniciarse? ¿Podría ser porque la detección de apagón está deshabilitada? ¿Debo configurar el temporizador de vigilancia siempre en el fusible? Realmente me gustaría entender cómo esto podría suceder ocasionalmente.

    
pregunta vicatcu

1 respuesta

1

Sugiero usar un chip de reinicio adecuado y habilitar el temporizador interno de vigilancia (así como escribir su programa para usarlo correctamente).

Si desea un cinturón y tirantes, use un WDT externo o incluso un WDT con ventana. Si no le importa mucho, considere el BOR interno si la hoja de datos garantiza que funcionará (sobrecalentamiento) con su combinación de frecuencia de reloj y voltaje de la fuente de alimentación.

Hay muchas formas de colgar un microcontrolador, así que no los use para aplicaciones críticas para la seguridad sin un diseño y precauciones cuidadosas. Por ejemplo, simplemente aumentar la potencia lentamente o permitir que se sumerja brevemente a menudo puede hacer el truco.

Se ha planteado la pregunta sobre qué debe hacer exactamente como un chip de supervisión como ADM805 o el circuito interno equivalente:

Para asegurarse de que el micro se inicie y haga lo que se supone que debe hacer, desea que se inicie en un estado conocido. Debe comenzar a ejecutar el código desde la ubicación de memoria apropiada, y la CPU debe hacer las cosas correctas con el contador del programa para mantenerlo en el código como está escrito. Ninguna de estas cosas está asegurada sin una señal de restablecimiento limpia. Desea que la reinicialización (generalmente es baja para los micros modernos) se afirme a partir de un voltaje de alimentación muy bajo, tan bajo que el micro no puede hacer ningún daño si hay actuadores o cualquier otro elemento adjunto, o memoria no volátil que podría estar dañado, hasta que esté dentro del rango de suministro adecuado. El restablecimiento debe realizarse después de que la tensión de alimentación sea válida durante algún tiempo, generalmente decenas o cientos de milisegundos, por ejemplo, si hay un oscilador de cristal que desea que se estabilice. Si la tensión de alimentación desciende, el restablecimiento debe reafirmarse durante algún tiempo. Cuando la tensión de suministro está disminuyendo cuando el dispositivo está apagado, debe mantener el micro en reinicio hasta que la tensión de suministro caiga tan bajo que no pueda causar ningún problema.

La forma descuidada de hacerlo es con un circuito RC o un circuito de diodo RC + en un pin de reinicio, porque solo funciona parte del tiempo. Lo ideal es que tenga un restablecimiento de la salida de corriente y un circuito de temporizador que sea hardware. Se debe garantizar que el BOR se apague para el suministro en buen estado (temperatura y tolerancias) y debe garantizarse para restablecer la tensión de suministro demasiado baja (pero aún dentro del rango aceptable para la operación) hasta un voltaje bajo (típicamente < 1V). Algunos circuitos BOR internos cumplen con esa especificación para la mayoría de las condiciones de operación normales y otros no.

No se puede enfatizar demasiado que es una función de hardware y no se puede sustituir con firmware. El BOR y el temporizador deben combinarse con el diseño de la fuente de alimentación que cumpla con los requisitos y no pueda fallar durante un tiempo demasiado breve para activar el BOR.

Incluso si se garantiza absolutamente el reinicio, las cosas pueden salir mal en la operación, por ejemplo, debido a una energía no anticipada de impulso EMI, un error suave en la CPU debido a la radiación, etc. Para mitigar las consecuencias de tal ocurrencia, muchos micros detectan direcciones de memoria de programa no válidas, errores de puntero de pila y pueden realizar cálculos de suma de comprobación en su propia memoria de programa. En combinación con las técnicas de programación, la probabilidad y las consecuencias del fallo pueden reducirse a números aceptables para los sistemas críticos para la seguridad.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas