Setzen Sie einen Arduino Uno im Code zurück

19

Ist es möglich, ein Arduino über den Code (dh über die Skizze selbst) zurückzusetzen (dh neu zu starten)? Ich weiß, dass das mit einer speziellen Schaltung möglich ist, aber gibt es eine Chance, es nur mit Code zu machen?

Unten ist mein Code und der Kommentar //resetist, wo ich einen Reset erzwingen möchte.

#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() {
}

Ich möchte den Mikrocontroller am Ende der Setup-Funktion zurücksetzen, um den Effekt von Zufallszahlen mit und ohne Startwert anzuzeigen.

Kimliv
quelle

Antworten:

22

Hierfür gibt es drei Möglichkeiten. (Letzteres ist mein Favorit)

1) Stecken Sie eine nicht verwendete E / A in den RESET-Pin. Lassen Sie es für den normalen Betrieb als EINGANG, da es von außen hochgezogen wird. Und wenn Sie es zurücksetzen möchten, setzen Sie es auf LOW und Output. (Knall seinen Neustart).

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.

dann wenn gewünscht ...

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

2) Zum Anfang des Codes springen.

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

Aber seien Sie vorsichtig , dies führt keinen echten Reset durch, da alle Register NICHT STANDARD sind. Vielmehr bleiben sie und das IO unverändert. Wobei etwas vom Bootloader und dann vom Heap initialisiert wird. Und zurücksetzen geht nicht!

3) Verwenden Sie den Watchdog. Die SoftReset- Bibliothek macht es einfach. Obwohl es nicht schwer ist, direkt umzusetzen. Unten gezeigt ..

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

dann wenn gewünscht ...

...
wdt_enable(WDTO_15MS); // turn on the WatchDog and don't stroke it.
for(;;) { 
  // do nothing and wait for the eventual...
} 
...
mpflaga
quelle
2
Nach allem, was ich gelesen habe, wird die erste Option nicht empfohlen. Option 2 und 3 sind in Ordnung.
Sachleen
2
@sachleen: Bitte sag mehr darüber (opt-1).
JRobert
2
Option 1 oder eine Variante kann eine ausreichend saubere Methode sein, um dies zu tun, solange die Einschaltbedingungen für transiente Zustände ausgelegt sind.
Russell McMahon
@RussellMcMahon - Wie gestaltet man die Einschaltdauer ?
Greenonline
Es ist zu beachten, dass Option 2 den Bootloader nicht ausführt.
Edgar Bonet