Je pense que vous devriez choisir l'autre réponse car l'Arduino a le chien de garde intégré.
Matt Williamson
Réponses:
7
Il existe un certain nombre de puces de surveillance matérielles dédiées disponibles, mais c'est assez facile à faire en utilisant un circuit intégré de minuterie 555 régulier et quelques pièces de support. Avec le 555 configuré en mode astable avec une très longue période "HIGH" et une période relativement courte (peut-être 0,3 seconde) "LOW", la sortie peut être connectée à la broche de réinitialisation de l'Arduino via une diode pour faire du chien de garde un collecteur ouvert dispositif. L'Arduino peut ensuite réinitialiser périodiquement le chien de garde à l'aide d'une sortie numérique pour activer un transistor qui décharge le condensateur de synchronisation attaché au 555, l'empêchant d'atteindre un point de déclenchement qui le fera réinitialiser l'Arduino.
phooky est tout à fait correct, mais le WDT interne a des limites: il ne peut pas fonctionner pendant plus de 6 secondes environ (dépend du modèle de CPU) et il n'y a aucun moyen de faire un "redémarrage" pur uniquement à partir du logiciel. Vous pouvez dire au CPU de passer à la position 0 et de redémarrer le chargeur de démarrage, mais vous risquez de vous retrouver avec des trucs douteux dans la RAM et des choses comme des indicateurs d'interruption toujours définis dans le CPU. L'affirmation de RESET dans le matériel garantit que l'Arduino fournira un environnement propre.
jonoxer
2
laissant le temps à WDT va provoquer une « remise à zéro propre » que tous les registres seront garantis pour démarrer dans un état défini. La réaliser dans le logiciel est aussi simple que de désactiver les interruptions et de boucler sans fin.
Nick T
14
Il y a déjà une minuterie de surveillance intégrée à la puce atmega; vous pouvez utiliser avr/wdt.hpour le manipuler.
Un exemple rapide:
#include<avr/wdt.h>void setup(){
wdt_enable(WDTO_500MS);// have the wdt reset the chip// if 500ms passes without a reset}void loop(){
wdt_reset();// reset the wdt}
J'ai entendu parler de certains problèmes signalés avec le WDT et le chargeur de démarrage normal, vous pouvez donc essayer un autre chargeur de démarrage avec lui, par exemple Adaboot.
Réponses:
Il existe un certain nombre de puces de surveillance matérielles dédiées disponibles, mais c'est assez facile à faire en utilisant un circuit intégré de minuterie 555 régulier et quelques pièces de support. Avec le 555 configuré en mode astable avec une très longue période "HIGH" et une période relativement courte (peut-être 0,3 seconde) "LOW", la sortie peut être connectée à la broche de réinitialisation de l'Arduino via une diode pour faire du chien de garde un collecteur ouvert dispositif. L'Arduino peut ensuite réinitialiser périodiquement le chien de garde à l'aide d'une sortie numérique pour activer un transistor qui décharge le condensateur de synchronisation attaché au 555, l'empêchant d'atteindre un point de déclenchement qui le fera réinitialiser l'Arduino.
Quelques informations de base sur un projet à cet effet sont disponibles sur http://www.practicalarduino.com/news/id/471
la source
Il y a déjà une minuterie de surveillance intégrée à la puce atmega; vous pouvez utiliser
avr/wdt.h
pour le manipuler.Un exemple rapide:
la source
J'ai entendu parler de certains problèmes signalés avec le WDT et le chargeur de démarrage normal, vous pouvez donc essayer un autre chargeur de démarrage avec lui, par exemple Adaboot.
En outre, vous pouvez faire beaucoup plus de choses avec le WDT en plus d'une simple réinitialisation. Je recommande http://www.atmel.com/dyn/resources/prod_documents/doc2551.pdf
la source