प्रोग्रामिंग एवीआर माइक्रोकंट्रोलर। AVR प्रोग्रामिंग कैसे शुरू करें? सिफारिशें। प्रोग्रामिंग मोड में एमके इंटरफ़ेस

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

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

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

अधिकांश डेस्कटॉप या मेनफ्रेम कंप्यूटरों के विपरीत, एम्बेडेड प्रोग्राम कुछ उपयोगी करते हैं, और एक एम्बेडेड प्रोग्रामर के लिए, चीजें जो चीजें करती हैं वे अंतहीन रूप से अच्छी होती हैं। इस प्रश्न का कोई सटीक उत्तर नहीं है क्योंकि प्रत्येक उत्तर में कुछ अपवाद होंगे। हालांकि, हमारे उद्देश्यों के लिए, हम घोषित करेंगे कि एक एम्बेडेड सिस्टम एक ऐसी प्रणाली है जो एक या अधिक माइक्रो कंप्यूटरों का उपयोग करती है, विशेष विशेष प्रोग्राम चलाती है, और विशेष प्रकार के कार्यों को करने के लिए विशेष हार्डवेयर से जुड़ती है।

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

दूसरी ओर, सी का मजबूत बिंदु कोड पोर्टेबिलिटी है। अगर, ज़ाहिर है, सब कुछ सही ढंग से लिखने के लिए। परियोजना के विभिन्न भागों में कार्य एल्गोरिदम और उनके लोहे के कार्यान्वयन को अलग करना। फिर, एल्गोरिदम को दूसरे एमके में स्थानांतरित करने के लिए, केवल इंटरफ़ेस परत को फिर से लिखना पर्याप्त होगा, जहां हार्डवेयर तक सभी पहुंच लिखी जाती है, और सभी कामकाजी कोड को छोड़ दें। और, ज़ाहिर है, पठनीयता। Sish स्रोत कोड को एक नज़र में समझना आसान है (हालाँकि .. उदाहरण के लिए, मुझे परवाह नहीं है कि क्या फ़्लिक करना है - कम से कम si, कम से कम asm :)), लेकिन, फिर से, अगर सब कुछ सही ढंग से लिखा गया है। मैं इन बिंदुओं पर भी ध्यान दूंगा।

एम्बेडेड सिस्टम के कुछ उदाहरण। गायन दीवार मछली। उपरोक्त सूची में कुछ बातों पर ध्यान देने योग्य है। जबकि कई एम्बेडेड सिस्टम काफी पारंपरिक उपयोगकर्ता I/O उपकरणों का उपयोग करते हैं, कई अन्य नहीं करते हैं। इसके अलावा, कई एम्बेडेड सिस्टम सीधे मनुष्यों के साथ बातचीत करते हैं, जबकि अन्य नहीं करते हैं।

एम्बेडेड प्रोग्रामिंग अलग कैसे है?

एंबेडेड प्रोग्राम को विशेष घटकों और कस्टम सर्किटरी के साथ मिलकर काम करना चाहिए जो बनाता है हार्डवेयर. एक पूर्ण-विशेषताओं वाले ऑपरेटिंग सिस्टम के शीर्ष पर प्रोग्रामिंग के विपरीत, जहां प्रोग्रामर के नोटिस और नियंत्रण से हार्डवेयर विवरण जितना संभव हो सके हटा दिया जाता है, अधिकांश एम्बेडेड प्रोग्राम सीधे हार्डवेयर पर और हार्डवेयर पर काम करते हैं। तो एक एम्बेडेड प्रोग्रामर को हार्डवेयर का अच्छा ज्ञान होना चाहिए, कम से कम लेखन के रूप में सॉफ़्टवेयरजो इस उपकरण के साथ ठीक से संचार करता है और नियंत्रित करता है।

लोहे के एक प्रायोगिक टुकड़े के रूप में जिस पर सभी उदाहरणों का शेर का हिस्सा रखा जाएगा, मेरा डिबग बोर्ड होगा।

एवीआर के लिए पहला सी कार्यक्रम

एक कंपाइलर चुनना और एक पर्यावरण स्थापित करना
AVR के लिए कई अलग-अलग C कंपाइलर हैं:
सबसे पहले, यह आईएआर एवीआर सी- लगभग स्पष्ट रूप से AVR, tk के लिए सर्वश्रेष्ठ कंपाइलर के रूप में मान्यता प्राप्त है। नियंत्रक ही Atmel और IAR के विशेषज्ञों के बीच निकट सहयोग में बनाया गया था। लेकिन आपको हर चीज के लिए भुगतान करना होगा। और यह कंपाइलर न केवल महंगा व्यावसायिक सॉफ्टवेयर है, बल्कि इसमें सेटिंग्स की इतनी अधिकता है कि आपको इसे संकलित करने के लिए बस कड़ी मेहनत करनी होगी। मेरी वास्तव में उससे दोस्ती नहीं थी, लिंकिंग चरण में अजीब त्रुटियों के कारण परियोजना सड़ गई (बाद में मुझे पता चला कि यह एक कुटिल दरार थी)।

यह ज्ञान अक्सर प्रमुख हार्डवेयर घटकों को निर्दिष्ट करने के लिए विस्तारित होता है, और छोटे संगठनों में, हार्डवेयर डिज़ाइन और लेआउट कभी-कभी शामिल होता है। एम्बेडेड प्रोग्रामर को डिबगिंग हार्डवेयर जैसे मल्टीमीटर, ऑसिलोस्कोप, लॉजिक एनालाइज़र और इसी तरह की अच्छी समझ होनी चाहिए।

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

दूसरा जाता है विनएवीआर जीसीसीएक शक्तिशाली अनुकूलन संकलक है। पूर्ण खुला स्रोत, क्रॉस-प्लेटफ़ॉर्म, सामान्य रूप से, जीवन की सभी खुशियाँ। यह एवीआर स्टूडियो में भी पूरी तरह से एकीकृत हो जाता है, जिससे आप वहीं डिबग कर सकते हैं, जो नारकीय रूप से सुविधाजनक है। सामान्य तौर पर, मैंने इसे चुना।

भी है कोडविज़न एवीआर सीएक बहुत ही लोकप्रिय कंपाइलर है। यह अपनी सादगी के कारण लोकप्रिय हुआ। कार्यक्रमआप इसे कुछ ही मिनटों में प्राप्त कर सकते हैं - स्टार्ट कोड विजार्ड इसमें बहुत योगदान देता है, किसी भी यूर्ट्स को इनिशियलाइज़ करने के लिए मानकों पर मुहर लगाता है। ईमानदार होने के लिए, मैं किसी तरह उसके साथ संदेह के साथ व्यवहार करता हूं - एक बार मुझे इस संकलक द्वारा लिखे गए एक कार्यक्रम को अलग करना पड़ा, किसी प्रकार का दलिया और कोड नहीं निकला। अनावश्यक इशारों और संचालन की एक भयानक मात्रा, जिसके परिणामस्वरूप बड़ी मात्रा में कोड और धीमा प्रदर्शन हुआ। हालांकि, शायद मूल फर्मवेयर लेखक के डीएनए में कोई त्रुटि थी। इसके अलावा वह पैसा चाहता है। IAR जितना नहीं, लेकिन ध्यान देने योग्य। और डेमो मोड में यह आपको 2kb से अधिक कोड लिखने की अनुमति नहीं देता है।
बेशक एक दरार है, लेकिन अगर आप चोरी करते हैं, तो एक लाख, आईएआर के अर्थ में :)

माइक्रो कंप्यूटर, माइक्रोप्रोसेसर और माइक्रोकंट्रोलर में क्या अंतर है?

इस प्रकार, सभी माइक्रोकंट्रोलर माइक्रो कंप्यूटर हैं, लेकिन सभी माइक्रो कंप्यूटर माइक्रोकंट्रोलर का उपयोग नहीं करते हैं। छोटे एम्बेडेड सिस्टम अक्सर माइक्रोप्रोसेसर डिज़ाइन के बजाय माइक्रोकंट्रोलर का उपयोग करते हैं क्योंकि माइक्रोकंट्रोलर सबसे कॉम्पैक्ट डिज़ाइन और सबसे कम हार्डवेयर लागत प्रदान करते हैं। दूसरी ओर, बड़े एम्बेडेड सिस्टम एक या अधिक माइक्रोप्रोसेसरों का उपयोग कर सकते हैं यदि उपयुक्त गति और कार्यक्षमता का माइक्रोकंट्रोलर नहीं मिल सकता है।

वहाँ भी छवि शिल्प एवीआर सीतथा माइक्रोसीमाइक्रोइलेक्ट्रॉनिक से। या तो उपयोग नहीं करना पड़ा, लेकिन ... एसडब्ल्यूजीबहुत बहुत नमन माइक्रोपास्कल, वे कहते हैं, एक बहुत ही सुविधाजनक प्रोग्रामिंग वातावरण और पुस्तकालय। मुझे लगता है कि माइक्रोसी खराब नहीं होगी, बल्कि भुगतान भी करेगी।

जैसा मैंने कहा, मैंने चुना विनएवीआरतीन कारणों से: नि: शुल्क, यह एवीआर स्टूडियो में एकीकृत होता है और सभी अवसरों के लिए इसके लिए तैयार कोड का एक गुच्छा लिखा जाता है।

एक जटिल एम्बेडेड सिस्टम में माइक्रोप्रोसेसर और माइक्रोकंट्रोलर दोनों को शामिल करना भी संभव है। बजट, उपलब्धता, समय, उपकरण आदि की बाधाओं को देखते हुए, कार्य के लिए जो भी उपकरण उपयुक्त है, उसका उपयोग करने के लिए एकमात्र वास्तविक नियम हैं।

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

तो WinAVR के साथ और AVR स्टूडियो डाउनलोड करें। इसके बाद, स्टूडियो को पहले स्थापित किया जाता है, फिर, ऊपर से, WinAVR रोल अप होता है और प्लग-इन के रूप में स्टूडियो से चिपक जाता है। मैं दृढ़ता से अनुशंसा करता हूं कि WinAVR को एक छोटे रास्ते पर रखा जाए, C:\WinAVR जैसा कुछ, इस प्रकार आप पथ के साथ बहुत सारी समस्याओं से बचेंगे।

परियोजना निर्माण
तो, स्टूडियो स्थापित किया गया है, सी खराब हो गया है, यह कुछ प्रोग्राम करने का प्रयास करने का समय है। आइए सरल, सबसे सरल से शुरू करें। स्टूडियो चलाएँ, वहाँ AVR GCC कंपाइलर के रूप में एक नया प्रोजेक्ट चुनें और प्रोजेक्ट का नाम दर्ज करें।

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

कार्यक्षेत्र एक खाली *.c फ़ाइल के साथ खुलता है।

अब स्टूडियो के बुकमार्क में पथों के प्रदर्शन को कॉन्फ़िगर करने में कोई दिक्कत नहीं है। ऐसा करने के लिए, यहां जाएं:
मेनू टूल्स - विकल्प - सामान्य - फाइलटैब्स और ड्रॉप-डाउन सूची से "केवल फ़ाइल नाम" चुनें। अन्यथा, काम करना असंभव होगा - टैब पर होगा पूरा रास्ताफ़ाइल और स्क्रीन पर दो या तीन से अधिक टैब नहीं होंगे।

इन ट्यूटोरियल्स में माइक्रोकंट्रोलर के किन परिवारों का उपयोग किया जाता है?

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

इन ट्यूटोरियल्स के लिए और क्या चाहिए?

जब परीक्षण उपकरण की बात आती है, तो डीएमएम वास्तव में सस्ते होते हैं और एक नहीं होने का कोई बहाना नहीं होता है। उपकरण का एक और टुकड़ा जो किसी भी एम्बेडेड इंजीनियर के पास होना चाहिए वह एक सभ्य आस्टसीलस्कप है। घबराएं नहीं, इन ट्यूटोरियल्स के लिए किसी वॉल्यूम की आवश्यकता नहीं है।

परियोजना सेटअप
सामान्य तौर पर, एक मेक फ़ाइल बनाना क्लासिक माना जाता है जिसमें सभी निर्भरताओं का वर्णन किया जाएगा। और यह शायद सही है। लेकिन मेरे लिए, जो पूरी तरह से एकीकृत आईडीई के साथ पले-बढ़े हैं जैसे यूविज़नया एवीआर स्टूडियोयह दृष्टिकोण गहरा विदेशी है। इसलिए, मैं इसे अपने तरीके से, स्टूडियो के हर तरीके से करूंगा।

गियर बटन पर क्लिक करें।

बिल्ट-इन प्रोग्राम कैसे काम करता है?

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



ये आपके प्रोजेक्ट के लिए सेटिंग्स हैं, या बल्कि, मेक फ़ाइल की स्वचालित पीढ़ी के लिए सेटिंग्स हैं। पहले पृष्ठ पर, आपको बस उस आवृत्ति को दर्ज करना होगा जिस पर आपका एमके काम करेगा। यह फ्यूज बिट्स पर निर्भर करता है, इसलिए हम मानते हैं कि आवृत्ति 8000000Hz है।
ऑप्टिमाइज़ेशन लाइन पर भी ध्यान दें। अब -Os साइज ऑप्टिमाइजेशन है। इसे अभी के लिए छोड़ दें, फिर आप इस पैरामीटर के साथ खेलने का प्रयास कर सकते हैं। -O0 कोई अनुकूलन नहीं है।

पहले मामले में, आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपका प्रोग्राम निर्दिष्ट ऑटोलैड पते पर लोड किया गया है, और दूसरे मामले में, आप अपना प्रोग्राम लोड करेंगे जहां प्रोग्राम मेमोरी कंट्रोलर एड्रेस स्पेस में स्थित थी, और आपको इसकी आवश्यकता होगी सुनिश्चित करें कि आप उस स्टार्टअप पते को रीसेट एड्रेस वेक्टर में लोड करते हैं।

कृपया ध्यान दें कि लॉन्च विधि का चुनाव आप पर निर्भर नहीं है, लेकिन आपके चुने हुए माइक्रोस्कोप की परियोजना में बनाया जाएगा। जब तैनात किया जा रहा कार्यक्रम चलना शुरू होता है, तो आमतौर पर कार्यक्रम शुरू होने से पहले पर्याप्त आरंभीकरण और हाउसकीपिंग की जाती है। इस इनिशियलाइज़ेशन में से अधिकांश कुछ ऐसा है जो औसत डेस्कटॉप प्रोग्रामर कभी नहीं देखता है क्योंकि इसे कंप्यूटर के बूट कोड और ऑपरेटिंग सिस्टम द्वारा नियंत्रित किया जाता है। लेकिन एक एम्बेडेड सिस्टम में, यह संभावना है कि कोई ऑपरेटिंग सिस्टम नहीं है, और सभी बूट कोड और अन्य स्टार्टअप कोड स्पष्ट रूप से प्रदान किए जाने चाहिए।

अगला कदम पथ स्थापित करना है। सबसे पहले, वहां अपनी परियोजना की निर्देशिका जोड़ें - आप वहां तीसरे पक्ष के पुस्तकालय रखेंगे। पथ ".\" सूची में दिखाई देगा

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



अभी के लिए इतना ही। हर जगह ओके पर क्लिक करें और सोर्स पर जाएं।

प्रोग्रामिंग के लिए प्रोग्रामिंग भाषा और विकास वातावरण चुनना

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

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

यह इस तरह काम करेगा:
जब कोई इकाई COM पोर्ट (कोड 0x31) पर आती है, तो हम डायोड चालू कर देंगे, और जब शून्य आ जाएगा (कोड 0x30), तो हम इसे बुझा देंगे। इसके अलावा, सब कुछ इंटरप्ट पर किया जाएगा, और पृष्ठभूमि कार्य एक और डायोड का पलक झपकना होगा। सरल और अर्थपूर्ण।

वहां कौन से माइक्रोकंट्रोलर हैं?

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

योजना को इकट्ठा करना
हमें USB-USART कनवर्टर मॉड्यूल को माइक्रोकंट्रोलर के USART पिन से कनेक्ट करने की आवश्यकता है। ऐसा करने के लिए, हम दो तारों का एक जम्पर लेते हैं और उन्हें पिन पर क्रॉसवाइज लगाते हैं। यानी, हम कंट्रोलर के Rx को कन्वर्टर के Tx से और कन्वर्टर के Tx को कंट्रोलर के Rx से कनेक्ट करते हैं।

यह पता चला है, अंत में, यह योजना है:



मैं शेष आउटपुट, बिजली की आपूर्ति, रीसेट को जोड़ने पर विचार नहीं करता, यह मानक है

नमूना कार्यक्रमों के बारे में एक नोट

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

हालाँकि, 4-बिट मोड भी हमारी अधिकांश ज़रूरतों को पूरा करने के लिए तेज़ और सटीक है, साथ ही इसके लिए केवल 7 पिन की आवश्यकता होती है। इसलिए, हम 4-बिट मोड में काम करेंगे। ऐसा करने के लिए, आप निम्न आरेख का उल्लेख कर सकते हैं। इसे ऊपर दिए गए पिन कॉन्फ़िगरेशन के लिए देखें।

हम कोड लिखते हैं

मैं तुरंत आरक्षण कर दूंगा कि मैं विशेष रूप से सी भाषा के विवरण में विशेष रूप से तल्लीन नहीं करूंगा। ऐसा करने के लिए, K&R से लेकर विभिन्न मैनुअल तक क्लासिक "C प्रोग्रामिंग लैंग्वेज" से लेकर सामग्री की एक बड़ी मात्रा है।

ऐसा ही एक तरीका मेरे स्टाॅश में मिला, मैंने एक बार इस भाषा का प्रयोग करके इसका अध्ययन किया था। सब कुछ छोटा, स्पष्ट और बिंदु तक है। मैं इसे धीरे-धीरे टाइप कर रहा हूं और इसे अपनी साइट पर खींच रहा हूं।

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

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

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

यह सच है कि अभी तक सभी अध्यायों को वहां स्थानांतरित नहीं किया गया है, लेकिन मुझे लगता है कि यह लंबे समय तक नहीं है।

यह संभावना नहीं है कि मैं इसका बेहतर वर्णन करूंगा, इसलिए, प्रशिक्षण पाठ्यक्रम से, सीश की पेचीदगियों के विस्तृत विवरण के बजाय, मैं इस मैनुअल के अलग-अलग पृष्ठों के सीधे लिंक दूंगा।

पुस्तकालयों को जोड़ना।
सबसे पहले, हम जोड़ते हैं आवश्यक पुस्तकालयऔर परिभाषाओं के साथ शीर्षक। आखिरकार, सी एक सार्वभौमिक भाषा है और इसे समझाया जाना चाहिए कि हम एवीआर के साथ काम कर रहे हैं, इसलिए स्रोत कोड में लाइन दर्ज करें:

1 #शामिल

यह फ़ाइल फ़ोल्डर में स्थित है विनएवीआरऔर इसमें नियंत्रक के सभी रजिस्टरों और बंदरगाहों का विवरण होता है। और वहां सब कुछ मुश्किल है, एक विशिष्ट नियंत्रक के संदर्भ में, जिसे संकलक द्वारा प्रेषित किया जाता है बनानापैरामीटर में फ़ाइल एमसीयूऔर इस चर के आधार पर, इस विशेष नियंत्रक के लिए सभी बंदरगाहों और रजिस्टरों के पते के विवरण के साथ एक हेडर फ़ाइल आपके प्रोजेक्ट से जुड़ी हुई है। कैसे! इसके बिना, आप भी कर सकते हैं, लेकिन तब आप SREG या UDR जैसे प्रतीकात्मक रजिस्टर नामों का उपयोग नहीं कर पाएंगे, और आपको "0xC1" जैसे प्रत्येक का पता याद रखना होगा, और यह आपके सिर को तोड़ रहा है।

वही टीम #शामिल<имя файла> आपको अपने प्रोजेक्ट में किसी भी टेक्स्ट फ़ाइल की सामग्री जोड़ने की अनुमति देता है, उदाहरण के लिए, फ़ंक्शन के विवरण वाली फ़ाइल या अन्य कोड का एक टुकड़ा। और ताकि निर्देश इस फ़ाइल को ढूंढ सके, हमने अपनी परियोजना के पथों को इंगित किया (WinAVR निर्देशिका पहले से ही डिफ़ॉल्ट रूप से पंजीकृत है)।

मुख्य कार्य।
ए सी कार्यक्रम सभी कार्यों के बारे में है। उन्हें नेस्टेड किया जा सकता है और किसी भी क्रम में एक दूसरे से बुलाया जा सकता है और विभिन्न तरीके. प्रत्येक फ़ंक्शन में तीन आवश्यक पैरामीटर होते हैं:

  • वापसी मूल्य, उदाहरण के लिए, पाप (एक्स) x की ज्या का मान लौटाता है। जैसा कि गणित में, संक्षेप में।
  • स्थानांतरित पैरामीटर, वही x.
  • फंक्शन बॉडी।

पारित और लौटाए गए सभी मान डेटा के आधार पर किसी न किसी प्रकार के होने चाहिए।

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

1 2 3 4 5 int मुख्य (शून्य) (वापसी 0;)

सब, पहले सबसे सरल कार्यक्रमलिखा, इससे कोई फर्क नहीं पड़ता कि यह कुछ नहीं करता है, हमने अभी शुरुआत की है।

आइए देखें कि हमने क्या किया।
पूर्णांकवह डेटा प्रकार है जो मुख्य फ़ंक्शन देता है।

बेशक, माइक्रोकंट्रोलर में मुख्यसिद्धांत रूप में, कुछ भी वापस नहीं किया जा सकता है, और सिद्धांत रूप में यह होना चाहिए शून्य मुख्य (शून्य), लेकिन जीसीसी मूल रूप से पीसी पर तेज किया गया है और वहां कार्यक्रम मूल्य वापस कर सकता है ऑपरेटिंग सिस्टमपूरा होने पर। इसलिए जीसीसी चालू शून्य मुख्य (शून्य)चेतावनी की कसम।

यह कोई गलती नहीं है, यह काम करेगा, लेकिन मुझे चेतावनियां पसंद नहीं हैं।

शून्ययह उस प्रकार का डेटा है जिसे हम फ़ंक्शन में पास कर रहे हैं, इस मामले में मुख्यबाहर से कुछ भी स्वीकार नहीं कर सकता कवि शून्य- खाली। एक स्टब का उपयोग तब किया जाता है जब कुछ भी पारित करने या वापस करने की आवश्यकता नहीं होती है।

ये हैं { } घुंघराले कोष्ठक एक प्रोग्राम ब्लॉक है, इस मामले में फ़ंक्शन का मुख्य भाग मुख्य, कोड वहां स्थित होगा।

वापसी- यह रिटर्न वैल्यू है जो मुख्य फ़ंक्शन पूरा होने पर देगा, क्योंकि हमारे पास एक इंट, यानी एक नंबर है, तो हमें एक नंबर वापस करना होगा। हालांकि यह अभी भी समझ में नहीं आता है, क्योंकि। मुख्य से माइक्रोकंट्रोलर पर, हम केवल कहीं नहीं जा सकते। मैं शून्य लौटता हूं। नेफिग के लिए। और संकलक आमतौर पर स्मार्ट होता है और इस मामले के लिए कोड उत्पन्न नहीं करता है।
हालांकि, अगर विकृत है, तो से मुख्यआप एमके पर जा सकते हैं - उदाहरण के लिए, बूटलोडर अनुभाग में गिरें और इसे निष्पादित करें, लेकिन यहां आपको संक्रमण पते को सही करने के लिए फर्मवेयर के निम्न-स्तरीय चयन की आवश्यकता होगी। नीचे आप देखेंगे और समझेंगे कि यह कैसे करना है। किस लिए? अब यह एक और सवाल है, 99.999% मामलों में यह आवश्यक नहीं है :)

हो गया, आगे बढ़ो। आइए एक वेरिएबल जोड़ें, हमें वास्तव में इसकी आवश्यकता नहीं है और हमें इसके बिना वेरिएबल का परिचय नहीं देना चाहिए, लेकिन हम सीख रहे हैं। यदि फंक्शन बॉडी के अंदर वेरिएबल्स जोड़े जाते हैं, तो वे स्थानीय होते हैं और केवल इस फंक्शन में मौजूद होते हैं। जब आप फ़ंक्शन से बाहर निकलते हैं, तो ये चर हटा दिए जाते हैं, और रैम मेमोरी अधिक महत्वपूर्ण आवश्यकताओं के लिए दी जाती है। .

1 2 3 4 5 6 int मुख्य (शून्य) (अहस्ताक्षरित चार मैं; ​​वापसी 0;)

अहस्ताक्षरितमतलब अहस्ताक्षरित। तथ्य यह है कि द्विआधारी प्रतिनिधित्व में, उच्च बिट को साइन को सौंपा गया है, जिसका अर्थ है कि संख्या +127/-128 एक बाइट (चार) में फिट होती है, लेकिन अगर साइन को छोड़ दिया जाता है, तो यह 0 से 255 तक फिट होगा। आमतौर पर संकेत की आवश्यकता नहीं होती है। ताकि अहस्ताक्षरित.
मैंसिर्फ एक परिवर्तनीय नाम है। अब और नहीं।

अब हमें बंदरगाहों को इनिशियलाइज़ करना होगा और यूएआरटी. बेशक, आप लाइब्रेरी ले सकते हैं और कनेक्ट कर सकते हैं और किसी प्रकार के UartInit (9600) को कॉल कर सकते हैं; लेकिन तब आप नहीं जान पाएंगे कि वास्तव में क्या हुआ था।

हम यह करते हैं:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void) ( unsigned char i; #define XTAL 8000000L #define baudrate 9600L # परिभाषित करें बॉडडिवाइडर (XTAL/(16*baudrate)-1)# परिभाषित करें HI(x) ((x)>>8) # परिभाषित करें LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI (बॉडडिवाइडर); यूसीएसआरए = 0; यूसीएसआरबी = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

डरावना? वास्तव में, वास्तविक कोड की केवल पाँच अंतिम पंक्तियाँ हैं। सबकुछ वह #परिभाषित करनायह एक प्रीप्रोसेसर मैक्रो भाषा है। लगभग असेंबलर के समान ही सबसे ऊपर है, लेकिन सिंटैक्स कुछ अलग है।

वे आवश्यक गुणांकों की गणना के लिए आपके नियमित संचालन की सुविधा प्रदान करेंगे। पहली पंक्ति में हम कहते हैं कि के बजाय XTALआप सुरक्षित रूप से 8000000 स्थानापन्न कर सकते हैं, और ली- संकेत टाइप करें, वे कहते हैं कि प्रोसेसर की घड़ी की आवृत्ति लंबी है। वैसा ही बॉड दर- UART के माध्यम से डेटा ट्रांसफर की आवृत्ति।

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

तो जो कुछ भी किया गया है वह ऐसा है #परिभाषित करनाआप इसे सुरक्षित रूप से फेंक सकते हैं, और कैलकुलेटर पर आवश्यक संख्याओं की गणना कर सकते हैं और तुरंत उन्हें यूबीबीआरएल = ... की पंक्तियों में दर्ज कर सकते हैं। और यूबीबीआरएच=…..

कर सकना। परंतु! इसे करें कड़ाई से असंभव!

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

तब सब कुछ सरल है:
ये सभी "यूबीआरएलएल एंड कंपनी" यूएआरटी ट्रांसमीटर के कॉन्फ़िगरेशन रजिस्टर हैं जिनके साथ हम दुनिया के साथ संवाद करेंगे। और अब हमने उन्हें वांछित गति और वांछित मोड पर सेट करते हुए, उन्हें आवश्यक मान दिए हैं।

प्रविष्टि देखें 1<निम्नलिखित का अर्थ है: 1 लेकर उसके स्थान पर रख दें RXENएक बाइट में। RXENयह रजिस्टर का चौथा बिट है यूसीएसआरबी, इसलिए 1<बाइनरी नंबर 00010000 बनाता है, TXENतीसरा बिट है, और 1< 00001000 देगा। एक सिंगल "|" यह बिटवाइज़ है या, तो 00010000 | 00001000 = 00011000। इसी तरह, शेष आवश्यक कॉन्फ़िगरेशन बिट्स को सामान्य ढेर में सेट और जोड़ा जाता है। परिणामस्वरूप, एकत्रित संख्या UCSRB को लिखी जाती है। इसे USART अनुभाग में MK पर डेटाशीट में अधिक विस्तार से वर्णित किया गया है। इसलिए तकनीकी विवरणों से विचलित न हों।

हो गया, क्या होता है यह देखने का समय है। संकलन पर क्लिक करें और अनुकरण शुरू करें (Ctrl+F7)।

डिबगिंग
सभी प्रकार की प्रगति सलाखों के माध्यम से चला गया, स्टूडियो बदल गया और मुख्य समारोह के प्रवेश द्वार के पास एक पीला तीर दिखाई दिया। यह वह जगह है जहां प्रोसेसर वर्तमान में है और सिमुलेशन रोक दिया गया है।

तथ्य यह है कि शुरू में, वास्तव में, यह UBRRL = LO(bauddivider) लाइन पर था; आखिरकार, हमारे पास जो परिभाषित है वह कोड नहीं है, बल्कि केवल प्रारंभिक गणना है, इसलिए सिम्युलेटर थोड़ा सुस्त है। लेकिन अब उसे एहसास हुआ कि पहला निर्देश पूरा हुआ और अगर आप एक पेड़ पर चढ़ गए आई/ओ व्यू, USART सेक्शन में जाएं और वहां UBBRL बाइट देखें, आप देखेंगे कि वहां पहले से ही एक वैल्यू है! 0x33.

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

प्रारंभिक
अब सिमुलेशन को शून्य पर रीसेट करें। वहां क्लिक करें रीसेट (Shift+F5). डिसबैलेंस्ड लिस्टिंग खोलें, अब आप देखेंगे कि कंट्रोलर में वास्तव में क्या हो रहा है। देखें -> जुदा करनेवाला. और YYAAAAA नहीं !!! असेंबलर !!! भयंकर!!! लेकिन तुम्हें चाहिए। ताकि बाद में, जब कुछ गलत हो जाए, तो आप कोड में बेवकूफ न बनें और मंचों पर फालतू के सवाल न पूछें, लेकिन तुरंत जिब्ल्स में आएं और देखें कि आपके पास प्लग कहां है। वहां कुछ भी भयानक नहीं है।

पहले श्रृंखला से शीर्ष होंगे:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A जंप +00000002: 940C0034 JMP 0x00000034 जंप +00000004: 940C0034 JMP 0x00000034 जंप +00000006: 940C0034 JMP 0x00000034 जंप +00000008: 940C0034 JMP 0x00000034 जंप +0000000A: 940C0034 JMP 0x000000C जंप +00000000 0000000E: 940C0034 JMP 0x00000034 जंप +00000010: 940C0034 JMP 0x00000034 जंप +00000012: 940C0034 JMP 0x00000034 जंप +00000014: 940C0034 JMP 0x00000034 जंप +00000016: 940C0034 JMP 0x00000034 जंप +00000018: 940C0034 JMP 0x00000034 जंप +0000001A: : 940C0034 JMP 0x00000034 जंप +0000001E: 940C0034 JMP 0x00000034 जंप +00000020: 940C0034 JMP 0x00000034 जंप +00000022: 940C0034 JMP 0x00000034 जंप +00000024: 940C0034 JMP 0x00000034 जंप +00000026: 940C0034 JMP 0x00000034 जंप +00000034 JMP 0x00000034 जंप +00000034

यह इंटरप्ट वेक्टर टेबल है। हम इस पर बाद में लौटेंगे, अभी के लिए, बस देखें और याद रखें कि यह वहां है। पहला कॉलम फ्लैश सेल का पता है जिसमें कमांड स्थित है, दूसरा कमांड कोड है, तीसरा कमांड निमोनिक है, वही असेंबलर इंस्ट्रक्शन, कमांड का तीसरा ऑपरेंड है। ओह, और स्वचालित टिप्पणी।
तो देखा जाए तो लगातार ट्रांजिशन हो रहे हैं। और JMP कमांड कोड चार बाइट्स है, इसमें पीछे की ओर लिखा गया जंप एड्रेस होता है - लो एड्रेस पर लो बाइट और जंप कमांड कोड 940C

0x3F को पता करने के लिए यह शून्य लिखें। यदि आप I / O व्यू कॉलम में देखते हैं, तो आप देखेंगे कि पता 0x3F SREG रजिस्टर का पता है - नियंत्रक का ध्वज रजिस्टर। वे। हम प्रोग्राम को शून्य स्थितियों में चलाने के लिए SREG को रीसेट करते हैं।

यहां, वास्तव में, मुख्य कार्य के लिए एक संक्रमण है। और तीन आदेशों के बाद, मुख्य बस शुरू होता है। और संक्रमण कॉल के माध्यम से जाता है, स्टैक पर पते को सहेजता है। उसी समय, RAM के दो बाइट्स औसत दर्जे के होते हैं, और उनमें से केवल 1024 होते हैं। =) Nizachot! हालाँकि, कुछ मुझे बताता है कि मुख्य की घोषणा as इनलाइन इंट मेन (शून्य)इस समस्या का समाधान करेंगे, लेकिन कोशिश नहीं की है। आप खुद चेक कर सकते हैं।

यह अप्रत्याशित परिस्थितियों के मामले में है, जैसे कि मुख्य कार्य से बाहर निकलना। नियंत्रक को ऐसे लूप से या तो हार्डवेयर रीसेट द्वारा, या, अधिक संभावना है, वॉचडॉग से रीसेट द्वारा लाया जा सकता है। ठीक है, या, जैसा कि मैंने ऊपर कहा, इन स्थानों को हेक्स संपादक में ठीक करें और जहां चाहें सवारी करें। यह भी ध्यान दें कि JMP और RJMP दो प्रकार के होते हैं, पहला एक पते पर सीधी छलांग है। यह चार बाइट्स लेता है और पूरे मेमोरी क्षेत्र पर सीधी छलांग लगा सकता है। दूसरे प्रकार का संक्रमण - आरजेएमपी - सापेक्ष है। उसका आदेश दो बाइट्स लेता है, लेकिन वह वर्तमान स्थिति (पता) से 1024 कदम आगे या पीछे कूदता है। और इसके पैरामीटर वर्तमान बिंदु से ऑफसेट को इंगित करते हैं। अधिक बार उपयोग किया जाता है, टीके। फ्लैश में आधा स्थान लेता है, और लंबे संक्रमणों की शायद ही कभी आवश्यकता होती है।

1 +00000034: 940C0000 JMP 0x00000000 जंप

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

मुख्य कार्य। सब कुछ वैसा ही है, आप वर्णन भी नहीं कर सकते। केवल रजिस्टरों में देखें, पहले से गणना की गई संख्या दर्ज की गई है। कंपाइलर प्रीप्रोसेसर चट्टानों !!! तो कोई "जादू" संख्या नहीं!

1 2 3 4 5 6 7 8 9 10 11 12 +00000036: E383 LDI R24,0x33 तत्काल लोड करें +00000037: B989 OUT 0x09, R24 आउट टू I/O लोकेशन 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 आउट टू I/O लोकेशन 16: UCSRA = 0; +00000039: B81B OUT 0x0B, R1 आउट टू I/O लोकेशन 17: UCSRB = 1<

और यहाँ जाम है:

1 2 3 +0000003E: E080 LDI R24,0x00 तत्काल लोड करें +0000003F: E090 LDI R25,0x00 तत्काल लोड करें +00000040: 9508 RET सबरूटीन वापसी

सवाल यह है कि कंपाइलर ऐसे टॉप क्यों जोड़ता है? और यह रिटर्न 0 से ज्यादा कुछ नहीं है, फिर हमने फ़ंक्शन को int main (void) के रूप में परिभाषित किया है, इसलिए हमने चार और बाइट्स को गड़बड़ कर दिया है, समझ में नहीं आता क्या :) और यदि आप void main (void) बनाते हैं तो केवल RET ही रहेगा, लेकिन एक चेतावनी दिखाई देगी, कि वे कहते हैं कि हमारा मुख्य कार्य कुछ भी वापस नहीं करता है। सामान्य तौर पर, आप जो चाहते हैं वह करें :)

कठिन? ऐसा लगता है कि नहीं है। डिस्सेबलर मोड में चरण-दर-चरण निष्पादन पर क्लिक करें और देखें कि प्रोसेसर व्यक्तिगत निर्देशों को कैसे निष्पादित करता है, जो रजिस्टरों के साथ होता है। कमांड और अंतिम लूपिंग के माध्यम से आंदोलन कैसा है।

एक दो दिन में जारी रहेगा...

ऊपर से:
एलेक्सी78मैंने फ़ायरफ़ॉक्स के लिए एक प्लगइन बनाया है जो मेरी साइट और फ़ोरम को नेविगेट करना आसान बनाता है।
चर्चा और डाउनलोड,

माइक्रोकंट्रोलर्स(इसके बाद हम बस उन्हें बुलाएंगे एमके) रेडियो के शौकीनों के बीच तेजी से लोकप्रिय हो रहे हैं। उनकी मदद से, आप लगभग कुछ भी इकट्ठा कर सकते हैं - संकेतक, वाल्टमीटर, घरेलू उपकरण (सुरक्षा उपकरण, स्विचिंग डिवाइस, थर्मामीटर ...), मेटल डिटेक्टर, विभिन्न खिलौने, रोबोट, आदि। लिस्ट बहुत लंबी हो सकती है...

इन लेखों में, हम तलाशने की कोशिश करेंगे एवीआर माइक्रोकंट्रोलरफर्मों एटीएमईएल, उनके साथ काम करना सीखें, फर्मवेयर प्रोग्रामों पर विचार करें, एक सरल और विश्वसनीय प्रोग्रामर बनाएं, फ़र्मवेयर प्रक्रिया पर विचार करें और, सबसे महत्वपूर्ण बात, जो समस्याएं उत्पन्न हो सकती हैं (और न केवल नौसिखिये के लिए).

AVR परिवार के माइक्रोकंट्रोलर के मुख्य पैरामीटर

microcontroller

फ्लैश मेमोरी

रैन्डम - एक्सेस मेमोरी

ईईपीरोम मेमोरी

आई/ओ पोर्ट

आप आपूर्ति करते हैं

एमके एवीआर मेगा के अतिरिक्त पैरामीटर:

ऑपरेटिंग तापमान: -55…+125*С
भंडारण तापमान: -65…+150*С
जीएनडी के सापेक्ष रीसेट पिन पर वोल्टेज: अधिकतम 13V
अधिकतम आपूर्ति वोल्टेज: 6.0V
अधिकतम I/O लाइन करंट: 40mA
पावर लाइन VCC और GND पर अधिकतम करंट: 200mA

ATmega 8X पिनआउट्स


ATmega48x, 88x, 168x मॉडल का पिनआउट





मॉडल के लिए पिन असाइनमेंट

ATmega16, 32x मॉडल के लिए पिनआउट


ATtiny2313 मॉडल के लिए पिन असाइनमेंट



लेख के अंत में, संलग्नक में है डाटा शीटकुछ माइक्रोकंट्रोलर के लिए

फ्यूज सेटिंग बिट्स एमके एवीआर

याद है क्रमादेशित फ्यूज 0 है, क्रमादेशित नहीं- 1. फ़्यूज़ सेट करते समय आपको सावधान रहना चाहिए, गलत तरीके से प्रोग्राम किया गया फ़्यूज़ माइक्रोकंट्रोलर को ब्लॉक कर सकता है। यदि आप सुनिश्चित नहीं हैं कि आपको किस फ़्यूज़ को प्रोग्राम करने की आवश्यकता है, तो पहली बार फ़्यूज़ के बिना एमके को फ्लैश करना बेहतर है।

रेडियो के शौकीनों के लिए सबसे लोकप्रिय माइक्रोकंट्रोलर हैं एटमेगा8, उसके बाद ATmega48, 16, 32, ATtiny2313 और अन्य। माइक्रोकंट्रोलर टीक्यूएफपी पैकेज और डीआईपी में बेचे जाते हैं, मेरा सुझाव है कि शुरुआती डीआईपी में खरीदारी करें। यदि आप TQFP खरीदते हैं, तो उन्हें फ्लैश करना अधिक समस्याग्रस्त होगा, आपको एक एडेप्टर खरीदना या बनाना होगा और बोर्ड को मिलाप करना होगा। उनके पैर एक दूसरे के बहुत करीब हैं। मैं डीआईपी पैकेज में माइक्रोकंट्रोलर को सलाह देता हूं, उन्हें विशेष पैनल (सॉकेट) पर रखें, यह सुविधाजनक और व्यावहारिक है, आपको एमके को मिलाप करने की ज़रूरत नहीं है यदि आप इसे फिर से भरना चाहते हैं, या इसे किसी अन्य डिज़ाइन के लिए उपयोग करना चाहते हैं।

लगभग सभी आधुनिक एमके के पास है आईएसपी इन-सर्किट प्रोग्रामिंग क्षमता, अर्थात। यदि आपका माइक्रोकंट्रोलर बोर्ड में मिलाप किया गया है, तो फर्मवेयर को बदलने के लिए हमें इसे बोर्ड से अनसोल्डर करने की आवश्यकता नहीं है।

प्रोग्रामिंग के लिए 6 पिन का उपयोग किया जाता है:

रीसेट- एमके इनपुट
वीसीसी- प्लस आपूर्ति, 3-5V, MK . पर निर्भर करती है
जीएनडी- कॉमन वायर, माइनस पावर।
मोसी- एमके इनपुट (एमके में सूचना संकेत)
मीसो- एमके आउटपुट (एमके से सूचना संकेत)
एससीके- एमके इनपुट (एमके में घड़ी संकेत)

कभी-कभी XTAL 1 और XTAL2 आउटपुट का भी उपयोग किया जाता है, क्वार्ट्ज इन आउटपुट से चिपक जाता है यदि MK बाहरी जनरेटर से काम करेगा, ATmega 64 और 128 में MOSI और MISO आउटपुट ISP प्रोग्रामिंग के लिए उपयोग नहीं किए जाते हैं, इसके बजाय MOSI आउटपुट से जुड़े होते हैं PE0 लेग, और MISO से PE1। माइक्रोकंट्रोलर को प्रोग्रामर से कनेक्ट करते समय, कनेक्टिंग वायर जितना संभव हो उतना छोटा होना चाहिए, और प्रोग्रामर से एलपीटी पोर्ट तक की केबल भी बहुत लंबी नहीं होनी चाहिए।

माइक्रोकंट्रोलर के अंकन में संख्याओं के साथ समझ से बाहर के अक्षर हो सकते हैं, उदाहरण के लिए, Atmega 8L 16PU, 8 16AU, 8A PU, आदि। अक्षर L का अर्थ है कि MK, L अक्षर के बिना MK की तुलना में कम वोल्टेज पर संचालित होता है, आमतौर पर 2.7V . हाइफ़न या स्पेस 16PU या 8AU के बाद की संख्याएँ थरथरानवाला की आंतरिक आवृत्ति को दर्शाती हैं जो कि MK में है। यदि फ़्यूज़ बाहरी क्वार्ट्ज से काम करने के लिए सेट हैं, तो क्वार्ट्ज को एक आवृत्ति पर सेट किया जाना चाहिए जो डेटाशीट के अनुसार अधिकतम से अधिक न हो, यह ATmega48/88/168 के लिए 20MHz और अन्य atmegas के लिए 16MHz है।

माइक्रोकंट्रोलर के नाम पर पहला अंक किलोबाइट में फ्लैश रॉम की मात्रा को दर्शाता है, उदाहरण के लिए, ATtiny15 - 1 Kb, ATtiny26 - 2 Kb, AT90S4414 - 4 Kb, Atmega8535 - 8 Kb, ATmega162 - 16Kb, ATmega32 - 32 Kb, ATmega6450 - 64Kb, Atmega128 - 128Kb।

कभी-कभी ऐसी योजनाएँ होती हैं जहाँ AT90S जैसे नामों वाले माइक्रोकंट्रोलर का उपयोग किया जाता है ... ये माइक्रोकंट्रोलर के पुराने मॉडल हैं, उनमें से कुछ को आधुनिक के साथ बदला जा सकता है, उदाहरण के लिए:

AT90S4433 - ATmega8
AT90S8515 - ATmega8515
AT90S8535 - ATmega8535
AT90S2313 - ATtiny2313
ATmega163 - ATmega16
ATmega161 - ATmega162
ATmega323 - ATmega32
ATmega103 - ATmega64/128

ATmega 8 में कई पावर पिन हैं, डिजिटल - VCC, GND और एनालॉग - AVCC, GND। एक मानक कनेक्शन में, लीड के दोनों जोड़े समानांतर में जुड़े होते हैं, अर्थात। साथ में। AVR माइक्रोकंट्रोलर्स को हाई वोल्टेज पसंद नहीं है, अगर बिजली की आपूर्ति 6 ​​वोल्ट से अधिक है, तो वे विफल हो सकते हैं। मैं आमतौर पर कम शक्ति वाले 5 वोल्ट वोल्टेज नियामक, KR142EN5 या 78L05 का उपयोग करता हूं। यदि आपूर्ति वोल्टेज बहुत कम है, तो एमके फ्लैश नहीं करेगा, कार्यक्रम शपथ लेगा और त्रुटियां देगा (उदाहरण के लिए -24 पोनीप्रोग में)।

हम इसे समाप्त कर देंगे, जबकि आप इंटरनेट पर अपनी पसंद का सर्किट चुन सकते हैं और उसका अध्ययन कर सकते हैं, आप उसी समय जाकर वांछित माइक्रोकंट्रोलर खरीद सकते हैं। अगला, हम एक सरल और विश्वसनीय प्रोग्रामर को इकट्ठा करेंगे, फ्लैशिंग के कार्यक्रमों से परिचित होंगे और कोशिश करेंगे फ्लैश एमके.