J'essaie de comprendre la minuterie du chien de garde de la série ATTinyX5. Donc, les choses que j'ai lues donnaient l'impression que vous pouviez l'utiliser pour que le programme fasse quelque chose de spécifique jamais N secondes mais n'a jamais vraiment montré comment. D'autres ont fait croire qu'il ne ferait que réinitialiser la puce à moins que quelque chose dans le code réinitialise son compte entre-temps (ce qui semble être l'utilisation "normale").
Existe-t-il un moyen d'utiliser le WDT comme vous le feriez pour TIMER1_COMPA_vect ou similaire. J'ai remarqué qu'il a un mode de temporisation de 1 seconde et j'aimerais vraiment pouvoir l'utiliser pour que quelque chose se produise toutes les 1 seconde dans mon code (et de préférence dormir entre les deux).
Pensées?
* Mise à jour: * Depuis qu'on lui a demandé, je fais référence à la section 8.4 de la fiche technique ATTinyX5 . Non pas que je le comprenne bien, c'est mon problème ...
Réponses:
Vous le pouvez très certainement. Selon la fiche technique, le temporisateur de surveillance peut être configuré pour réinitialiser le MCU ou provoquer une interruption lors de son déclenchement. Il semble que vous soyez plus intéressé par la possibilité d'interruption.
Le WDT est en fait plus facile à configurer qu'un minuteur normal pour la même raison qu'il est moins utile: moins d'options. Il fonctionne sur une horloge de 128 kHz calibrée en interne, ce qui signifie que sa synchronisation n'est pas affectée par la vitesse d'horloge principale du MCU. Il peut également continuer à fonctionner pendant les modes de sommeil les plus profonds pour fournir une source de réveil.
Je vais passer en revue quelques exemples de fiches techniques ainsi que du code que j'ai utilisé (en C).
Fichiers et définitions inclus
Pour commencer, vous souhaiterez probablement inclure les deux fichiers d'en-tête suivants pour que les choses fonctionnent:
En outre, j'utilise la macro <_BV (BIT)> qui est définie dans l'un des en-têtes AVR standard comme suit (qui pourrait être plus familiale pour vous):
Début du code
Lorsque le MCU est démarré pour la première fois, vous initialisez généralement les E / S, configurez des temporisateurs, etc. une boucle instable.
Configuration WDT
Ensuite, après avoir configuré le reste de la puce, refaites le WDT. La configuration du WDT nécessite une "séquence chronométrée", mais c'est vraiment facile à faire ...
Bien sûr, vos interruptions doivent être désactivées pendant ce code. Assurez-vous de les réactiver par la suite!
Routine de service d'interruption WDT La prochaine chose dont vous devez vous soucier est la manipulation de l'ISR WDT. Cela se fait comme tel:
Veille MCU
Plutôt que de mettre le MCU en veille à l'intérieur du WDT ISR, je recommande simplement d'activer le mode veille à la fin de l'ISR, puis de laisser le programme MAIN mettre le MCU en veille. De cette façon, le programme quitte réellement l'ISR avant de s'endormir, et il se réveillera et retournera directement dans l'ISR WDT.
la source
Selon la fiche technique, c'est possible. Vous pouvez même activer les deux, une interruption et la réinitialisation. Si les deux sont activés, le premier délai d'attente du chien de garde déclenchera l'interruption, ce qui provoquera la désactivation du bit d'activation d'interruption (interruption désactivée). Le prochain timeout réinitialisera alors votre CPU. Si vous activez l'interruption directement après son exécution, le prochain délai d'attente ne déclenchera (à nouveau) qu'une interruption.
Vous pouvez également simplement activer l'interruption et ne pas activer la réinitialisation du tout. Vous devrez régler le bit WDIE à chaque fois que l'interruption s'est déclenchée.
la source
C'est beaucoup plus facile que suggéré ci-dessus et ailleurs.
Tant que le
WDTON
fusible n'est pas programmé (il n'est pas programmé par défaut), alors il vous suffit de ...Voici un exemple de code qui exécutera un ISR une fois toutes les 16 ms ...
C'est vraiment ça. Étant donné que nous n'activons jamais la réinitialisation du chien de garde, nous n'avons jamais à jouer avec les séquences chronométrées pour la désactiver. L'indicateur d'interruption du chien de garde est automatiquement effacé lorsque l'ISR est appelé.
Si vous souhaitez une période différente de chaque 1 seconde, vous pouvez utiliser ces valeurs ici pour définir les bits appropriés dans
WDTCR
...Notez que vous devez exécuter la séquence chronométrée pour modifier le délai d'expiration. Voici le code qui définit le délai d'attente à 1 seconde ...
la source