विषयसूची:

एवीआर असेंबलर ट्यूटोरियल 1: 5 कदम
एवीआर असेंबलर ट्यूटोरियल 1: 5 कदम

वीडियो: एवीआर असेंबलर ट्यूटोरियल 1: 5 कदम

वीडियो: एवीआर असेंबलर ट्यूटोरियल 1: 5 कदम
वीडियो: AVR Assembly Tutorial: Part 1 (Basic Commands) 2024, जुलाई
Anonim
एवीआर असेंबलर ट्यूटोरियल 1
एवीआर असेंबलर ट्यूटोरियल 1

मैंने Atmega328p के लिए असेंबली भाषा प्रोग्राम लिखने के तरीके पर ट्यूटोरियल की एक श्रृंखला लिखने का फैसला किया है जो कि Arduino में उपयोग किया जाने वाला माइक्रोकंट्रोलर है। अगर लोगों की दिलचस्पी बनी रहती है तो मैं एक हफ्ते में एक या दो बार बाहर निकालता रहूंगा जब तक कि मेरे पास खाली समय नहीं हो जाता है या फिर लोग उन्हें पढ़ना बंद कर देते हैं।

मैं आर्क लाइनक्स चला रहा हूं और मैं एक ब्रेडबोर्ड पर स्थापित एक atmega328p-pu पर काम कर रहा हूं। आप इसे मेरे जैसे ही कर सकते हैं या आप बस अपने कंप्यूटर में एक आर्डिनो प्लग कर सकते हैं और उस तरह से माइक्रोकंट्रोलर पर काम कर सकते हैं।

हम 328p के लिए प्रोग्राम लिखेंगे जैसे कि अधिकांश arduino में है, लेकिन आपको ध्यान देना चाहिए कि ये वही प्रोग्राम और तकनीक किसी भी Atmel माइक्रोकंट्रोलर के लिए भी काम करेंगे और बाद में (यदि कोई रुचि है) हम कुछ के साथ काम करेंगे अन्य भी। माइक्रोकंट्रोलर का विवरण Atmel डेटा शीट और इंस्ट्रक्शन सेट मैनुअल में पाया जा सकता है। मैं उन्हें इस निर्देश के साथ संलग्न कर रहा हूं।

यहां आपको इसकी आवश्यकता होगी:

1. एक ब्रेडबोर्ड

2. एक Arduino, या सिर्फ माइक्रोकंट्रोलर

3. लिनक्स चलाने वाला कंप्यूटर

4. git: git क्लोन https://github.com/Ro5bert/avra.git का उपयोग करते हुए avra असेंबलर या यदि आप ubuntu या डेबियन आधारित सिस्टम का उपयोग कर रहे हैं तो बस "sudo apt install avra" टाइप करें और आपको दोनों avr असेंबलर मिलेंगे और अवध। फिर भी, यदि आप जीथब का उपयोग करके नवीनतम संस्करण प्राप्त करते हैं तो आपको सभी आवश्यक फ़ाइलें भी मिल जाएंगी, दूसरे शब्दों में इसमें पहले से ही m328Pdef.inc और tn85def.inc फ़ाइलें हैं।

5. अवरूड

मेरे AVR असेंबलर ट्यूटोरियल का पूरा सेट यहां पाया जा सकता है:

चरण 1: एक परीक्षण बोर्ड का निर्माण

एक परीक्षण बोर्ड का निर्माण
एक परीक्षण बोर्ड का निर्माण

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

आप में से जो सहमत हैं, आप अपने arduino से माइक्रोकंट्रोलर को खींच सकते हैं और फिर यहां दिए गए निर्देशों का पालन करके "ब्रेडबोर्ड Arduino" का निर्माण शुरू कर सकते हैं:

तस्वीर में मैं अपना सेट अप दिखाता हूं जिसमें एक बड़े ब्रेडबोर्ड पर दो स्टैंडअलोन Atmega328p होते हैं (मैं अगले ट्यूटोरियल पर काम करते समय पिछले ट्यूटोरियल को वायर्ड और एक माइक्रोकंट्रोलर पर लोड करने में सक्षम होना चाहता हूं)। मेरे पास बिजली की आपूर्ति स्थापित है ताकि शीर्ष रेल 9V हो और अन्य सभी वोल्टेज नियामक से 5V हों। मैं चिप्स को प्रोग्राम करने के लिए FT232R ब्रेकआउट बोर्ड का भी उपयोग करता हूं। मैंने उन्हें खरीदा और उन पर बूटलोडर खुद डाल दिए, लेकिन अगर आपने सिर्फ एक Arduino में से एक को निकाला है तो यह पहले से ही ठीक है।

ध्यान दें कि यदि आप इसे ATtiny85 के साथ आजमा रहे हैं तो आप यहां स्पार्कफुन टिनी प्रोग्रामर प्राप्त कर सकते हैं: https://www.sparkfun.com/products/11801# और फिर इसे अपने कंप्यूटर पर यूएसबी पोर्ट में प्लग करें। आपको पहले Attiny85 पर एक बूटलोडर स्थापित करना होगा और सबसे आसान तरीका सिर्फ Arduino IDE का उपयोग करना है। हालाँकि, आपको फ़ाइल, और वरीयताओं पर क्लिक करना होगा, और फिर इस नए बोर्ड URL को जोड़ना होगा: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json जो होगा आपको बूटलोडर स्थापित करने में सक्षम बनाता है (यदि आपका ATtiny85 पहले से एक के साथ नहीं आया है।)

चरण 2: असेंबलर और एवरड्यूड स्थापित करें

अब आप इस ट्यूटोरियल के पहले चरण में दिए गए लिंक से असेंबलर और एवरड्यूड को डाउनलोड और इंस्टॉल कर सकते हैं। यह संभावना है कि यदि आप पहले से ही Arduino के साथ काम कर रहे हैं तो आपके पास पहले से ही avrdude स्थापित है।

आपके द्वारा एवरा स्थापित करने के बाद आप देखेंगे कि एक उपनिर्देशिका है जो इसके साथ आती है जिसे "स्रोत" कहा जाता है और उस निर्देशिका के अंदर फाइलों का एक समूह होता है। ये सभी माइक्रोकंट्रोलर हैं जिन्हें आप एवरा के साथ प्रोग्राम कर सकते हैं। आप तुरंत देखेंगे कि 328p के लिए कोई फ़ाइल नहीं है जिसका हम यहां उपयोग कर रहे हैं। मैंने एक संलग्न किया है। फ़ाइल को m328Pdef.inc कहा जाना चाहिए और आपको इसमें शामिल निर्देशिका या कहीं और अपनी पसंद के अंदर रखना चाहिए। हम इसे अपने विधानसभा भाषा कार्यक्रमों में शामिल करेंगे। यह सब डेटा शीट से माइक्रोकंट्रोलर नामों में से प्रत्येक रजिस्टर को देता है ताकि हमें उनके हेक्साडेसिमल नामों का उपयोग न करना पड़े। उपरोक्त शामिल फ़ाइल में "प्राग्मा निर्देश" शामिल हैं क्योंकि इसे सी और सी ++ प्रोग्रामिंग के लिए डिज़ाइन किया गया था। यदि आप असेंबलर को "प्रज्ञा निर्देश की अनदेखी" की शिकायतों को थूकते हुए देखकर थक जाते हैं, तो बस फ़ाइल में जाएं और #pragma से शुरू होने वाली सभी पंक्तियों को हटा दें या टिप्पणी करें

ठीक है, अब जब आपका माइक्रोकंट्रोलर तैयार है, आपका असेंबलर तैयार है, और आपका प्रोग्रामर तैयार है, तो हम अपना पहला प्रोग्राम लिख सकते हैं।

नोट: यदि आप ATmega328P के बजाय ATtiny85 का उपयोग कर रहे हैं तो आपको tn85def.inc नामक एक अलग फ़ाइल शामिल करने की आवश्यकता है। मैं इसे भी संलग्न करूंगा (ध्यान दें कि मुझे इसे tn85def.inc.txt कहना था ताकि इंस्ट्रक्शंस मुझे इसे अपलोड करने की अनुमति दें।) हालांकि, अगर आपको जीथब से एवरा असेंबलर मिला है, तो आपके पास पहले से ही ये दोनों फाइलें हैं। इसलिए मैं इसे प्राप्त करने और इसे स्वयं संकलित करने की सलाह देता हूं:गिट क्लोन

चरण 3: हैलो वर्ल्ड

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

पहले PB5 से एक एलईडी कनेक्ट करें (पिनआउट आरेख देखें) जिसे एक आर्डिनो पर डिजिटल आउट 13 भी कहा जाता है, एक 220 ओम रोकनेवाला के लिए, फिर GND को। अर्थात।

PB5 -- LED -- R (220 ओम) -- GND

अब प्रोग्राम लिखना है। अपना पसंदीदा टेक्स्ट एडिटर खोलें और "hello.asm" नाम की एक फाइल बनाएं।

नमस्ते

; एक एलईडी चालू करता है जो PB5 से जुड़ा है (डिजिटल आउट 13).include "./m328Pdef.inc" ldi r16, 0b00100000 DDRB, r16 आउट PortB, r16 प्रारंभ: rjmp प्रारंभ

उपरोक्त कोड है। हम इसे एक मिनट में लाइन-दर-लाइन देखेंगे, लेकिन पहले यह सुनिश्चित कर लें कि हम इसे आपके डिवाइस पर काम कर सकें।

फ़ाइल बनाने के बाद, टर्मिनल में आप इसे निम्नानुसार इकट्ठा करते हैं:

अवरा हैलो.asm

यह आपके कोड को इकट्ठा करेगा और hello.hex नामक एक फाइल बनाएगा जिसे हम इसे निम्नानुसार अपलोड कर सकते हैं:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev/ttyUSB0 -U फ्लैश:w:hello.hex

यदि आप ब्रेडबोर्ड arduino का उपयोग कर रहे हैं, तो आपको उपरोक्त कमांड को निष्पादित करने से ठीक पहले ब्रेडबोर्ड arduino पर रीसेट बटन को पुश करना होगा। ध्यान दें कि आपको सामने एक सूडो भी जोड़ना पड़ सकता है या इसे रूट के रूप में निष्पादित करना पड़ सकता है। यह भी ध्यान दें कि कुछ arduino (Arduino UNO की तरह) पर आपको शायद बिटरेट को -b 115200 और पोर्ट -P / dev / ttyACM0 में बदलना होगा (यदि आपको अमान्य डिवाइस हस्ताक्षर के बारे में avrdude से कोई त्रुटि मिलती है तो बस एक जोड़ें - एफ आदेश के लिए)

अगर सब कुछ वैसा ही काम करता है जैसा कि अब आपके पास एक एलईडी होगी….. "हैलो वर्ल्ड!"

यदि आप ATtiny85 का उपयोग कर रहे हैं तो avrdude कमांड होगी:

avrdude -p attiny85 -c usbtiny -U फ्लैश:w:hello.hex

चरण 4: Hello.asm लाइन-बाय-लाइन

इस परिचयात्मक ट्यूटोरियल को समाप्त करने के लिए हम hello.asm प्रोग्राम लाइन-बाय-लाइन देखेंगे कि यह कैसे काम करता है।

नमस्ते

; एक एलईडी चालू करता है जो PB5 से जुड़ा है (डिजिटल आउट 13)

अर्धविराम के बाद सब कुछ असेंबलर द्वारा अनदेखा कर दिया जाता है और इसलिए ये पहली दो पंक्तियां केवल "टिप्पणियां" हैं जो बताती हैं कि कार्यक्रम क्या करता है।

.include "./m328Pdef.inc"

यह लाइन असेंबलर को आपके द्वारा डाउनलोड की गई m328Pdef.inc फ़ाइल को शामिल करने के लिए कहती है। आप इसे समान फ़ाइलों की निर्देशिका में रखना चाहते हैं और फिर उपरोक्त पंक्ति को वहां इंगित करने के लिए बदल सकते हैं।

एलडीआई r16, 0b00100000

एलडीआई "लोड तत्काल" के लिए खड़ा है और इस मामले में असेंबलर को एक कामकाजी रजिस्टर, आर 16 लेने के लिए कहता है, और इस मामले में एक बाइनरी नंबर 0b00100000 लोड करता है। सामने 0b कहता है कि हमारा नंबर बाइनरी में है। अगर हम चाहते तो एक और आधार चुन सकते थे, जैसे कि हेक्साडेसिमल। उस स्थिति में हमारी संख्या 0x20 होती जो 0b00100000 के लिए हेक्साडेसिमल है। या हम 32 का प्रयोग कर सकते थे जो समान संख्या के लिए आधार 10 दशमलव है।

अभ्यास १: अपने कोड में उपरोक्त पंक्ति में संख्या को हेक्साडेसिमल और फिर दशमलव में बदलने का प्रयास करें और सत्यापित करें कि यह अभी भी प्रत्येक मामले में काम करता है।

पोर्ट और रजिस्टर के काम करने के तरीके के कारण बाइनरी का उपयोग करना सबसे सरल है। हम भविष्य के ट्यूटोरियल में atmega328p के बंदरगाहों और रजिस्टरों पर अधिक विस्तार से चर्चा करेंगे, लेकिन अभी के लिए मैं केवल यह बताऊंगा कि हम r16 को अपने "वर्किंग रजिस्टर" के रूप में उपयोग कर रहे हैं, जिसका अर्थ है कि हम इसे एक वेरिएबल के रूप में उपयोग करने जा रहे हैं जिसे हम स्टोर करते हैं। नंबर इन। एक "रजिस्टर" 8 बिट्स का एक सेट है। मतलब 8 स्पॉट जो या तो 0 या 1 ('ऑफ' या 'ऑन') हो सकते हैं। जब हम उपरोक्त लाइन का उपयोग करके बाइनरी नंबर 0b00100000 को रजिस्टर में लोड करते हैं तो हमने बस उस नंबर को रजिस्टर r16 में स्टोर कर लिया है।

डीडीआरबी से बाहर, r16

यह लाइन कंपाइलर को रजिस्टर r16 की सामग्री को DDRB रजिस्टर में कॉपी करने के लिए कहती है। डीडीआरबी का अर्थ है "डेटा डायरेक्शन रजिस्टर बी" और यह पोर्टबी पर "पिन" सेट करता है। 328p के लिए पिनआउट मानचित्र पर आप देख सकते हैं कि PB0, PB1, …, PB7 लेबल वाले 8 पिन हैं। ये पिन "पोर्टबी" के "बिट्स" का प्रतिनिधित्व करते हैं और जब हम डीडीआरबी रजिस्टर में बाइनरी नंबर 00100000 लोड करते हैं तो हम कह रहे हैं कि हम पीबी0, पीबी1, पीबी2, पीबी3, पीबी4, पीबी6, और पीबी7 को इनपुट पिन के रूप में सेट करना चाहते हैं क्योंकि उनके पास है उनमें 0 है, और PB5 एक OUTPUT पिन के रूप में सेट है क्योंकि हम उस स्थान पर 1 डालते हैं।

पोर्टबी, r16. से बाहर

अब जब हमने पिनों की दिशा तय कर ली है तो अब हम उन पर वोल्टेज सेट कर सकते हैं। उपरोक्त लाइन हमारे स्टोरेज रजिस्टर r16 से पोर्टबी में उसी बाइनरी नंबर को कॉपी करती है। यह सभी पिनों को 0 वोल्ट पर सेट करता है सिवाय पिन PB5 से हाई जो कि 5 वोल्ट है।

अभ्यास 2: एक डिजिटल मल्टीमीटर लें, ब्लैक लेड को ग्राउंड (GND) में प्लग करें और फिर लाल लीड के साथ PB7 से PB7 तक प्रत्येक पिन का परीक्षण करें। क्या प्रत्येक पिन पर वोल्टेज पोर्टबी में 0b00100000 डालने के अनुरूप है? यदि कोई हैं जो नहीं हैं, तो आपको ऐसा क्यों लगता है? (पिन मैप देखें)

शुरू:

आरजेएमपी स्टार्ट

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

अभ्यास ३: अपने कोड से उपरोक्त दो पंक्तियों को हटा दें ताकि कार्यक्रम एक चट्टान से गिर जाए। क्या होता है? आपको कुछ ऐसा दिखना चाहिए जो Arduino द्वारा उनके "हैलो वर्ल्ड!" के रूप में उपयोग किए जाने वाले पारंपरिक "ब्लिंक" प्रोग्राम जैसा दिखता हो। आपको क्यों लगता है कि यह इस तरह से कार्य करता है? (इस बारे में सोचें कि क्या होना चाहिए जब कार्यक्रम एक चट्टान से गिर जाए…)

चरण 5: निष्कर्ष

अगर आप यहां तक पहुंच गए हैं तो बधाई हो! अब आप असेंबली कोड लिखने, उसे असेंबल करने और अपने माइक्रोकंट्रोलर पर लोड करने में सक्षम हैं।

इस ट्यूटोरियल में आपने निम्न कमांड का उपयोग करना सीखा है:

ldi hregister, संख्या एक संख्या (0-255) को ऊपरी आधे रजिस्टर (16-31) में लोड करती है

ioregister से बाहर, रजिस्टर एक कार्यशील रजिस्टर से I/O रजिस्टर में एक नंबर कॉपी करता है

rjmp लेबल "लेबल" द्वारा लेबल किए गए प्रोग्राम की लाइन पर कूदता है (जो 204 निर्देशों से अधिक दूर नहीं हो सकता - यानी सापेक्ष कूद)

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

मुझे आशा है कि आपको यह परिचयात्मक ट्यूटोरियल अच्छा लगा होगा। अगले ट्यूटोरियल में हम एक और सर्किट कंपोनेंट (एक बटन) जोड़ेंगे और इनपुट पोर्ट और निर्णयों को शामिल करने के लिए अपने कोड का विस्तार करेंगे।

सिफारिश की: