Koddaki Arduino Uno'yu sıfırlama


19

Bir Arduino'yu (yani, yeniden başlatmak için) koddan (yani çizimin kendisinden) sıfırlamak mümkün müdür? Özel bir devre ile mümkün olduğunu biliyorum ama sadece kod ile yapmak için bir şans var mı?

Aşağıda benim kod ve yorum //resetnerede sıfırlama zorlamak istiyorum.

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

Bir tohum ile ve tohum olmadan rasgele sayıların etkisini göstermek için kurulum işlevinin sonunda mikro denetleyiciyi sıfırlamak istiyorum.

Yanıtlar:


22

Bunu başarmanın üç yolu vardır. (sonuncusu benim favorim)

1) Kullanılmayan bir IO'yu RESET pimine bağlayın. Dışarıdan yüksek çekildiği için normal çalışma için INPUT olarak bırakın. Sıfırlamak istediğinizde DÜŞÜK ve Çıktı olarak ayarlayın. (yeniden başlatmayı vur).

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.

sonra istendiğinde ...

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

2) Kodun başına atlayın.

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

Ancak dikkatli olun , bu tüm kayıtların VARSAYILMADIĞI için gerçek bir sıfırlama gerçekleştirmez. Aksine onlar ve IO olduğu gibi bırakılır. Önyükleyiciden ve daha sonra yığıntan bir şeyler başlatılacak. Ve sıfırlama değil!

3) Bekçi köpeğini kullanın. Softreset kütüphanesi kolay hale getirir. Doğrudan uygulamak zor olmasa da. Aşağıda gösterilen..

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

sonra istendiğinde ...

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

2
Okuduğum her şeyden, ilk seçenek önerilmez. Seçenek 2 ve 3 uygundur.
sachleen

2
@sachleen: Lütfen bunun hakkında daha fazla şey söyleyin (opt-1).
JRobert

2
Seçenek 1 veya bir varyant, geçici koşullardaki güç için tasarlandığı sürece bunu yapmak için yeterince temiz bir yol olabilir.
Russell McMahon


Seçenek 2'nin önyükleyiciyi çalıştırmadığı unutulmamalıdır.
Edgar Bonet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.