Réinitialiser un Arduino Uno dans le code

19

Est-il possible de réinitialiser un Arduino (c'est-à-dire de le redémarrer) à partir du code (c'est-à-dire du croquis lui-même)? Je sais que c'est possible avec un circuit spécial mais est-il possible de le faire uniquement avec du code?

Ci-dessous mon code et le commentaire //resetest l'endroit où je veux forcer une réinitialisation.

#include <TrueRandom.h>

int i;
int randSeed;
long randNumber;

void setup(){
  Serial.begin(9600);
  Serial.println("20 pseudo Zufallszahlen:");
  for (i=1;i<=20;i++) Serial.print(random(10));
  Serial.println();
  Serial.println();
  //randomSeed(TrueRandom.random());
  randSeed = analogRead (A0);
  randomSeed(randSeed);
  Serial.print("Der 'seed' Wert: ");
  Serial.println(randSeed);
  Serial.println();
  Serial.println("20 Zufallszahlen mit analogem 'seed' Wert:");
  for (i=1;i<=20;i++) Serial.print(random(10));
  Serial.println();
  Serial.println("---------------------------");
  Serial.println();
  delay(500);
  //reset  
}

void loop() {
}

Je veux réinitialiser le micro-contrôleur à la fin de la fonction de configuration pour montrer l'effet des nombres aléatoires avec et sans graine.

kimliv
la source

Réponses:

22

Il y a trois façons d'y parvenir. (le dernier est mon préféré)

1) Jumper un E / S inutilisé à la broche RESET. Laissez-le comme INPUT pour un fonctionnement normal, car il est tiré vers l'extérieur haut. Et lorsque vous souhaitez le réinitialiser, réglez-le sur LOW et Output. (bang son redémarrage).

setup() {
  ...
  pinMode(PINtoRESET, INPUT);    // Just to be clear, as default is INPUT. Not really needed.
  digitalWrite(PINtoRESET, LOW); // Prime it, but does not actually set output. 
  ...                            // Does disable 10K pull Up, but who cares.

puis quand on le souhaite ...

...
  pinMode(PINtoRESET, OUTPUT);   // lights out. Assuming it is jumper-ed correctly.
  while(1);                      // never gets here.

2) Aller au début du code.

void(* resetFunc) (void) = 0;  // declare reset fuction at address 0
...
resetFunc(); //call reset

Mais attention , cela n'effectue pas une véritable réinitialisation, dans la mesure où tous les registres NE SONT PAS DÉFAUTS. Ils et l'IO sont plutôt laissés tels quels. Où quelque chose du bootloader puis du tas sera initialisé. Et la réinitialisation ne l'est pas!

3) Utilisez le chien de garde. La bibliothèque SoftReset vous facilite la tâche. Bien qu'il ne soit pas difficile à mettre en œuvre directement. Indiqué ci-dessous..

#include <avr/wdt.h>
...
setup() {
  ...
  MCUSR = 0;  // clear out any flags of prior resets.
  ...

puis quand on le souhaite ...

...
wdt_enable(WDTO_15MS); // turn on the WatchDog and don't stroke it.
for(;;) { 
  // do nothing and wait for the eventual...
} 
...
mpflaga
la source
2
D'après tout ce que j'ai lu, la première option n'est pas recommandée. Les options 2 et 3 sont très bien.
sachleen
2
@sachleen: Veuillez en dire plus à ce sujet (opt-1).
JRobert
2
L'option 1. ou une variante peut être un moyen suffisamment propre pour ce faire tant que la mise sous tension est conçue pour des conditions transitoires.
Russell McMahon
Il convient de noter que l'option 2 n'exécute pas le chargeur de démarrage.
Edgar Bonet