Ripristina un Arduino Uno nel codice


19

È possibile ripristinare un Arduino (ovvero, riavviarlo) dal codice (cioè dallo schizzo stesso)? So che è possibile con un circuito speciale ma c'è la possibilità di farlo solo con il codice?

Di seguito è riportato il mio codice e il commento //resetè dove desidero forzare un ripristino.

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

Voglio ripristinare il microcontrollore alla fine della funzione di impostazione per mostrare l'effetto di numeri casuali con e senza seme.

Risposte:


22

Ci sono tre modi per ottenere questo risultato. (l'ultimo è il mio preferito)

1) Eseguire il jumper di un IO inutilizzato sul pin RESET. Lascialo come INPUT per la corsa normale, poiché è tirato esternamente verso l'alto. E quando lo si desidera ripristinare, impostarlo su BASSO e Uscita. (bang il suo riavvio).

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.

poi quando desiderato ...

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

2) Vai all'inizio del codice.

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

Ma attenzione , questo non esegue un vero reset, in quanto TUTTI i registri NON SONO DEFAULT. Piuttosto loro e l'IO sono lasciati così come sono. Dove qualcosa verrà inizializzato dal bootloader e quindi dall'heap. E resettare non lo sono!

3) Utilizzare il cane da guardia. La libreria SoftReset lo rende facile. Sebbene non sia difficile implementarlo direttamente. Di seguito ..

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

poi quando desiderato ...

...
wdt_enable(WDTO_15MS); // turn on the WatchDog and don't stroke it.
for(;;) { 
  // do nothing and wait for the eventual...
} 
...

2
Da tutto ciò che ho letto, la prima opzione non è consigliata. Le opzioni 2 e 3 vanno bene.
sachleen,

2
@sachleen: per favore, dì di più (opt-1).
JRobert,

2
L'opzione 1. o una variante può essere un modo abbastanza pulito per farlo purché siano progettate condizioni transitorie di accensione.
Russell McMahon,


Va notato che l'opzione 2 non esegue il bootloader.
Edgar Bonet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.