कोड में एक Arduino Uno को रीसेट करें


19

क्या कोड से अरुडिनो (यानी इसे रिबूट करने के लिए) रीसेट करना संभव है (यानी स्केच से)? मुझे पता है कि यह एक विशेष सर्किट के साथ संभव है लेकिन क्या इसे कोड के साथ बनाने का मौका है?

नीचे मेरा कोड है और टिप्पणी //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) RESET पिन के लिए एक अप्रयुक्त IO जम्पर। इसे सामान्य रन के लिए INPUT के रूप में छोड़ दें, क्योंकि यह बाहरी रूप से उच्च खींचा हुआ है। और जब चाहें रीसेट करें इसे LOW और आउटपुट के रूप में सेट करें। (इसकी रीबूटिंग धमाकेदार)।

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 ठीक हैं।
साचलेन

2
@ साचलेन: कृपया इसके बारे में और कहें (ऑप्ट -1)।
JRobert

2
विकल्प 1. या एक प्रकार एक साफ पर्याप्त तरीका हो सकता है जब तक कि क्षणिक स्थितियों पर शक्ति के लिए डिज़ाइन किया गया हो।
रसेल मैकमोहन


यह ध्यान दिया जाना चाहिए कि विकल्प 2 बूट लोडर नहीं चलाता है।
एडगर बोनट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.