Watchdog sur arduino nano V3.1

Bonjour à tous et me revoilou avec un petit problème de watchdog sur ma nano v3.1.

Je souhaite implémenter un "reboot" de la nano en cas de plantage logiciel. En regardant un peu sur le net la façon de faire voici ce que j'ai codé:

void setup()
{
wdt_enable(WDTO_4S);            // Activation du Watchdog avec un timeout de 4s
}

void loop()
{
wdt_reset();

...
// le reste du code est peu important
}

Ensuite je fais rentrer la nano dans une boucle sans fin, au bout de 4 secondes, le watchdog reset la carte mais là elle part complètement en vrille. J'ai l'impression qu'elle boucle en permanence sur le reset.

J'ai vu sur quelques sites que certaines cartes ont des problèmes avec leurs bootloader et leur watchdog et notamment la nano.

Quelqu'un as t il des infos la dessus, faut il changer de bootloader et passer sur un optiboot qui semblerait corriger le problème.

Bon jamais encore fait le changement de bootloader, suis pas très chaud...

Merci pour vous réponses ++

Tiré de la datasheet :

Note: If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might lead to an eternal loop of time-out resets. To avoid this situation, the application software should always clear the Watchdog System Reset Flag (WDRF) and the WDE control bit in the initialisation routine, even if the Watchdog is not in use.

Apparemment sur l'optiboot la remise à zéro du flag n'est pas faite (donc depuis la UNO ça doit planter). Donc si t'as pas envie de te casser la tête, en flashant un "ancien" bootloader ça devrait fonctionner ;)

Tu dois retrouver la partie ligne 286 : https://code.google.com/p/arduino/source/browse/branches/arduino-0018/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c

Tu dois normalement pouvoir utiliser le bootloader pour 328 ici : https://code.google.com/p/arduino/source/browse/branches/arduino-0018/hardware/arduino/bootloaders/atmega/

Bonjour B@tto et merci pour les infos :)

Je me suis finalement lancé dans le burn d'un nouveau bootloader pour la nano avec une deuxième arduino transformée pour l'occasion en ISP. J'ai pris le dernier Optiboot 5.0a -> envoyé dans la petite nano et du coup le watchdog fonctionne à merveille.

Bon ce fut une bonne journée, meme si elle était un peu pluvieuse dans le sud mais j'ai réglé mes deux problèmes (RS232/MAX232 et Watchdog) et je renouvelle mes remerciements à Barbudor et B@tto

++ Oldchap

C'est la tempo au boot qui pose problème. Si je ne me trompe pas, l'optiboot démarre plus vite et donc cela permet d’acquitter le watchdog avant qu'il ne claque.

Bonjour,

J'ai effectivement lu quelque part que le bootloader optiBoot était beaucoup plus rapide que le bootloader standard. En tout cas le watchdog fonctionne à merveille.

++ Oldchap

Oué enfin ce qui prend du temps c'est surtout l'attente d'une programmation série, par le chargement du bootloader en lui même. C'est d'ailleurs très simplement configurable, y'a juste un #define à modifier c'est expliqué en tête de programme.

Le seul vrai avantage de l'optiboot c'est sa taille, mais qui se fait au prix de l'éviction de certaines fonctionnalités.

Bonjour,

Je reprends ce topic, même s'il date un peu, car j'ai exactement le même problème : depuis que j'ai essayé de mettre en oeuvre le watchdog sur une nano, elle fait n'importe quoi !

oldchap: Je me suis finalement lancé dans le burn d'un nouveau bootloader pour la nano avec une deuxième arduino transformée pour l'occasion en ISP. J'ai pris le dernier Optiboot 5.0a -> envoyé dans la petite nano et du coup le watchdog fonctionne à merveille.

As-tu utilisé un tuto particulier pour faire ta manip ? J'ai trouvé celui-ci, http://jlectronique.org/ArduinoISP.htm, mais je ne suis pas sûr que ce soit la bonne démarche. D'autant plus que Je ne comprends pas comment charger Optiboot 5.0a (je ne vois pas de .ino ou .pde).

Bonjour,

Je me réponds, mais surtout je donne l’info à tous ceux qui tombent sur le même problème.
J’ai réussi à régler mon problème en cherchant et en compilant les infos trouvées sur différents sites anglophones.

Ci-joint un petit mémo sur le sujet.

Charger un bootloader dans une Nano en utilisant une Uno comme programmateur.pdf (41 KB)

Brisebee: Bonjour,

Je me réponds, mais surtout je donne l'info à tous ceux qui tombent sur le même problème. J'ai réussi à régler mon problème en cherchant et en compilant les infos trouvées sur différents sites anglophones.

Ci-joint un petit mémo sur le sujet.

Bonjour

Ou qui tomberont 8)

excellente initiative à archiver :grin:

pour relancer une question encore sans reponse(s) sur de l'arduino basique y a t'il un "moyen" de connaitre la version du bootloader (ou comparer avec une image HEX ? est il possible de simplement recupérer le "HEX" chargé ?

de mes passages par pic , cette possibilié recup de hex etait gerée par fusibles il en est quoi avec un 328P déjà bootloadé ?

Bonjour,

Dans le source du bootloader atmega. Il y a ça:

    /* AVR ISP/STK500 board requests */
    else if(ch=='A') {
        ch2 = getch();
        if(ch2==0x80) byte_response(HW_VER);        // Hardware version
        else if(ch2==0x81) byte_response(SW_MAJOR); // Software major version
        else if(ch2==0x82) byte_response(SW_MINOR); // Software minor version
        else if(ch2==0x98) byte_response(0x03);     // Unknown but seems to be required by avr studio 3.56
        else byte_response(0x00);               // Covers various unnecessary responses we don't care about
    }

Dans le source d'optiboot, il y a ça:

    if(ch == STK_GET_PARAMETER) {
      unsigned char which = getch();
      verifySpace();
      if (which == 0x82) {
    /*
     * Send optiboot version as "minor SW version"
     */
    putch(OPTIBOOT_MINVER);
      } else if (which == 0x81) {
      putch(OPTIBOOT_MAJVER);
      } else {
    /*
     * GET PARAMETER returns a generic 0x03 reply for
         * other parameters - enough to keep Avrdude happy
     */
    putch(0x03);
      }
    }

Donc manifestement si on envoie A par la ligne série au démarrage suivi de 0x81 ou 0x82 on reçoit les versions majeurs et mineurs

Un sketch pour connaître la version du bootloader: https://gist.github.com/jcw/1985789

NOTA: Voir le commentaire en dessous du sketch sur Gist. Ça peut être nécessaire de changer la vitesse à 9600.