Pages: [1]   Go Down
Author Topic: reset grace a pin reset  (Read 1389 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset 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 !
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il n'y a qu'à essayer smiley

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

Code:
#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
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, merci je vais tester ca !
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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(;smiley-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 !

Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
« Last Edit: August 06, 2009, 09:05:23 am by KiliYaBB » Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vais essayer ce soir
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu as pu tester Luj06 ? ;D
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
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
« Last Edit: August 07, 2009, 12:56:21 am by julien@pobot.org » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
Logged

Pages: [1]   Go Up
Jump to: