コードでArduino Unoをリセットする


19

Arduinoをコードから(つまり、スケッチ自体から)リセット(つまり、再起動)することは可能ですか?私はそれが特別な回路で可能であることを知っていますが、コードだけでそれを作る機会がありますか?

以下は私のコードであり、コメント//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() {
}

セットアップ関数の最後にマイクロコントローラーをリセットして、シードの有無にかかわらず乱数の効果を示したいと思います。

回答:


22

これを達成するには、3つの方法があります。(最後は私のお気に入りです)

1)未使用のIOをRESETピンにジャンパーします。外部からハイに引き上げられるため、通常の実行ではINPUTのままにします。リセットする場合は、LOWおよび出力として設定します。(再起動を強打)。

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.

その後、必要に応じて...

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

2)コードの先頭にジャンプします。

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

ただし、すべてのレジスタがデフォルトではないため、これは真のリセットを実行しません。むしろ、それらとIOはそのまま残されます。ブートローダーからのデータとヒープが初期化される場所。そしてリセットはそうではありません!

3)ウォッチドッグを使用します。ソフトリセットのライブラリは、簡単にそれを作ります。直接実装することは難しくありませんが。下に示された..

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

その後、必要に応じて...

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

2
私が読んだすべてのものから、最初のオプションはお勧めしません。オプション2と3は問題ありません。
サックリーン14年

2
@sachleen:それについて詳しくお聞かせください(opt-1)。
JRobert

2
オプション1.またはバリアントは、電源オンの過渡条件が設計されている限り、これを実行するのに十分な方法です。
ラッセルマクマホン


オプション2はブートローダーを実行しないことに注意してください。
エドガーボネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.