Setel ulang Arduino Uno dalam kode

19

Apakah mungkin untuk mereset Arduino (yaitu, untuk reboot) dari kode (yaitu dari sketsa itu sendiri)? Saya tahu itu mungkin dengan sirkuit khusus tetapi apakah ada peluang untuk membuatnya hanya dengan kode?

Di bawah ini adalah kode saya dan komentar //resetadalah di mana saya ingin memaksa 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() {
}

Saya ingin mengatur ulang micro-controller di akhir fungsi pengaturan untuk menunjukkan efek angka acak dengan dan tanpa seed.

Kimliv
sumber

Jawaban:

22

Ada tiga cara untuk mencapai ini. (terakhir adalah favorit saya)

1) Jumper IO yang tidak digunakan ke pin RESET. Biarkan sebagai INPUT untuk menjalankan normal, Karena ditarik secara eksternal tinggi. Dan ketika diinginkan untuk mengatur ulang itu sebagai RENDAH dan Output. (bang me-reboot-nya).

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.

maka ketika diinginkan ...

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

2) Langsung ke awal kode.

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

Tapi hati-hati , ini tidak melakukan reset yang benar, karena semua register TIDAK DIHANCURKAN. Sebaliknya mereka dan IO dibiarkan apa adanya. Di mana sesuatu dari bootloader dan kemudian heap akan diinisialisasi. Dan reset tidak!

3) Gunakan pengawas. The softreset perpustakaan membuatnya mudah. Meskipun tidak sulit untuk diimplementasikan secara langsung. Ditunjukkan di bawah ini ..

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

maka ketika diinginkan ...

...
wdt_enable(WDTO_15MS); // turn on the WatchDog and don't stroke it.
for(;;) { 
  // do nothing and wait for the eventual...
} 
...
mpflaga
sumber
2
Dari semua yang saya baca, opsi pertama tidak direkomendasikan. Pilihan 2 dan 3 baik-baik saja.
sachleen
2
@sachleen: Tolong katakan lebih banyak tentang itu (opt-1).
JRobert
2
Opsi 1. atau varian dapat menjadi cara yang cukup bersih untuk melakukan ini selama daya pada kondisi transien dirancang untuk.
Russell McMahon
Perlu dicatat bahwa opsi 2 tidak menjalankan bootloader.
Edgar Bonet