Zresetuj kod Arduino Uno w kodzie

19

Czy można zresetować Arduino (tj. Zrestartować go) z kodu (tj. Z samego szkicu)? Wiem, że jest to możliwe przy użyciu specjalnego obwodu, ale czy jest szansa, aby zrobić to tylko za pomocą kodu?

Poniżej znajduje się mój kod, a komentarz //resetto miejsce, w którym chcę wymusić reset.

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

Chcę zresetować mikrokontroler na końcu funkcji konfiguracji, aby pokazać efekt liczb losowych z ziarnem i bez niego.

kimliv
źródło

Odpowiedzi:

22

Istnieją trzy sposoby na osiągnięcie tego. (ostatni jest moim ulubionym)

1) Zewrzyj nieużywane IO do pinu RESET. Pozostaw go jako WEJŚCIE do normalnego biegu, ponieważ jest zewnętrznie wyciągnięty wysoko. A jeśli chcesz zresetować, ustaw go jako NISKI i Wyjście. (uderz w swój restart).

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.

wtedy kiedy jest to pożądane ...

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

2) Przejdź do początku kodu.

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

Ale uważaj , to nie wykonuje prawdziwego resetu, ponieważ wszystkie rejestry NIE SĄ USTAWIONE. Raczej oni i IO pozostają bez zmian. Gdzie coś z bootloadera, a następnie sterty zostanie zainicjowane. I resetowania nie są!

3) Użyj watchdoga. Softreset biblioteki ułatwia. Chociaż wdrożenie nie jest trudne. Pokazane poniżej..

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

wtedy kiedy jest to pożądane ...

...
wdt_enable(WDTO_15MS); // turn on the WatchDog and don't stroke it.
for(;;) { 
  // do nothing and wait for the eventual...
} 
...
mpflaga
źródło
2
Ze wszystkiego, co przeczytałem, pierwsza opcja nie jest zalecana. Opcje 2 i 3 są w porządku.
sachleen
2
@sachleen: Powiedz o tym więcej (opt-1).
JRobert
2
Opcja 1. lub wariant może być wystarczająco czystym sposobem, aby to zrobić, o ile zaprojektowano zasilanie w warunkach przejściowych.
Russell McMahon
Należy zauważyć, że opcja 2 nie uruchamia programu ładującego.
Edgar Bonet,