[Résolu] Reset Watchdog sur MEGA 2560

Bonjour,

sur mon UNO pour faire un reset à distance j'utilisait le watchdog avec :

#include <avr/wdt.h>

void redemarre_arduino(){
  wdt_enable(WDTO_15MS);
  while(1){
  }
}

Je suis passé sur MEGA 2560 R3 mais cela ne fonctionne plus.

Le méga tente de rebooter mais la LED a peu près devant aref se met a clignoter très rapidement et même plus moyen d'utiliser le bouton reset, obliger de débrancher l'alim (par USB).

j'ai aussi tester ce code là :

void(* redemarre_arduino) (void) = 0;

mais meme résultat.

J'essai d'éviter la solution avec une résistance entre une sortie de l'arduino et la broche reset.

Auriez vous une solution ?

bonjour,
dans ton deuxièeme code tu n'aurais pas oublier un truc?

       void (*redemarre_arduino) (void) = 0;
          redemarre_arduino();

infobarquee:
bonjour,
dans ton deuxièeme code tu n'aurais pas oublier un truc?

       void (*redemarre_arduino) (void) = 0;

redemarre_arduino();

Pour tout avouer :blush:, je n'ai pas vraiement compris comment fonctionnait cette fonction je l'ai recopié sur un forum.

mais dans mon sketch dans ma liste de fonction ( tous les void ) je met

void (*redemarre_arduino) (void) = 0;

puis quand je l'appel avec :

redemarre_arduino();

cela fait exactement comme le premier code avec le watchdog

après recherche l'auto reset est deasable sur l'atmega
tu peux lire tout ce, il y a une solution assez simple
http://forum.arduino.cc/index.php/topic,22974.0.html

infobarquee:
après recherche l'auto reset est deasable sur l'atmega

pas sur de comprendre ? les UNO R3 sont aussi avec des ATmega le probleme devrai etre le meme mais cela fonctionne sur mon UNO. Peux etre voulait tu dire les ATmega 2560 ?

et j'ai esseyer de suivre le sujet : http://forum.arduino.cc/index.php/topic,22974.0.html

mais à ce que j'ai compris (en anglais... :~) ils cherches à suprimer le reset dû au bootloader et je ne trouve rien sur mon problème.

Salut,

Il faut remettre à zéro le flag du reset, sinon reset infini.

ajoute ça dans le setup() :

MCUSR &= ~(1<<WDRF);

De ce que j'ai compris, le processeur après reset démarre avec la tempo mini soit 15ms. Le bootloader n'a pas le temps de s'exécuter et il ne devrait pas arriver au setup(). Mais je peux me tromper.

fdufnews:
De ce que j'ai compris, le processeur après reset démarre avec la tempo mini soit 15ms. Le bootloader n'a pas le temps de s'exécuter et il ne devrait pas arriver au setup(). Mais je peux me tromper.

Ce problème s'est déjà présenter sur d'autres topic et a été résolu ainsi. Normalement le watchdog est désactivé pendant le bootloader, et activé en début de programme, donc normalement en début de setup() c'est ok, mais il ne faut pas attendre des plombes non plus

Bonjour, et d'abord merci de m'aider

fdufnews:
De ce que j'ai compris, le processeur après reset démarre avec la tempo mini soit 15ms. Le bootloader n'a pas le temps de s'exécuter et il ne devrait pas arriver au setup(). Mais je peux me tromper.

En effet cela ressemble beaucoup à ca donc j'ai testerla solution de B@tto

B@tto:
Salut,

Il faut remettre à zéro le flag du reset, sinon reset infini.

ajoute ça dans le setup() :

MCUSR &= ~(1<<WDRF);

Si je comprend bien, "MCUSR" c'est une sorte de registre de l'état de l'arduino au démarrage et on lui dit que le watchdog et désactivé ( "WDRF" = Watchdog Reset Flag ) ?

Donc je l'ai inserré en tout début de setup() mais cela n'a pas changer le problème.

Peut etre est-ce pas déja "trop tard" en début de setup, il y a t'il possibilité de faire la même chose avant ?

B@tto:
Normalement le watchdog est désactivé pendant le bootloader, et activé en début de programme, donc normalement en début de setup() c'est ok, mais il ne faut pas attendre des plombes non plus

Alors là je crois qu'il faut se méfier.
C'est vrai pour l'OptiBoot, la ligne en question est clairement au tout début du source du bootloader. En plus si le redémarrage se fait suite à un watchdog l'appli est relancée directement sans délai. Ce qui laisserait le temps pour le désactiver.

Pour le bootloader "standard", c'est moins vrai. La ligne est dans un #ifdef. La variable est définie dans le makefile mais pour certaines cibles seulement. Les cibles en questions sont pro_8mhz, pro_16MHz, pro_20mhz. Donc cela veut dire que toutes les autres cibles n'ont pas cette fonctionnalité.

#ifdef WATCHDOG_MODS
	ch = MCUSR;
	MCUSR = 0;

	WDTCSR |= _BV(WDCE) | _BV(WDE);
	WDTCSR = 0;

	// Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot.
	if (! (ch &  _BV(EXTRF))) // if its a not an external reset...
		app_start();  // skip bootloader
#else
	asm volatile("nop\n\t");
#endif

fdufnews:
C'est vrai pour l'OptiBoot, la ligne en question est clairement au tout début du source du bootloader

fdufnews:
La ligne est dans un #ifdef. La variable est définie dans le makefile mais pour certaines cibles seulement. Les cibles en questions sont pro_8mhz, pro_16MHz, pro_20mhz. Donc cela veut dire que toutes les autres cibles n'ont pas cette fonctionnalité.

Je n'ai pas saisis ce que sont les "cibles : pro_8mhz, pro_16MHz, pro_20mhz" mais pour le reste je devrais :

-soit modifier le bootloader
-soit le changer pour optiboot

Est-ce que l'une de ces option est réalisable ou je m'oriente vers une autre piste ? (résistance entre une sortie broche reset ?)

Si la théorie de fdufnews est le bonne (et je suis d'accord avec lui), il suffit simplement de reprogrammer le bootloader par l'optiboot en effet. Et d'ailleurs en cherchant l'optiboot pour mega ==> bingo d'autres ont le même souci : Google Code Archive - Long-term storage for Google Code Project Hosting.

Vu que tu as une UNO, il te suffit de suivre les tuto "Arduino as ISP programmer" pour la partie programmation en elle-même, et dans le lien précédent le bootloader est fourni. Il te suffit d'éditer le fichier board.txt pour pointer vers ce bootloader et de lancer la prog :wink:

Ouf une solution ... enfin presque pour programmer à partir du UNO il me faut un condo de 10µf et j'ai pas ca en stock donc je commande.

Juste si je peux un peu abuser XD vu que cela me parait un peux compliqué et malgré toute la soirée à parcourir les forums je suis pas tout à fait certain de ma méthode.

pour verifier ma méthode :

"board.txt" pointe pour les méga 2560 le bootloader "stk500v2"

mega.menu.cpu.atmega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex

Dans ton lien a la réponse #7 et #5 il donne les fichier :

Google Code Archive - Long-term storage for Google Code Project Hosting.
stk500boot.c
stk500boot_v2_mega2560.hex

qui semblent remplacer ceux présent à l'origine dans le répertoire « stk500v2 »

Donc apparement je remplace juste "stk500boot.c" et "stk500boot_v2_mega2560.hex" sans toucher au fichier board.txt et ca doit pointer au bon endroit au moment de la gravure ?

Ensuite je charge dans mon UNO le sketch "ArduinoISP"

je branche mon UNO sur le MEGA 2560:

  • Uno -> Mega 2560
  • Pin 5V -> Pin 5V
  • Pin GND -> Pin GND
  • Pin 10 -> Pin slave reset = 53 (FAUX VOIR PAGE 2)
  • Pin MOSI = 11 -> Pin MOSI = 51
  • Pin MISO = 12 -> Pin MISO = 50
  • Pin SCK = 13 -> Pin SCK = 52
  • 1 Condo 10µf entre +5V et RESEST du UNO pour éviter le reset automatique. (FAUX VOIR PAGE 2)

Je selectione la carte mega 2560 et je grave la sequence d'initialisation avec le programmateur "arduino as isp"

Je pense avoir rien oublié ?

C'est tout bon, sauf pour l'historie du reset. Regarde ici : http://arduino.cc/en/Tutorial/ArduinoISP

http://arduino.cc/en/Tutorial/ArduinoISP:
5. Wire your Arduino board to the target as shown in the diagram below. (Note for the Arduino Uno: you'll need to add a 10 uF capacitor between reset and ground.)

Oups exact merci
donc :

  • 1 Condo 10µf entre GND et RESEST du UNO

J'attend mes condensateurs et je me lance, je reviens rapporter le résultat d'ici peu.

a bienot et encore merci

Un grand merci à vous tous, j'ai reprogrammé ma MEGA 2560 avec OPTIBOOT et tout fonctionne parfaitement :

Plus de soucis avec les 3 points d'exclamation ( !!! )
Le Watchdog fonctionne à merveille !

Pour ceux dans le même cas que moi :

Méthode pour reprogrammer sa MEGA 2560 avec OPTIBOOT en utilisant un Arduino UNO

Prévoir un condensateur 10µF
J'utilise la version Arduino 1.5.6-r2 BETA je ne sais pas si cela fonctionne avec d'autre versions

Sur PC allez dans le dossier d'installation du programme Arduino.
Chez moi : "C:\Program Files (x86)\Arduino"

allez jusqu'à : "C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\ "

Si vous voulez faites une copie de sauvegarde du dossier "stk500v2"
Ou allez directement dans :"C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2"

Et remplacer les fichiers :

  • stk500boot.c
  • stk500boot_v2_mega2560.hex

Par ceux-ci :

Google Code Archive - Long-term storage for Google Code Project Hosting.
stk500boot.c
stk500boot_v2_mega2560.hex

Ensuite démarrez le logiciel Arduino et chargez le sketch d'exemple ArduinoISP

Téléversez-le dans votre Arduino UNO comme d'habitude. Arduino UNO "nue", pas de cablage avant le téléversement.

Débranchez tout et câblez la UNO sur la MEGA 2560:

Uno --> Mega 2560
5V --> 5V
GND --> GND
10 --> Reset
11 --> 51
12 --> 50
13 --> 52

Le Condensateur 10µf entre GND et RESEST de la UNO (pate - du condo sur GND et l'autre sur reset)

En images :


Rebranchez le port USB sur la carte UNO
et même si c'est une UNO de branchez choisissez dans le menu :
Outils\ Type de carte\ Arduino Mega or Mega 2560

Toujours dans le menu outils changez le programmateur pour :
Arduino as ISP

Et encore dans le menu Outils choisissez :
Gravez la séquence d'initialisation

Voilà ça dure quelques minutes et en fin de procédure un message d'erreur apparait :fearful::

avrdude: verification error, first mismatch at byte 0x3e000
		         0x0d != 0xff
avrdude: verification error; content mismatch

N'en tenez pas compte :smiley:

La méga 2560 est passée sous Optiboot 8)

Merci à fdufnews pour avoir identifié le problème
Merci à B@tto qui ma aidé à le resoudre.

et merci à toi pour ce superbe descriptif.