Cómo usar el temporizador de vigilancia en ATmega128

Estoy trabajando con un ATmega128 y necesito reiniciar el microcontrolador después de que hayan pasado unos 10 segundos y el usuario no haya interactuado con el microcontrolador. Como ejemplo, cuando el usuario no ha presionado ninguna tecla de un teclado durante 10 segundos, el controlador debería reiniciarse.

Hay un temporizador de vigilancia disponible en el ATmega128, pero puedo obtener un retraso máximo de 2 segundos antes de que se reinicie. Pero necesito 10 segundos.

¿Tal vez pueda hacerlo usando temporizadores pero no sé cómo proceder?

Incluso probé con el archivo de encabezado #include<avr/wdt.h> y lo usé como: wdt_enable(WDTO_8S); wdt_reset(); Pero no obtuve ninguna respuesta por parte de estas funciones. Estoy trabajando en Linux AVR-GCC.
¿Realmente necesita reiniciar el sistema o podría simplemente reiniciar el programa desde arriba?
Para los temporizadores, aquí hay un buen tutorial: avrfreaks.net/…
@JohnU: Gracias por su respuesta y, en realidad, en mi proyecto, le pido al usuario una contraseña, si ingresa una contraseña incorrecta, estará en ese ciclo solo hasta que proporcione la contraseña correcta. Entonces, lo que necesito es que si el usuario no dio ninguna entrada al controlador, debería comenzar desde la parte superior del programa.
Entonces, ¿por qué no simplemente escribir el programa para que haga eso?
@JohnU: Sí, usé la etiqueta y usé "ir a" esa etiqueta en particular. Pero lo que necesito es que cuando el usuario no ingrese nada, mi programa debe esperar entre 5 y 10 segundos y luego debe volver al principio del programa. Por favor, ayuda con el código de ejemplo si es posible.
Lo más fácil es usar un comando esperar ()... si no existe (casi todos los idiomas tienen uno) es fácil hacer uno haciendo algo como que simplemente for(i=99999;i>0;){i--;}cuenta hacia atrás desde un número grande. Esto generalmente se ve como una mala forma de agregar demoras, ya que evita que la CPU haga cualquier otra cosa, pero es la más básica.
@JohnU: Entendí tu punto, pero cuando agrego este retraso al programa principal, pero mientras espera este retraso, no puedo leer el teclado correctamente.
Otra idea: inicie un temporizador antes de aceptar entradas del usuario, restablezca ese temporizador cada vez que el usuario ingrese algo... Si el usuario está inactivo durante un tiempo determinado, el temporizador se desbordará... Establezca una marca en el temporizador y, si esa marca está configurada, salga de su bucle "Aceptar entrada"!
@sanju: lo que dijo Swanand es la idea correcta. Esto es bastante básico, y usar el perro guardián no es una buena manera de hacerlo. En nuestro sistema tenemos un temporizador de hardware de 1 KHz que se ejecuta en una rutina de interrupción, esto incrementa un valor de "ticks" como un reloj. En nuestro software principal, si queremos restablecer algo después de 10 segundos, recordamos el valor de "tick" ahora, y cuando hay 10,000 tics más , restablecemos el estado.
@Swanand: Sí, esa es una buena idea. Intentaré. Gracias por la idea.
@JohnU: Sí, intentaré lo mismo.

Respuestas (2)

En lugar de usar el temporizador Watchdog para este propósito,

Inicie un temporizador antes de aceptar entradas del usuario, restablezca ese temporizador cada vez que el usuario ingrese algo... Si el usuario está inactivo durante un tiempo determinado, el temporizador se desbordará... Establezca una marca en el temporizador y, si esa marca está configurada, salga de su "Aceptar". ¡Bucle de entrada!

También tenga en cuenta que diez segundos es mucho tiempo, y es posible que no sea posible estirar tanto el periférico del temporizador de hardware, o si puede bloquear un temporizador valioso y no permitir que se use para nada más. Hacer que el temporizador se interrumpa periódicamente, digamos 1 segundo o menos, y disminuir algún tipo de cuenta regresiva puede ser una forma más óptima de hacerlo.

Es posible lograr lo mismo. Utilice el perro guardián (es decir, interno o externo). Si es externo, debe verificar su hoja de datos y la respuesta de acuerdo con ella. El perro guardián interno debe configurarse durante 2 segundos y luego restablecerlo en bucle durante más de 1 segundo. es favorable utilizar un temporizador para el mismo propósito. Simplemente descanse el perro guardián después de cada segundo y reinicie el contador del perro guardián después de 5 veces.