RESET

Pour réinitialiser la carte (c’est à dire relancer le chargement du sketch avec tous les registres réinitialisés) il est possible d’appuyer sur la touche RESET de la carte où d’activer la réinitialisation par logiciel ou via la broche RST de la carte.

1°) Reset Logiciel

Ceci ce fait via le Watchdog qui est une fonction permettant de désactiver un processus s’il met trop de temps à répondre.
Pour utiliser le watchdog, vous aurez besoin d’inclure le fichier avr/wdt.h et d’appeler ensuite la fonction wdt_enable().
La fonction wdt_enable accepte le temps à attendre avant de lancer le Reset automatique de la carte s’il n’y a pas d’autre appel au watchdog.

Vous pouvez choisir entre plusieurs valeurs prédéfinies :

 15mS    WDTO_15MS  
 30mS    WDTO_30MS  
 60mS    WDTO_60MS  
 120mS   WDTO_120MS  
 250mS   WDTO_250MS  
 500mS   WDTO_500MS  
 1S      WDTO_1S  
 2S      WDTO_2S  
 4S      WDTO_4S  
 8S      WDTO_8S  

Pour forcer le reset de la carte, il suffit alors d’implémenter une courte boucle, le système reboot lorsque le temps choisi  expire (timeout).

L’exemple suivant utilise la plus petite valeur pour le timeout. Il suffit d’appeler la fonction software_Rebootpour rebooter la carte.

#include <avr/wdt.h>

void software_Reboot()
{
  wdt_enable(WDTO_15MS);

  while(1)
  {

  }
}

Exemple d'utilisation avec mémorisation de valeur puis Reboot :
 #include <EEPROM.h>  //-- Pour mémoriser des valeurs  
 #include <avr/wdt.h> //-- Pour Reboot  
 int addr;  
 void setup()  
 {byte value;  
  //-- initialize serial and wait for port to open:  
  Serial.begin(9600);  
  while (!Serial) {  
   ; // wait for serial port to connect. Needed for Leonardo only  
  }  
  //-- read the value of the adress 0 of the EEPROM   
  value=EEPROM.read(addr);  
  Serial.println("Ancienne valeur : ");  
  Serial.print(value, DEC);  
  Serial.println();  
  Serial.println("Tapez une touche puis <Enter> !");  
 }  
 void loop()  
 {if (Serial.available() > 0) {  
   long thisChar = Serial.read();  
   //-- say what was sent:  
   Serial.print("You sent me: \'");  
   Serial.write(thisChar);  
   Serial.print("\' ASCII Value: ");  
   Serial.println(thisChar);  
   EEPROM.write(addr, thisChar);  
   Serial.println("On reboot !");  
   delay(2000);  
   software_Reboot();}  
 }  
 //-- Fonction Reboot  
 void software_Reboot()  
 {wdt_enable(WDTO_15MS);  
  while(1)  
  {}  
 }  

2°) Reset matériel

Il faut raccorder la broche RST et une broche digitale (ex: la pin 12).
Ensuite, il suffit d’utiliser le code suivant:

// Cette fonction simule la pression du bouton Reset 
void pushReset() 
{ 
  int pin=12; 
  // active la broche en sortie (OUTPUT)  
  pinMode(pin, OUTPUT); 
  // Déactive le reset forçant la sortie au niveau bas 
  digitalWrite(pin, LOW);
}

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Articles récents
Commentaires récents
fatima dans Bienvenue !
AdminDroid dans Bienvenue !
fatima dans Bienvenue !
Archives
Catégories