क्या AVR रजिस्टरों और बंदरगाहों को शून्य से आरंभ करने की आवश्यकता है?


9

अपने कोड के इनिशियलाइज़ेशन रूटीन के दौरान मैं इस तरह के काम करता हूँ:

clr    r0  ; will always stay zero

तथा:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

क्या यह वास्तव में आवश्यक है? या क्या मुझे यकीन है कि यह स्वचालित रूप से रीसेट पर किया जा सकता है? विशेष रूप से, क्या मैं डिफ़ॉल्ट रूप से इनपुट के रूप में सेट किए जाने के लिए सभी बंदरगाहों पर भरोसा कर सकता हूं ताकि कोई कोड निष्पादित होने पर बाहरी वोटों के साथ कोई समस्या न हो?

जवाबों:


6

किसी AVR के I / O पोर्ट को रीसेट करने पर INPUT / Tri-State / Hi-Z (DDRx = 0x00) पर सेट किया जाता है। अधिकांश माइक्रोकंट्रोलर (यदि सभी नहीं हैं?) में यह व्यवहार है। यह एक पिन के लिए सबसे सुरक्षित स्थिति है। हां, आप इनपुट के रूप में स्वचालित रूप से सेट किए जाने वाले पोर्ट पर भरोसा कर सकते हैं।

कुछ ATmega16 शो के कुछ अंश:

यहां छवि विवरण दर्ज करें

पोर्ट C पिन को त्रिकोणीय कहा जाता है जब एक रीसेट स्थिति सक्रिय हो जाती है, भले ही घड़ी चल नहीं रही हो।


1
यह वही है जो मैं देख रहा हूँ :)
स्टीफन पॉल नैक

जहाँ तक मुझे याद है, यदि आप एक इनपुट को छोड़ते हैं, तो आपको उस पर यादृच्छिक शोर मिलता है, इसलिए प्रारंभिक स्थिति शून्य हो सकती है, यह ठीक है, लेकिन यह पहले घड़ी चक्र के बाद गैर शून्य हो सकता है।
चूहा

@miceuz बिंदु एक अज्ञात स्थिति में आउटपुट के लिए नहीं है । बाहरी सर्किट पर उनका अवांछनीय प्रभाव हो सकता है जो कि माइक्रोकंट्रोलर से जुड़ा होता है
m.Alin

1
@ माइसुज़ आप पोर्ट इनपुट रजिस्टरों का उल्लेख कर रहे हैं, है ना? इनके पास अपनी प्रारंभिक स्थिति के रूप में एन / ए है (जो समझ में आता है, क्योंकि वे सिर्फ पिन पर लागू होते हैं जो दर्शाते हैं)। लेकिन मैं डेटा दिशा रजिस्टरों का उल्लेख कर रहा था। मैं सिर्फ यह सुनिश्चित करना चाहता था कि मेरे पास पोर्ट के रूप में आउटपुट के रूप में सेट नहीं है, संभवतः पिन पर लागू वोल्टेज के साथ परस्पर विरोधी।
स्टीफन पॉल नैक

ओह, हाँ, वास्तव में, शोर के लिए खेद है ..
चूहों 20:10

4
  • पोर्ट आरंभीकरण हमेशा एक अच्छा विचार है, चाहे डेटा शीट क्या कहे।

  • यदि डेटशीट कुछ भी नहीं कहती है तो यह एक महत्वपूर्ण विचार है।


आपको केवल पोर्ट डेटा सामग्री को परिभाषित करने की आवश्यकता है यदि आप इस बात की परवाह करते हैं कि जब आपका प्रोग्राम चलता है तो क्या होगा।

यदि आपको परिणाम की परवाह नहीं है तो आपको पोर्ट डेटा बिट्स सेट करने की आवश्यकता नहीं है :-)।

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


पूरी तरह से सहमत। मुझे लगा कि हार्डवेयर रिसेट के बजाय, प्रोग्राम स्टार्ट होने के लिए एक छलांग हो सकती है या - हाल ही में मेरे साथ क्या हुआ जब अप्रत्यक्ष कूद गलत हो गया - प्रोग्राम काउंटर बस ओवरफ्लो कर रहा है और फिर से 0x0000 तक पहुंच रहा है। कौन जानता है कि उसके बाद किस राज्य में बंदरगाह होंगे ...
स्टीफन पॉल नैक

1

न तो रजिस्टर और न ही एसआरएएम को रीसेट पर शुरू किया जाता है, केवल कुछ परिधीय रजिस्टर। आपको उन चीजों को इनिशियलाइज़ करना चाहिए जिनका आप उपयोग करते हैं।


क्या आप जानते हैं या किसी ऐसे लिंक का खो जाना है जिस पर यह लागू होता है? मुझे UCSRCडेटाशीट जैसे कुछ के लिए 'शुरुआती मूल्य' मिले । I / O पोर्ट के बारे में क्या है, विशेष रूप से डेटा दिशा?
स्टीफन पॉल नैक

2
I / O पोर्ट इनपुट करने के लिए सेट हैं। यह सब डाटा शीट में है।
लियोन हेलर

@LeHHeller ओह धन्यवाद, अब मैं इसे देखता हूं। वहीं रजिस्टर विवरण में। मुझे किसी तरह याद आया ...
स्टीफन पॉल नैक

@ noah1989, लियोन सही है, परिधीय रजिस्टरों के लिए प्रारंभिक मान हमेशा रजिस्टर के विज़ुअलाइज़ेशन के नीचे निर्दिष्ट किए जाते हैं (या जो भी व्यक्तिगत बिट्स के नाम के साथ छवि कहा जाता है :))।
अवकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.