एक माइक्रोकंट्रोलर को अप्रत्याशित रूप से रीसेट करने का क्या कारण हो सकता है?


26

माइक्रोप्रोसेसर-नियंत्रित प्रणाली में बग की एक विशेष रूप से परेशान करने वाली विविधता माइक्रोप्रोसेसर के लिए अप्रत्याशित रूप से रीसेट करने के लिए है। इस तरह की समस्या को डीबग करने का एक महत्वपूर्ण उपकरण संभावित कारणों की एक सूची है। एक माइक्रोकंट्रोलर को अप्रत्याशित रूप से रीसेट करने का क्या कारण हो सकता है?


1
यहाँ कुछ उत्तर सहायक हो सकते हैं: Electronics.stackexchange.com/questions/30430/… आप किस तरह के माइक्रोकंट्रोलर का उपयोग कर रहे हैं?
जॉन एल।

मैं आमतौर पर dsPIC का उपयोग करता हूं। लेकिन मैं अभी कुछ भी विशेष रूप से डिबग करने की कोशिश नहीं कर रहा हूं, बस संभावित समस्याओं की संदर्भ सूची तैयार कर रहा हूं।
स्टीफन कोलिंग्स

2
क्या यह एक होमवर्क प्रश्न है?
old_timer

1
@ ड्वेलच शायद किसी के लिए कहीं, लेकिन मेरे या मेरे किसी छात्र के लिए नहीं।
स्टीफन कोलिंग्स

1
@ इस तरह से पढ़ा जाना चाहिए कि Atmel URL को विश्वसनीय बनाए रखने के लिए प्रतिबद्ध नहीं हो सकता है।
कज़

जवाबों:


51

PIC और dsPIC चिप्स पर, मैंने अनपेक्षित रीसेट के निम्नलिखित कारणों को देखा है।

हार्डवेयर:

  • पिन चालित कम या तैरने वाला। पहले स्पष्ट सामान की जाँच करें!
  • रीसेट पिन में ESD युग्मन। मैंने देखा है ऐसा तब होता है जब पूरी तरह से असंबंधित उपकरण एक ही डेस्क पर चालू हो जाते हैं। सुनिश्चित करें कि रीसेट पिन पर पर्याप्त समाई है, संभवतः 1 यूएफ जितना।
  • प्रोसेसर के अन्य पिंस में ESD युग्मन। विशेष रूप से स्कोप जांच एंटीना, चिप में युगल शोर और विषम रीसेट का कारण बन सकती है। मैंने "अमान्य ओपकोड" रीसेट कोड की रिपोर्टें सुनी हैं।
  • बुरा मिलाप संयुक्त / आंतरायिक पुल। पावर रेल को खोना या छोटा करना, या तो प्रोसेसर पर या कहीं और बोर्ड पर हो सकता है।
  • पावर रेल गड़बड़ / शोर। क्षतिग्रस्त नियामक या अपस्ट्रीम आपूर्ति में गिरावट सहित किसी भी बाहरी समस्याओं के कारण हो सकता है। सुनिश्चित करें कि प्रोसेसर को खिलाने वाले पावर रेल स्थिर हैं। कहीं और अधिक टोपी की आवश्यकता हो सकती है, शायद प्रोसेसर पर सीधे टोपी को डिकूपिंग करना।
  • कुछ माइक्रोकंट्रोलर्स के पास एक Vcap पिन होता है, जो VDD से जुड़ा नहीं होना चाहिए और इसका अपना कैपेसिटर आम होना चाहिए। इस पिन को ठीक से जोड़ने में विफलता के अप्रत्याशित परिणाम हो सकते हैं।
  • एनालॉग इनपुट निगेटिव को एक निश्चित सीमा तक चलाने से एक रीसेट होता है जो आरसीओएन में एक ब्राउनआउट की तरह रिपोर्ट करता है। डिजिटल आदानों के बारे में भी यही सच हो सकता है।
  • पास के पॉवर कन्वर्टर में बहुत अधिक dV / dt एक भूरापन रीसेट का कारण बन सकता है। ( यह प्रश्न देखें ।) मैंने इसे दो मामलों में देखा है, और एक में मैं इसे कैपेसिटिव युग्मन को ट्रैक करने में सक्षम था। एक आईजीबीटी 100-200 एम्प्स को स्विच कर रहा था, और कुछ प्रतिक्रिया सर्किटों में शोर के कुछ माइक्रोसेकंड देखे जा रहे थे, जो 3.3V प्रोसेसर पर 2V से 8V तक जा रहे थे। उस फीडबैक रेल पर फिल्टर कैप बढ़ने से रिसेट्स बंद हो गया। कोई कल्पना कर सकता है कि ट्रांजिस्टर के पार एक dV / dt फ़िल्टर जोड़ने का एक समान प्रभाव पड़ सकता है।

सॉफ्टवेयर:

  • निगरानी घड़ी। सुनिश्चित करें कि वॉचडॉग टाइमर को अक्सर पर्याप्त रूप से साफ़ किया जाता है, खासकर आपके कोड की शाखाओं में जिसे निष्पादित करने में लंबा समय लग सकता है, जैसे EEPROM लिखते हैं। यह देखने के लिए कि क्या समस्या दूर होती है, यह देखने के लिए अक्षम करके इसके लिए परीक्षण करें।
  • शून्य से भाग दें। यदि आप अपने कोड में कोई विभाजन कार्य कर रहे हैं , तो सुनिश्चित करें कि भाजक कभी भी शून्य के बराबर नहीं हो सकता है। विभाजन से पहले एक सीमा जाँच जोड़ें। मत भूलो कि यह मॉडुलो ऑपरेशंस पर भी लागू होता है ।
  • स्टैक ओवरफ़्लो। बहुत से नेस्टेड फ़ंक्शन कॉल स्टैक के लिए सिस्टम को डायनेमिक मेमोरी से बाहर चलाने का कारण बन सकते हैं, जिससे कोड निष्पादन में असामान्य बिंदुओं पर क्रैश हो सकता है।
  • ढेर का बहाव। यदि आप कोडांतरक में प्रोग्रामिंग कर रहे हैं, तो आप गलती से CALLs को निष्पादित करने की तुलना में अधिक RETURNs निष्पादित कर सकते हैं।
  • गैर-मौजूद रुकावट दिनचर्या। यदि कोई बाधा सक्षम है, लेकिन कोई रुकावट रूटीन परिभाषित नहीं है, तो प्रोसेसर रीसेट हो सकता है।
  • गैर-मौजूद ट्रैप रूटीन। एक रुकावट दिनचर्या के समान है, लेकिन अलग-अलग मैं इसे अलग से सूचीबद्ध कर रहा हूं। मैंने dsPIC 30F4013 का उपयोग करते हुए दो अलग-अलग परियोजनाएं देखी हैं जो यादृच्छिक रूप से रीसेट हो जाती हैं, और इसका कारण एक जाल को ट्रैक किया गया था जिसे अपरिभाषित कहा गया था। बेशक, अब आपके पास यह सवाल है कि पहली जगह में एक जाल क्यों कहा जाता है, जो सिलिकॉन त्रुटि सहित किसी भी संख्या में हो सकता है। लेकिन सभी जाल संचालकों को परिभाषित करना अस्पष्टीकृत रीसेटियों के निदान में संभवतः एक अच्छा प्रारंभिक कदम होना चाहिए।
  • कार्य सूचक विफलता। यदि कोई फ़ंक्शन पॉइंटर किसी मान्य स्थान पर इंगित नहीं करता है, तो पॉइंटर को डीफ़र करना और इंगित किए गए फ़ंक्शन को कॉल करना रीसेट का कारण बन सकता है। इसका एक मनोरंजक कारण तब था जब मैं NULL के क्रमिक मानों (एक फंक्शन पॉइंटर के लिए) और -1 (एक int के लिए) के साथ एक स्ट्रक्चर को इनिशियलाइज़ कर रहा था। कॉमा टाइपो हो गया, इसलिए फ़ंक्शन पॉइंटर वास्तव में NULL-1 के लिए आरंभिक हो गया। तो यह मत मानो कि यह एक CONST है क्योंकि इसमें एक वैध मूल्य होना चाहिए!
  • अमान्य / नकारात्मक सरणी अनुक्रमणिका। सुनिश्चित करें कि आप सभी सरणी सूचकांकों पर ऊपरी और निचले दोनों सीमा पर सीमा जाँच कर रहे हैं , यदि लागू हो।
  • प्रोग्राम मेमोरी में एक डेटा ऐरे बनाना जो प्रोग्राम मेमोरी के सबसे बड़े सेक्शन से बड़ा है। यह संकलन त्रुटि भी नहीं हो सकती है।
  • किसी पॉइंटर को किसी अन्य प्रकार के लिए एक पाइंटर को एड्रेस करना, उस पॉइंटर को डीफ्रेंसिंग करना और एक स्टेटमेंट में LVALUE के रूप में डीरिफर्ड पॉइंटर का उपयोग करना क्रैश का कारण बन सकता है। इस प्रश्न को देखें । संभवतः, यह अन्य अपरिभाषित व्यवहारों पर भी लागू होता है।

कुछ dsPIC पर, RCON रजिस्टर बिट्स को रीसेट का कारण बताता है। यह डीबगिंग के समय बहुत मददगार हो सकता है।


1
@reset पिन: एक फ़्लोटिंग रीसेट पिन स्पुरियस रीसेट के लिए जाना जाता है। हमेशा इसे रोकने के लिए Vcc से बाँधें।
जिप्पी

4
यह एक अविश्वसनीय रूप से संपूर्ण सूची है। मैं अपने अनुभव में AVRs के साथ निष्ठा से कहता हूं कि अगर सभी एक ही स्थिति में अप्रत्याशित परिणाम या रीसेट नहीं करेंगे।
HL-SDK

4
मुझे असेंबलर भाषा प्रोग्रामिंग के लिए एक और एक जोड़ने दें - स्टैक से बेजोड़ रजिस्टर PUSH और POP।
माइकल करस

2
एक जोड़े को और अधिक: हार्डवेयर के तहत, ब्राउनआउट रीसेट। सॉफ्टवेयर के तहत, सॉफ्टवेयर रीसेट निर्देश। ये दोनों कई माइक्रोकंट्रोलर पर उपलब्ध हैं।
tcrosley

2
सूची के लिए एक और: एक केबल के पास रखे गए मोबाइल फोन, कमजोर चालित लाइनों पर आश्चर्यजनक रूप से महत्वपूर्ण मात्रा में वोल्टेज उत्पन्न कर सकते हैं। यदि आपके पास एक केबल के माध्यम से जाने वाली रीसेट लाइन है (जैसे कि एक बोर्ड दूसरे के रीसेट को मजबूर कर सकता है), तो केबल के पास एक मोबाइल फोन रीसेट को ट्रिगर कर सकता है जैसे कि यह कॉल प्राप्त करता है।
सुपरकाट

7

RESET- पिन को वोल्टेज के ऊपर / नीचे एक रीसेट सर्किट मॉनिटरिंग द्वारा ठीक से संचालित किया जाना चाहिए और एक लंबे समय से रीसेट सिग्नल का निर्माण करना चाहिए। इसके साथ एक अनियंत्रित हार्डवेयर रीसेट के साथ मेरे अनुभव तब आते हैं:

  • RESET पिन / लाइन में स्विचिंग लाइनों से क्रॉसस्टॉक (उन्हें छोटा करें)
  • ग्राउंड शिफ्ट / लूप बाहरी उच्च वर्तमान लोड को चालू / बंद करने के कारण होता है
  • वोल्टेज स्पाइक बिजली की आपूर्ति द्वारा फ़िल्टर नहीं किया गया है और उचित RESET को सक्रिय करने के लिए बहुत कम है
  • माइक्रोकंट्रोलर द्वारा बाहरी भार को स्विच करना जो उपरोक्त समस्याओं का कारण बनता है (मुख्य रूप से प्रेरक भार जैसे मोटर पर / बंद, रिले या पुराना दीपक (दबाव वर्तमान)
  • किसी भी माइक्रोकंट्रोलर पिंस पर वोल्टेज / करंट स्पाइक (सबसे खराब है ऑसिलेटर) रिवर्स करंट का कारण बन सकता है और आंतरिक रजिस्टर (सप्लाई लाइन पर वोल्टेज स्पाइक्स के समान) को स्विच कर सकता है। सामान्य तौर पर, जब एक प्रकार के औद्योगिक वातावरण में अंतर पड़ने पर सावधानी बरतने की जरूरत होती है (अधिक देखने के लिए: http://www.ichaus.biz/wp1_mcu_interface )। IOs, इनपुट फ़िल्टरिंग और सॉफ्ट स्विचिंग आउटपुट पर लेवल शिफ्टिंग पर विचार किया जाना चाहिए। आपूर्ति लाइनों को साफ करना हार्डवेयर पक्ष पर पहली प्राथमिकता है। फिर RESET और थरथरानवाला पिन, फिर IO- लाइनें। -mm

1
ग्राउंड शिफ्ट सिर्फ मुझे। मेरे मामले में, मेरे पास अपने सामान्य जाल का एक विशेष हिस्सा था ~ 100 amps। माइक्रोकंट्रोलर को उस मोटी ट्रेस के एक तरफ संदर्भित किया गया था, लेकिन माइक्रोकंट्रोलर के कुछ सर्किट को ट्रेस के दूसरे छोर पर भेजा गया था। ट्रेस केवल 3 mOhm था, लेकिन 100 amps में माइक्रो और बाह्य उपकरणों के बीच 300 mV अंतर प्राप्त करने के लिए पर्याप्त है। नियंत्रक के रूप में उस ट्रेस के एक ही छोर के लिए सामान्य होने के लिए परिधीयों को फिर से जोड़ा, और अब सब ठीक है। उन धाराओं पर एक नोड के रूप में ऐसी कोई चीज नहीं है।
स्टीफन कॉलिंग्स

4

एक अतिरिक्त संभावना जो मैंने इस सूची में नहीं देखी, वह एक उपकरण है जो ICSP का समर्थन करता है। यदि सर्किट सीरियल प्रोग्रामिंग मोड में ट्रिगर करने वाली लाइनों पर अपर्याप्त पुल अप का उपयोग किया जाता है, तो कभी-कभी उस मोड को बेतरतीब ढंग से दर्ज करना संभव है। यह एक छोटे अंतराल को बाद में रीसेट करता है जब कोई कार्यक्रम अद्यतन निर्दिष्ट धारावाहिक रिसीवर लाइनों को नहीं भेजा जाता है। मुझे संदेह है कि यदि ICSP शुरू किया गया है और कोई प्रोग्रामिंग डेटा नहीं भेजा गया है, तो एक आंतरिक वॉचडॉग टाइमर बलों को रीसेट किया गया है। यह एक गलती है जिसे मैंने 16F876 के साथ खोजने में बहुत समय बिताया है।


3

सुनिश्चित करें कि आप अपने सर्किट में सीएमओएस या टीटीएल लॉजिक चिप्स का उपयोग कर रहे हैं कि उनके पास वीडी और ग्राउंड (आमतौर पर 0.1 यूएफ) में पर्याप्त डिकॉप्लिंग कैपेसिटर हैं। मैं एक डिज़ाइन में CD4021 का उपयोग कर रहा था और जब यह उपयोग में था, तो जाहिर तौर पर यह कुछ स्पाइक पैदा कर रहा था जो माइक्रोप्रोसेसर को फिर से शुरू करने का कारण बन रहा था। फिर चक्र दोहराता। यह इसलिए भी है कि आपके कोड की शुरुआत में एक स्पष्ट परीक्षण अनुक्रम (जैसे कि एक एलईडी को बंद करना और कुछ समय बंद करना) डालना एक अच्छा विचार है ताकि आपको पता चल जाए कि माइक्रोप्रोसेसर काम कर रहा है और कोड निष्पादित कर रहा है।


2

यह उन दुर्लभ चीजों में से एक है जो पॉप अप कर सकते हैं:

मेरे पास एक प्रोजेक्ट था जिसमें एक माइक्रोकंट्रोलर शामिल था और यह छिटपुट रूप से खुद को रीसेट करेगा। लंबी कहानी छोटी, कुछ विकल्प को सक्षम या अक्षम करना पड़ता था अन्यथा रीसेट हो सकते थे। मुझे केवल यह पता चला कि इरेटा को पढ़ने के बाद सब कुछ छोड़ देना चाहिए।

अब मुझे इरेटा पढ़ने की आदत है, इससे पहले कि मैं यह जानने के लिए एक चिप का उपयोग करने का फैसला करूं कि मैं अपने आप में क्या कर रहा हूं और अगर इसका कुछ मैं प्रबंधन कर सकता हूं। दुर्भाग्य से, स्नातक होने के बाद, मेरे पास वास्तव में किसी को भी सामान्य प्रथाओं के बारे में शिक्षित करने के लिए नहीं था, मेरी वास्तविक दुनिया में सीखने की विफलता और निराशा के माध्यम से बहुत कुछ किया गया है।


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