Скидання 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).
Дж. Роберт

2
Варіант 1. або варіант може бути досить чистим способом зробити це до тих пір, поки розрахована потужність на перехідних умовах.
Рассел Макмахон,


Слід зазначити, що варіант 2 не запускає завантажувач.
Едгар Бонет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.