코드에서 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

이를 달성하는 세 가지 방법이 있습니다. (마지막은 내가 가장 좋아하는 것입니다)

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

2
@ sachleen : 그것에 대해 더 많이 말하십시오 (opt-1).
JRobert

2
옵션 1 또는 변형은 전원 공급 과도 조건이 설계된 한이 작업을 수행하기에 충분히 깨끗할 수 있습니다.
Russell McMahon


옵션 2는 부트 로더를 실행하지 않습니다.
Edgar Bonet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.