[RESOLU] reset automatique + [RESOLU] Démarrage du moniteur série sans reset

Bonjour tout le monde !
Je pense que cette question sera vite résolue :
Comment faire un reset automatique de la carte (sans appuyer sur un bouton).
C'est tout...

Merci d'avoir lu et de bientôt répondre !

Salut,

Je n'ai jamais essayé mais à priori il y aurait moyen de faire quelque chose avec le watchdog, et plus particulièrement la macro wdt_reset.

++

Bonjour,

Reset depuis le code ou depuis un montage externe ?

Pour faire un reset software il existe deux solutions :

  • la solution pas propre qui marche que dans certain cas :
asm("jmp 0x00");
  • la solution propre via le watchdog :
#include <avr/wdt.h>
// ...
wdt_enable(WDTO_15MS);
for(;;);
  • Reset depuis le code;
  • "Reset software" : qu'est ce que "software" ?;
  • "Dans certains cas" : lequels ?;
  • Insérer une bibliothèque pour une fonction ?;

Pour faire simple, j'aimerais qu'avec une ligne C la carte fasse un reset comme si l'on avait appuyé sur un bouton,
quitte à utiliser une voie digitale et faire des branchements (pas trop compliqués quand-même, les branchements...).

Bonsoir skywodd,

skywodd:

for(;;);

Que fait exactement cette instruction de boucle ?
icare

numero_744:

  • Reset depuis le code;
  • "Reset software" : qu'est ce que "software" ?;
  • "Dans certains cas" : lequels ?;
  • Insérer une bibliothèque pour une fonction ?;
  • "software" = logiciel en anglais, donc reset software = reset depuis le code (à contrario de "hardware reset" = reset physique depuis l'extérieur).
  • "dans certain cas" = les registres du CPU ne sont pas réinitialisé quand tu fait asm("jmp 0x00") donc si tu utilises des timers (ou autre truc exotique) il resterons actif et irons foutre le bordel dans ton code :wink:
  • pour pouvoir utiliser le watchdog il faut inclure la librairie "avr/wdt.h" (wdt = watchdog) ce qui semble assez logique :wink:

numero_744:
Pour faire simple, j'aimerais qu'avec une ligne C la carte fasse un reset comme si l'on avait appuyé sur un bouton,
quitte à utiliser une voie digitale et faire des branchements (pas trop compliqués quand-même, les branchements...).

Le travail pré-mâché c'est mal :wink:

#include <avr/wdt.h>

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

(pas trop compliqué comme fonction ;))

icare:
Que fait exactement cette instruction de boucle ?

Elle ne fait rien, c'est une boucle infini :wink:

En C si tu fait un while(1); normalement tu doit avoir un warning du style "condition always true".
Si tu fait for(;; ); cela revient exactement au même mais le compilateur ne fera aucun warning.

C'est juste un retour au début du programme (la led L (broche 13) ne clignote pas) + vidange de la file de réception.
Mais quelle est la différence avec une pression sur le bouton (à part les timers)?

numero_744:
C'est juste un retour au début du programme (la led L (broche 13) ne clignote pas) + vidange de la file de réception.
Mais quelle est la différence avec une pression sur le bouton (à part les timers)?

Quand tu appuis physiquement sur le bouton RESET les registres en ram sont remis à leurs valeurs par défaut (timer off, pas de serial, toutes les broches en entrées, ...).

Quand tu fait un asm("jmp 0x00") tu "saute" à l'adresse zéro (début du programme) SANS remettre les valeurs par défaut des registres.
Du coup ce qui avait été mis en marche (timer, serial, ...) reste en l'état et dans beaucoup de cas ton code planteras de manière inexplicable (ou plus souvent le bootloader).

Et si j'utilise

la solution propre via le watchdog :

#include <avr/wdt.h>

// ...
wdt_enable(WDTO_15MS);
for(;;);

?

Avec le watchdog le reset est physique (comme si tu appuyais sur RESET) donc pas de soucis.

Merci !
(Résolu en 3 jours, pas mal !)

Si on veut une commande manuelle mais qu'on n'aime pas les boutons, reliez la carte à un transistor PNP :
Reset -> E; C -> LED (protégée, bien sur) -> GND
Touchez la base et la carte fait un reset.

Salut tout le monde !

Je suis de retour sur cette discussion pour demander l'inverse de la question de départ :
Comment empêcher un reset lorsque je clique sur moniteur série dans l'IDE ?

numero_744:
Je suis de retour sur cette discussion pour demander l'inverse de la question de départ :
Comment empêcher un reset lorsque je clique sur moniteur série dans l'IDE ?

En hardware : http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
En software : ... ne pas utiliser le "Serial Monitor" de l'ide mais une vrai console série :grin:

Moi j'utilise TerminalBpp : TerminalBpp, LE logiciel à avoir absolument | Skyduino - Le DIY à la française
Il permet de faire un reset (bouton DTR) uniquement quand on le souhaite.

Merci pour ta réponse mais j'ai déjà cherché TerminalBpp mais il ne va pas pour mac (et mon PC ne détecte pas ma carte).
Sur ton premier lien allait très bien jusqu'à ce que je regarde en dessous de l'image... J'ai une UNO =( .
Connaitrais-tu un autre logiciel terminal série gratuit mais pour mac ?
Merci.

P.S. : J'ai un PowerBook G4 qui est plus vieux que moi alors un pas trop lourd si possible...

numero_744:
Sur ton premier lien allait très bien jusqu'à ce que je regarde en dessous de l'image... J'ai une UNO =( .

Mais en dessous du dessin il est écrit :

For the Uno, connecting a 10?F capacitor between the RESET and GND lines works for me (as described in the linked thread).

L'autre solution étant de couper le bout de piste entre les 2 plots entourés de blanc sur la photo ci-dessous.
Si tu veux ensuite réactiver l'auto-reset il faut mettre un pont de soudure entre les 2 plots.
C'est fait pour çà.

screenshot.35.png

Merci barbudor.
Ne souhaitant pas m'attirer d'ennuis lors du transfert de programmes et étant nul en soudures, je préfère éviter la solution n°2 et la solution n°1 m'irai si j'avais des condensateurs libres de cette capacité là...
La solution qui me conviens le mieux est un autre moniteur série.

Tu as quoi sous la main en condensateur ?
N'importe quoi entre 1uF et 100uF ferait l'affaire :wink:

J'en ai mais est-ce grave s'ils sont polarisés ?
Le + sur reset et le - sur GND ? Ces deux bornes sont occupées par un transistor (c.f. plus haut).
Je préfère télécharger un autre moniteur série mais je n'en ai toujours pas trouvé (j'y arriverais !).

numero_744:
J'en ai mais est-ce grave s'ils sont polarisés ?
Le + sur reset et le - sur GND ? Ces deux bornes sont occupées par un transistor (c.f. plus haut).
Je préfère télécharger un autre moniteur série mais je n'en ai toujours pas trouvé (j'y arriverais !).

Les condensateurs de +1µF sont obligatoirement polarisé :wink:
Le + sur reset, le - sur GND.

Merci !

Et pour un terminal série mac, quelqu'un en connaitrait ?