Estoy tratando de entender el temporizador de vigilancia de la serie ATTinyX5. Entonces, las cosas que he leído parecían que podría usarlo para hacer que el programa haga algo específico cada N segundos, pero en realidad nunca mostró cómo. Otros hicieron que pareciera que solo restablecería el chip a menos que algo en el restablecimiento del código se cuente mientras tanto (que parece ser el uso "normal").
¿Hay alguna forma de usar el WDT como lo haría con TIMER1_COMPA_vect o similar? Me di cuenta de que tiene un modo de tiempo de espera de 1 segundo y realmente me encantaría poder usarlo para hacer que algo suceda cada 1 segundo en mi código (y preferiblemente dormir entre ellos).
Pensamientos?
* Actualización: * Como se le preguntó, a lo que me refiero es a la sección 8.4 de la hoja de datos ATTinyX5 . No es que lo entienda completamente, que es mi problema ...
Respuestas:
Ciertamente puedes. Según la hoja de datos, el temporizador de vigilancia se puede configurar para restablecer la MCU o causar una interrupción cuando se dispara. Parece que estás más interesado en la posibilidad de interrupción.
El WDT es realmente más fácil de configurar que un temporizador normal por la misma razón por la que es menos útil: menos opciones. Funciona con un reloj de 128 kHz calibrado internamente, lo que significa que su sincronización no se ve afectada por la velocidad del reloj principal de la MCU. También puede continuar ejecutándose durante los modos de reposo más profundos para proporcionar una fuente de activación.
Revisaré un par de ejemplos de hojas de datos, así como algunos códigos que he usado (en C).
Archivos incluidos y definiciones
Para comenzar, es probable que desee incluir los siguientes dos archivos de encabezado para que las cosas funcionen:
Además, uso la Macro <_BV (BIT)> que se define en uno de los encabezados AVR estándar como la siguiente (que podría ser más familiar para usted):
Comienzo del Código
Cuando se inicia MCU por primera vez, normalmente inicializaría la E / S, configuraría temporizadores, etc. En algún lugar aquí es un buen momento para asegurarse de que el WDT no provocó un reinicio porque podría hacerlo nuevamente, manteniendo su programa en Un bucle inestable.
Configuración WDT
Luego, después de haber configurado el resto del chip, vuelva a hacer el WDT. Configurar el WDT requiere una "secuencia cronometrada", pero es realmente fácil de hacer ...
Por supuesto, sus interrupciones deben deshabilitarse durante este código. ¡Asegúrese de volver a habilitarlos después!
Rutina de servicio de interrupción de WDT Lo siguiente de qué preocuparse es manejar el WDT ISR. Esto se hace como tal:
MCU Sleep
En lugar de poner la MCU en suspensión dentro del WDT ISR, recomiendo simplemente habilitar el modo de suspensión al final de la ISR, luego hacer que el programa PRINCIPAL ponga la MCU en suspensión. De esa manera, el programa en realidad está dejando el ISR antes de que se vaya a dormir, y se despertará y volverá directamente al WDT ISR.
fuente
Según la hoja de datos es posible. Incluso puede habilitar ambos, una interrupción y el reinicio. Si ambos están habilitados, el primer tiempo de espera de vigilancia activará la interrupción, lo que ocasionará que el bit de interrupción habilitada se desactive (interrupción deshabilitada). El siguiente tiempo de espera restablecerá su CPU. Si habilita la interrupción directamente después de que se ejecutó, el siguiente tiempo de espera (nuevamente) activará solo una interrupción.
También puede habilitar la interrupción y no habilitar el reinicio en absoluto. Deberá establecer el bit WDIE cada vez que se active la interrupción.
fuente
Esto es mucho más fácil que lo sugerido anteriormente y en otros lugares.
Mientras el
WDTON
fusible no esté programado (no está programado por defecto), solo necesita ...Aquí hay un ejemplo de código que ejecutará un ISR una vez cada 16 ms ...
Eso es realmente Como nunca habilitamos el reinicio de watchdog, nunca tenemos que perder el tiempo con las secuencias temporizadas para deshabilitarlo. El indicador de interrupción de vigilancia se borra automáticamente cuando se llama al ISR.
Si desea un período diferente de cada 1 segundo, puede usar estos valores aquí para establecer los bits apropiados en
WDTCR
...Tenga en cuenta que debe ejecutar la secuencia cronometrada para cambiar el tiempo de espera. Aquí hay un código que establece el tiempo de espera en 1 segundo ...
fuente