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); }
Votre commentaire