Сброс 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() {
}

Я хочу сбросить микроконтроллер в конце функции настройки, чтобы показать эффект случайных чисел с и без начального числа.

kimliv
источник

Ответы:

22

Есть три способа сделать это. (последний мой любимый)

1) Переместите неиспользуемый ввод-вывод на контакт RESET. Оставьте его как INPUT для нормального запуска, так как он сильно вытянут наружу. И при желании сбросить установите его как 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...
} 
...
mpflaga
источник
2
Из всего, что я прочитал, первый вариант не рекомендуется. Варианты 2 и 3 в порядке.
сахлин
2
@sachleen: Пожалуйста, расскажите об этом подробнее (opt-1).
JRobert
2
Вариант 1. или вариант может быть достаточно чистым способом сделать это, если рассчитано питание в переходных режимах.
Рассел МакМахон
Следует отметить, что вариант 2 не запускает загрузчик.
Эдгар Бонет