รีเซ็ต 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 ปล่อยให้มันเป็น 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 ที่เหลืออยู่ตามที่เป็นอยู่ ที่ไหนสักแห่งจาก bootloader แล้วกองจะเริ่มต้น และรีเซ็ตไม่ได้!

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 หรือตัวแปรอาจเป็นวิธีที่สะอาดพอที่จะทำเช่นนี้ตราบใดที่การจ่ายไฟสำหรับเงื่อนไขชั่วคราวได้รับการออกแบบมา
รัสเซลแม็คมาฮอน


ควรสังเกตว่าตัวเลือก 2 ไม่ได้รัน bootloader
Edgar Bonet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.