reset grace a pin reset

Bonjour,

Jai besoin pour une application particulière de faire un RESET en cours de LOOP.

Je pensais me servir de la pin RESET. il suffit de lui injecter un LOW pour faire le RESET.

ET je pensais utiliser un pin digital avec un LOW pour lancer ce RESET.

Pensez vous que cela soit déconseillé, dangereux de procédé ainsi, pourquoi ?

Merci !

Il n'y a qu'à essayer :slight_smile:

Mais généralement on trouve une solution soft, comme utiliser le watch-dog timer.

#include <avr/wdt.h>

...

#define soft_reset()        \
do                          \
{                           \
    wdt_enable(WDTO_15MS);  \
    for(;;)                 \
    {                       \
    }                       \
} while(0)

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_softreset

Ok, merci je vais tester ca !

le code au dessus ne marche pas. en fait ca plante sans fin

mais dans le lien il parle de veiux et dancien AVR

du coup jai essayé pour les nouveaux :

Here is some example code that creates a macro that can be called to perform a soft reset:

#include <avr/wdt.h>

...

#define soft_reset()
do
{
wdt_enable(WDTO_15MS);
for(;:wink:
{
}
} while(0)

For newer AVRs (such as the ATmega1281) also add this function to your code to then disable the watchdog after a reset (e.g., after a soft reset):

#include <avr/wdt.h>

...

// Function Pototype
void wdt_init(void) attribute((naked)) attribute((section(".init3")));

...

// Function Implementation
void wdt_init(void)
{
MCUSR = 0;
wdt_disable();

return;
}

mais je ne comprends pas si dans ce cas il faut les deux codes et ou les mettre

et pour faire le soft reset, je mets soft_reset() ou wdt_init(void) dans le loop ?

Merci !

jai fait different test et je ny arrive pas

en fait au moment aou je demande le soft_reset ca plante et la led 13 clignote indéfiniment

Je n'y arrive pas, svp help me !

Je vais essayer ce soir

super merci Luj06 !

jai testé la 1ere version (old avr) et la nouvelle mais sans trop savoir ou placer la fonction

et dans les deux cas au moment de la demande de reset, ca plant, la led13 cligonte a ne plus en finir, comme si il reboutait a linfini

Tu as pu tester Luj06 ? ;D

Oui. Le watchdog reset bien mais il reste en reset comme tu as pu le constater. Le code pour l'éteindre est bien, mais il faut l'exécuter très vite, or notre sketch n'est pas le premier exécuté : il y a d'abord un bootloader Arduino qui permet d'utiliser la liaison série pour charger notre sketch.

Donc à moins de modifier le bootloader pour qu'il fasse le disable du watchdog, pas d'utilisation simple possible.

Mais voici une solution, qui n'est pas tout à fait un reset mais qui peut être suffisant : revenir à l'instruction 0 du programme avec un jump. Cela marche avec le programme suivant :

int increment = 0;

void soft_reset() 
{
  asm volatile ("  jmp 0");  
} 

void setup()
{
  Serial.begin(9600);
  increment = 10;
}

void loop()
{
  increment++;
  Serial.println(increment);
  delay(200);

  if (Serial.available() > 0) {
    if (Serial.read() == 'r')
    {
      soft_reset();
    }
  }
}

On voit bien sur la liaison série : 11 12 13 14 15 16 ...
puis quand on envoie r, ça recommence : ... 17 18 11 12 13 14

Instruction trouvée ici : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1246541553/0#7

MErci Luj06 !

Mais il ne s'agit pas d'un vrai RESET, notamment les registres si je comprends bien.

C'est pour cela que ca recommence à 17 et non 1, non ?

J'avais vu ce post :

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1242847196

Il faut que j'y réfléchisse mais je vais peut être utilisé une source extérieur

Non non, mon exemple n'est pas explicite, j'ai juste répété le 17 et 18 qu'on avait eu juste avant, ça a bien recommencé à 11 puisqu'il est repassé dans la fonction setup qui mets la variable à 10. Par contre ça n'a pas coupé la liaison série (ce qui peut être pratique).