Auteur Sujet: Comment faire un reset software d'un ATMega328  (Lu 25075 fois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3041
  • 100% Arduino et N
    • Voir le profil
Comment faire un reset software d'un ATMega328
« le: août 24, 2019, 12:01:10 am »
En l'occurence, un Nano qui fait tourner DCC++ donc avec des interruptions pour le Timer 1 ainsi que l'I2C .
J'ai trouvé cette fonction sur le web, sans succès :
void software_Reset()
{
  do
  {
    wdt_enable(WDTO_15MS);
    for(;;) {};

  } while(0);
}
avec cette ligne en début de setup :
wdt_disable() ;MCUSR = 0;                                  // clear all reset flags
Bon ça ne marche pas et l'Arduino est bloqué et tourne en rond même avec un reset USB.
J'appelle cette fonction à la fin d'un processus de configuration entre 2 processeurs qui se causent en I2C, pour repartir du bon pied... là c'est pas le pied  :-\

Est-ce que j'ai faux quelque part ? Que dois-je faire ?
« Modifié: août 24, 2019, 02:07:08 pm par Dominique »
Cordialement,
Dominique

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #1 le: août 24, 2019, 09:42:39 am »
Peut être la bibliothèque de Jean Luc avec son watchdog ? Est ce qu'il ne fait pas ce genre de chose ?

Tony04

  • Hero Member
  • *****
  • Messages: 569
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #2 le: août 24, 2019, 11:50:42 am »
Bonjour tout le monde,

est-ce que cette ligne ne fonctionne pas ?
    __asm__ __volatile__ ("jmp 0");

Chaque trait correspond à 2 soulignés du 8

Cordialement
Antoine

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3041
  • 100% Arduino et N
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #3 le: août 24, 2019, 02:05:02 pm »
Merci Antoine,

Non c’est la méthode non recommandée car cela ne remet pas les registres en état initial comme lors d’une mise sous tension. Les interruptions peuvent continuer à provoquer des choses quand les variables ne sont pas initialisées.

J’ai essayé la bibliothèque de Jean-Luc  (KeepMeAlive), sans succès (la led builtin clignote mais rien ne vient du setup. J’ai peur d’avoir abimé le bootloader ou les fusibles. Je précise que c’est un Nano clone avec CH340 et le « oldbootloader » qui a probablement une partie de sa responsabilité

J’ai tout enlevé et la méthode »débranche-rebranche » marche nickel quand même.

Mais la question reste posée. Je reste sur ma faim :P
Amicalement
Dominique
« Modifié: août 24, 2019, 02:13:51 pm par Dominique »
Cordialement,
Dominique

trimarco232

  • Sr. Member
  • ****
  • Messages: 345
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #4 le: août 28, 2019, 08:26:15 pm »
tout se passerait comme si le reboot ne se fait pas et que par conséquent le programme reste dans la boucle
je pense que tu as pu t'assurer que le wdt a bien agi (truc simple comme une led qui ne s'allume plus) ?

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3041
  • 100% Arduino et N
    • Voir le profil
Re : Re : Comment faire un reset software d'un ATMega328
« Réponse #5 le: août 28, 2019, 10:10:03 pm »
tout se passerait comme si le reboot ne se fait pas et que par conséquent le programme reste dans la boucle
je pense que tu as pu t'assurer que le wdt a bien agi (truc simple comme une led qui ne s'allume plus) ?
Oui c’est sûr qu’il a bien déclenché, mais avant il faudrait sans doute remette les registres en état initial comme lors d’un Reset hard. Ce qui se passe là : la led 13 clignote et le Reset USB (donc le televersement ou l’ouverture du moniteur ne fonctionnent plus.
Cordialement,
Dominique

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #6 le: août 29, 2019, 02:22:48 pm »
Bonjour,

Concernant le watchdog et les bootloader ancienne version, j'avais trouvé des informations indiquant que ces anciennes versions ne désactivaient pas le watchdog. Or lorsque le reset est dû au watchdog, le watchdog reste actif et si le temps d'attente du bootloader pour un nouveau flashage + le temps d'init avant setup est > au délai du watchdog, la carte passe son temps à rebooter. La solution est alors de couper son alimentation.

Le bootloader OptiBoot désactive le watchdog au démarrage et donc n'est pas touché par le phénomène.

Si tu veux que ça fonctionne quelque soit le bootloader tu peux
  • mettre un telai de watchdog suffisamment long pour assurer que tu arrives dans setup où tu vas couper le watchdog
  • utiliser une broche en sortie connectée au RESET que tu pourras déclencher avec un simple digitalWrite
« Modifié: août 29, 2019, 04:44:45 pm par Jean-Luc »
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3041
  • 100% Arduino et N
    • Voir le profil
Re : Re : Comment faire un reset software d'un ATMega328
« Réponse #7 le: août 29, 2019, 04:05:59 pm »
Si tu veux que ça fonctionne quelque soit le bootloader tu peux
  • mettre un telai de watchdog suffisamment long pour assurer que tu arrives dans setup où tu vas couper le watchdog
  • utiliser une broche en sortie connectée au RESET que tu pourras déclencher avec un simple digitalWrite

Merci Jean-Luc,

Je vais essayer le 1) et ce sera plus sûr de prévoir un fils supplémentaire comme dans le 2)

Cordialement,
Dominique

trimarco232

  • Sr. Member
  • ****
  • Messages: 345
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #8 le: septembre 15, 2019, 10:52:39 pm »
Bonjour,
très intéressant, Dominique, peux-tu nous faire un retour ?

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3041
  • 100% Arduino et N
    • Voir le profil
Re : Comment faire un reset software d'un ATMega328
« Réponse #9 le: octobre 04, 2019, 05:43:33 pm »
La connexion d'une pin digitale de l'Arduino à une pin RESET est la meilleure solution !

Ce petit programme très puissant marche très bien :

void software_Reset()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);// allumer la led intégrée..
  delay(200);
  digitalWrite(LED_BUILTIN, LOW);// pour faire joli
  pinMode(5, OUTPUT);             // pin 5 commande le reset
  digitalWrite(5, LOW); // reset Hardware
}

Le seul inconvénient est que ça mobilise une pin ???
Cordialement,
Dominique