用代码重置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() {
}

我想在设置功能的最后重置微控制器,以显示带有和不带有种子的随机数的效果。

Answers:


22

有三种方法可以完成此任务。(最后一个是我的最爱)

1)将未使用的IO跳到RESET引脚。保持其为正常运行的输入,因为它在外部被拉高。并在需要重置时将其设置为LOW和Output。(重启动)。

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)使用看门狗。该SOFTRESET库更容易。尽管直接实施并不难。如下所示。

#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很好。
sachleen 2014年

2
@sachleen:请详细说明(opt-1)。
JRobert

2
只要设计了瞬态条件上电,选项1.或变体就可以做到这一点。
罗素·麦克马洪


应当注意,选项2不运行引导加载程序。
Edgar Bonet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.