Reset Software.

bricopin:
B@tto : J'ai fais cette manip des dizaines et des dizaines de fois, pas de changement

Récap:

  • tu as tenté de remettre le bootloader en place (?)
  • ça a pas marché (?)

Qu'est ce que tu as tenté exactement ?

  • (re)upload du bootloader via l'ide arduino
  • ou via avrdude

Si tu as de quoi faire un programmateur ArduinoISP ou que tu as un vrai programmateur d'AVR avec la commande avrdude qui va bien tu peut débloquer ta carte sans problème.

bricopin:
Moonpyk : Ma carte est une Mega 2560

Au moins comme ça le problème du format DIP ou non est réglé :grin:

bricopin:
B@tto : Qu'est ce qu'une SMD ?

La version anglophone de "CMS" : Composant monté en surface — Wikipédia

B@tto:
A bin la tu l'as dans l'os pour la soluce de moonpyk ... SMD = Surface Mounted Device en français CMS = Composant Monté en Surface. Dans ton cas l'atmega n'est pas amovible car soudé à la carte.

C'est dessoudable et changeable au prix de bonnes compétences en soudure, du matériel spécifique (station à air chaud) pour être remplacée et surtout une CPU ATmega1280 toute neuve, pas facile à trouver, si tu n'arrive pas à remettre la carte en état avec un programmeur externe, ta carte est bonne pour la poubelle.

moonpyk:
......., ta carte est bonne pour la poubelle.

Il faudrait peut être mettre un avertissement en tête du topic pour éviter la même mésaventure à d'autres!!!

Je verrai bien un [ATTENTION TOPIC A LIRE JUSQU'AU BOUT].

Bonjour à tous,
J'ai commandé un programmateur externe (USBASP)
Vous les spécialistes, si vous pouviez commencer à me donner la marche à suivre etc ...
Je commencerais à potasser tout ça le temps de le recevoir (fin de semaine).
Il n'est pas question que j’abandonne avant d'avoir essayé toute les pistes.
Merci à vous
JP

C'est ultra simple : tu connectes ton arduino au programmateur cia le header ISP, le programmateur au PC (y'a peut-être un jumper à mettre pour alimenter l'arduino via l'USB du programmateur) tu selectionnes le bon programmateur dans l'IDE et burn bootlader :wink:

Avec la méthode simple (en utilisant l'ide) :

  1. tu choisis la carte qui va bien dans l'ide
  2. tu choisis le programmateur qui va bien dans l'ide
  3. burn bootloader
    Ensuite il suffit d'attendre une petite minute et normalement tout sera comme en sortie d'usine.

Bonjour à tous,
J'ai reçu le programmateur USBASP hier soir.
Ensuite adaptation de la connectique et récupération des drivers.
Donc ce matin j'ai tenté la programmation et ça a bien fonctionné.
Petit bémol, a la fin de la programmation, il met une erreur.
Mais, il suffit de rebrancher l'Arduino sur le port USB, de charger un sketch quelconque et ça fonctionne.
Conclusion, ce petit programmateur bon marché (6.50€) peut nous sortir d'un mauvais pas.
Ceci étant, je reviens à ma demande initiale : comment faire un reset lors de la mise sous tension de l'Arduino.
Si possible avec une autre solution que celle testée dans ce post !!!!!
JP

Si possible avec une autre solution que celle testée dans ce post !!!!!

La 2560 possède un circuit de reset à la mise sous tension (un circuit RC) et un reset par le port série (par la ligne DTR). Donc avant de se lancer dans des manips risquées avec le watchdog il aurait peut être été plus simple de commencer par investiguer de ce coté. D'autant qu'il ne faut pas oublier que le watchdog est contraignant car il faut le réarmer périodiquement pour qu'il ne reset pas la carte à tout bout de champs.

Déjà est-ce une 2560 officielle? si oui le schéma est disponible là : http://arduino.cc/en/Main/ArduinoBoardMega2560.
Si c'est pas une officielle il faudra suivre les pistes partant de la broche 30 du processeur et regarder où il va. Le circuit de reset est assez simple.
A l'aide du schéma (ou sans) il faut suivre les pistes et regarder s'il n'y aurait pas une coupure ou une mauvaise soudure dans le circuit de reset.

fdufnews:
D'autant qu'il ne faut pas oublier que le watchdog est contraignant car il faut le réarmer périodiquement pour qu'il ne reset pas la carte à tout bout de champs.

Je comptais faire un reset avec le watchdog tous les 45 jours afin d'éviter la gestion du passage à zéro de millis() au bout d'un peu plus de 49 jours.

#include <avr/wdt.h>

const unsigned long FCT_MAX=45*86400*1000;

void reset_software(void) {
  wdt_enable(WDTO_30MS);
  for(;;);
}

setup() {
}

loop() {
  if (millis()>FCT_MAX)
  {
    reset_software();
  }
}

Ton commentaire me laisse penser que je risque d'avoir des resets intempestifs ("réarmer périodiquement"?).

Si tu met :

wdt_disable();

en 1er ligne de ton setup() toute possibilité de reset intempestif par le watchdog deviendra impossible :wink:
(normalement le bootloader le fait tout seul mais bon ...)

Ton commentaire me laisse penser que je risque d'avoir des resets intempestifs ("réarmer périodiquement"?).

Le watchdog est un temporisateur qui doit être remis à zéro avant la fin de sa période de comptage sinon il reset la carte.
Si tu programmes un watchdog de 30ms comme dans le code que tu donnes en exemple il faut le réinitialiser avant l'échéance de ces 30ms. ce qui veut dire que tu dois avoir une fonction dans ta boucle loop qui remette à zéro le watchdog et tu dois t'assurer qu'en toutes circonstances ta boucle s'exécute en moins de 30ms.

Le problème de millis() qui reboucle tous les 50 jours possède une solution logicielle simple qui a déjà été expliqué plusieurs fois: http://arduino.cc/forum/index.php/topic,102491.0.html

fdufnews:

Ton commentaire me laisse penser que je risque d'avoir des resets intempestifs ("réarmer périodiquement"?).

Le watchdog est un temporisateur qui doit être remis à zéro avant la fin de sa période de comptage sinon il reset la carte.
Si tu programmes un watchdog de 30ms comme dans le code que tu donnes en exemple il faut le réinitialiser avant l'échéance de ces 30ms. ce qui veut dire que tu dois avoir une fonction dans ta boucle loop qui remette à zéro le watchdog et tu dois t'assurer qu'en toutes circonstances ta boucle s'exécute en moins de 30ms.

Il veut faire un reset hardware depuis le software justement.

En activant le watchdog avec un timeout 30Ms et en créant une boucle infini juste derrière il force un reset hardware au moyen du watchdog.
Lors du reset le watchdog est désactivé par le bootloader (voir même par le fusible WDTON=1) ou au pire par la ligne que je donnai tout à l'heure.
Donc pas de réarmement nécessaire.

Après c'est vrai que la gestion du rollover de millis() serait bien propre qu'un simple reset.

Merci à vous deux pour ces explications claires et précises. Je regarde la solution logicielle du rollover de millis().

Edit : j'utilise bien millis() sous la forme :if ( (millis() - date_avant) > TEMPS) )
Par contre, je ne savais pas qu'en C, pour une variable unsigned long, le résultat d'une soustraction donnant un résultat négatif, il est ajouté 2^32 (modulo 2^32). Donc pas de gestion à gérer lorsque millis() repasse à zéro.

Voici une méthode qui pourrait vous intéresser:
void(* resetFunc) (void) = 0; //declaration of the function

resetFunc(); //call reset

Ryan_MX:
Voici une méthode qui pourrait vous intéresser:
void(* resetFunc) (void) = 0; //declaration of the function

resetFunc(); //call reset

Très mauvaise idée car cela ne replace pas les valeurs par défaut des registres :wink:

Pourtant elle marche pour mon appli, j'aimerais une explication :cold_sweat:

Ryan_MX:
Pourtant elle marche pour mon appli, j'aimerais une explication :cold_sweat:

Voir [RESOLU] reset automatique + [RESOLU] Démarrage du moniteur série sans reset - #6 by skywodd - Français - Arduino Forum

Merci :slight_smile:
eske je peux utiliser cette fonction dans un timer?? :relaxed:
j'aimerais faire des resets à des intervalles de temps précis

Ryan_MX:
eske je peux utiliser cette fonction dans un timer?? :relaxed:
j'aimerais faire des resets à des intervalles de temps précis

La méthode du watchdog oui, la méthode du jump 0x0000 non.
Si tu laisse les timers actif pendant ton reset tu fonces vers les bugs :wink: