Đặt lại Arduino Uno trong mã


19

Có thể thiết lập lại một Arduino (tức là để khởi động lại nó) từ mã (tức là từ bản phác thảo)? Tôi biết điều đó là có thể với một mạch đặc biệt nhưng có cơ hội để làm cho nó chỉ bằng mã?

Dưới đây là mã của tôi và bình luận //resetlà nơi tôi muốn buộc thiết lập lại.

#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() {
}

Tôi muốn đặt lại bộ điều khiển vi mô ở cuối chức năng thiết lập để hiển thị hiệu ứng của các số ngẫu nhiên có và không có hạt giống.

Câu trả lời:


22

Có ba cách để thực hiện điều này. (cuối cùng là yêu thích của tôi)

1) Nhảy một IO không được sử dụng đến chân RESET. Để nó là INPUT cho hoạt động bình thường, vì nó được kéo lên cao. Và khi muốn đặt lại, đặt nó ở mức THẤP và Đầu ra. (đập nó khởi động lại).

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.

sau đó khi muốn ...

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

2) Nhảy đến đầu mã.

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

Nhưng hãy cẩn thận , điều này không thực hiện thiết lập lại thực sự, trong đó tất cả các thanh ghi KHÔNG ĐƯỢC CHẤP NHẬN. Thay vào đó họ và IO là trái. Trường hợp đôi khi từ bộ nạp khởi động và sau đó heap sẽ được khởi tạo. Và thiết lập lại được không!

3) Sử dụng cơ quan giám sát. Các SoftReset thư viện làm cho nó dễ dàng. Mặc dù không khó để thực hiện trực tiếp. Dưới đây ..

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

sau đó khi muốn ...

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

2
Từ mọi thứ tôi đã đọc, tùy chọn đầu tiên không được khuyến nghị. Tùy chọn 2 và 3 đều ổn.
sachleen

2
@sachleen: Vui lòng nói thêm về điều đó (opt-1).
JRobert

2
Tùy chọn 1. hoặc một biến thể có thể là một cách đủ sạch để thực hiện điều này miễn là nguồn điện trong các điều kiện nhất thời được thiết kế cho.
Russell McMahon


Cần lưu ý rằng tùy chọn 2 không chạy bộ nạp khởi động.
Edgar Bonet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.