विषयसूची:

AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल: 6 कदम (चित्रों के साथ)
AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल: 6 कदम (चित्रों के साथ)

वीडियो: AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल: 6 कदम (चित्रों के साथ)

वीडियो: AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल: 6 कदम (चित्रों के साथ)
वीडियो: Nesting "If Statements" Is Bad. Do This Instead. 2024, नवंबर
Anonim
AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल।
AVRSH: Arduino/AVR के लिए एक कमांड इंटरप्रेटर शेल।

कभी अपने AVR माइक्रोकंट्रोलर में "लॉग इन" होना चाहते हैं? कभी सोचा है कि इसकी सामग्री को देखने के लिए एक रजिस्टर को "बिल्ली" करना अच्छा होगा? क्या आप हमेशा अपने AVR या Arduino के अलग-अलग पेरिफेरल सब-सिस्टम को *रियल टाइम* में पावर अप और पावर डाउन करने का तरीका चाहते हैं? मैं भी, इसलिए मैंने AVR शेल, UNIX जैसा शेल लिखा। यह यूनिक्स जैसा है क्योंकि यह उस शेल खाते की याद दिलाता है जिसे आपने बाहर जाकर अपने आईआरसी निक टकराव बॉट को चलाने के लिए खरीदा था, साथ ही साथ एक या दो कमांड भी थे। इसमें एक फाइल सिस्टम भी है जो बाहरी EEPROM का उपयोग करते हुए UNIX extfs जैसा दिखता है, लेकिन यह अपने आप में एक प्रोजेक्ट बन गया है, इसलिए मैं उस मॉड्यूल को एक अलग निर्देश के तहत अलग से जारी करूंगा जब यह उत्पादन के लिए तैयार हो। यहां उन चीजों की सूची दी गई है जो आप वर्तमान में AVR शेल के साथ कर सकते हैं:

  • रीयल-टाइम में अपने सभी डेटा डायरेक्शन रजिस्टर (DDRn), पोर्ट और पिन पढ़ें
  • अपने सभी डीडीआरएन, पोर्ट और पिन को मोटर, एलईडी चालू करने या रीयल-टाइम में सेंसर पढ़ने के लिए लिखें
  • सिस्टम पर सभी ज्ञात रजिस्टरों की सूची बनाएं
  • EEPROM द्वारा समर्थित उपयोगकर्ता-परिभाषित चरों में मान बनाएं और संग्रहीत करें।
  • रूट पासवर्ड बनाएं और इसके खिलाफ प्रमाणित करें (टेलनेट एक्सेस के लिए प्रयुक्त)
  • कॉन्फ़िगर की गई CPU घड़ी की गति पढ़ें
  • प्रीस्केलर सेट करके अपनी सीपीयू घड़ी की गति बदलें
  • विभिन्न चीजों के समय के लिए 16-बिट टाइमर शुरू और बंद करें
  • पावर अप और/या पावर डाउन पेरिफेरल सब-सिस्टम: एनालॉग टू डिजिटल कन्वर्टर्स (ADC), सीरियल पेरिफेरल इंटरफेस (SPI), टू-वायर इंटरफेस (TWI/I2C), UART/USART। जब आप माइक्रोकंट्रोलर की बिजली खपत को कम करना चाहते हैं या कुछ कार्यों को सक्षम करना चाहते हैं तो उपयोगी।
  • पुन: प्रयोज्य वस्तुओं के साथ सी ++ में लिखा गया।

यह निर्देश avrsh की स्थापना, उपयोग और अनुकूलन के माध्यम से चलेगा।

चरण 1: आपको क्या चाहिए

आपको किस चीज़ की ज़रूरत पड़ेगी
आपको किस चीज़ की ज़रूरत पड़ेगी

इस निर्देशयोग्य को आपको छोड़कर बहुत अधिक आवश्यकता नहीं है:

  • एक Arduino या ATmega328P लें। अन्य एवीआर काम कर सकते हैं, लेकिन आपको किसी भी रजिस्टर को सूचीबद्ध करने के लिए कोड को संशोधित करने की आवश्यकता हो सकती है जो आपके एमसीयू के लिए अद्वितीय हैं। नामों को केवल आपके एमसीयू के लिए अद्वितीय हेडर फ़ाइल में सूचीबद्ध चीज़ों से मेल खाना चाहिए। एवीआर के बीच कई रजिस्टर नाम समान हैं, इसलिए पोर्ट करते समय आपका माइलेज भिन्न हो सकता है।
  • अपने Arduino/AVR के सीरियल USART से कनेक्ट करने का एक तरीका है। सिस्टम का सबसे व्यापक रूप से AVR टर्मिनल के साथ परीक्षण किया गया है, एक विंडोज़ ऐप जो आपके USB या COM पोर्ट के माध्यम से एक सीरियल कनेक्शन बनाता है। USB कनेक्शन का उपयोग करके Arduinos के साथ काम करता है और Moderndevice.com से USB-BUB का उपयोग करके कोई भी AVR। अन्य टर्मिनल विकल्पों में शामिल हैं: पुट्टी, मिनिकॉम (लिनक्स और फ्रीबीएसडी), स्क्रीन (लिनक्स/फ्रीबीएसडी), हाइपरटर्मिनल, टेराटर्म। मैंने पाया है कि पोटीन और टेराटर्म कनेक्ट करते समय कुछ कचरा भेजते हैं ताकि आपका पहला आदेश खराब हो सके।
  • AVR शेल फर्मवेयर स्थापित और चालू रखें, जिसे आप इन पृष्ठों से डाउनलोड कर सकते हैं, या हमेशा BattleDroids.net पर नवीनतम संस्करण प्राप्त कर सकते हैं।

एवीआर टर्मिनल स्थापित करने के लिए, बस इसे अनपैक करें और इसे चलाएं। AVR शेल फर्मवेयर स्थापित करने के लिए, इसे डाउनलोड करें और या तो सीधे हेक्स फ़ाइल अपलोड करें और अपने सीरियल टर्मिनल को 9600 बॉड पर कनेक्ट करें, या इसे स्वयं "मेक" के साथ संकलित करें और फिर हेक्स को अपलोड करने के लिए "प्रोग्राम बनाएं"। ध्यान दें, आपको अपने COM पोर्ट को प्रतिबिंबित करने के लिए AVRDUDE सेटिंग्स को बदलने की आवश्यकता हो सकती है। नोट: PROGMEM विशेषता C++ के लिए वर्तमान AVR GCC कार्यान्वयन में टूट गई है और यह एक ज्ञात बग है। यदि आप इसे संकलित करते हैं, तो कई चेतावनी संदेश प्राप्त करने की अपेक्षा करें "चेतावनी: केवल प्रारंभिक चर को प्रोग्राम मेमोरी क्षेत्र में रखा जा सकता है।" देखने में कष्टप्रद होने के अलावा, यह चेतावनी हानिरहित है। चूंकि एम्बेडेड प्लेटफॉर्म पर C++ AVR GCC प्राथमिकताओं की सूची में उच्च नहीं है, यह अज्ञात है कि इसे कब ठीक किया जाएगा। यदि आप कोड की जांच करते हैं, तो आप देखेंगे कि मैंने अपने स्वयं के विशेषता कथनों को लागू करके इस चेतावनी को कम करने के लिए कहां काम किया है। बहुत आसान। कुछ भी डाउनलोड और इंस्टॉल करें जिसकी आपको आवश्यकता हो सकती है, फिर पृष्ठ को फ़्लिप करें और चलो क्रैकिन प्राप्त करें।

चरण 2: रजिस्टर पढ़ना और लिखना

रजिस्टर पढ़ना और लिखना
रजिस्टर पढ़ना और लिखना

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

प्रिंट रजिस्टर और आपको इस तरह दिखने वाला एक प्रिंटआउट मिलेगा

मुझे निम्नलिखित रजिस्टरों के बारे में पता है:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR पिंक EEDR PIND SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR एसपीडीआर शंट SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB UDMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWCR TWCR TWCR TWCR TWAMR TWCR TWCR TWCR TWSR TWCR TWSR TWCR TWSR TWCR TWCR TWSR TWCR TWSR TWSR TWCR TWSR यह देखने के लिए कि किसी भी रजिस्टर में अलग-अलग बिट्स कैसे सेट होते हैं, कैट या इको कमांड का उपयोग करें

बिल्ली %GPIOR0 यहाँ मैं कमांड दुभाषिया को सामान्य प्रयोजन I/O रजिस्टर #0 की सामग्री को प्रदर्शित करने, या प्रतिध्वनित करने के लिए कह रहा हूँ। रजिस्टर के नाम के आगे प्रतिशत चिन्ह (%) नोट करें। आपको शेल को इंगित करने के लिए इसकी आवश्यकता है कि यह एक आरक्षित कीवर्ड है जो एक रजिस्टर की पहचान करता है। इको कमांड से विशिष्ट आउटपुट इस तरह दिखता है

GPIOR0(0x0) [00000000] पर सेट है आउटपुट रजिस्टर का नाम, रजिस्टर में पाया गया हेक्साडेसिमल मान और रजिस्टर का बाइनरी प्रतिनिधित्व दिखाता है (प्रत्येक बिट को 1 या 0 के रूप में दिखाता है)। किसी भी रजिस्टर में एक विशेष बिट सेट करने के लिए, "index of" ऑपरेटर का उपयोग करें। उदाहरण के लिए, मान लें कि मैं तीसरे बिट को 1

%GPIOR0[3] = 1 और शेल आपको एक प्रतिक्रिया देगा जो यह दर्शाता है कि यह क्रिया और परिणाम है

GPIOR0(0x0) [00000000] (0x8) पर सेट [00001000] पर सेट आप रजिस्टर के साथ काम कर रहे शेल को बताने के लिए प्रतिशत चिह्न को न भूलें। यह भी ध्यान दें कि तीसरे बिट को सेट करके, वह 4 बिट्स है क्योंकि हमारे एवीआर शून्य-आधारित इंडेक्स का उपयोग करते हैं। दूसरे शब्दों में, तीसरे बिट की गिनती करते हुए आप 0, 1, 2, 3 की गिनती करते हैं, जो कि चौथा स्थान है, लेकिन तीसरा बिट है। आप इसी तरह से थोड़ा सा शून्य पर सेट करके थोड़ा सा क्लियर कर सकते हैं। इस तरह से बिट्स सेट करके आप अपने AVR के कामकाज को तुरंत बदल सकते हैं। उदाहरण के लिए, OCR1A में पाए गए CTC टाइमर मिलान मान को बदलकर। यह आपको विशेष सेटिंग्स में झांकने की सुविधा भी देता है, जिन्हें आपको अपने कोड में प्रोग्रामेटिक रूप से जांचना होगा, जैसे कि आपकी बॉड दर के लिए UBBR मान। DDRn, PORTn और PINn के साथ कार्य करना I/O पिन भी रजिस्टरों को असाइन किए जाते हैं और ठीक उसी तरह सेट किए जा सकते हैं, लेकिन इस प्रकार के रजिस्टरों के साथ काम करने के लिए एक विशेष सिंटैक्स बनाया गया है। कोड में, एक एलईडी या अन्य डिवाइस को चालू करने के लिए एक सामान्य प्रक्रिया है, जिसके लिए डिजिटल उच्च या निम्न की आवश्यकता होती है। यह इंगित करने के लिए डेटा दिशा रजिस्टर सेट करने की आवश्यकता है कि पिन आउटपुट के लिए है, और फिर सही पोर्ट में विशेष बिट पर 1 या 0 लिखना। यह मानते हुए कि हमारे पास डिजिटल पिन 13 (PB5) से जुड़ी एक एलईडी है और हम इसे चालू करना चाहते हैं, यहां बताया गया है कि आपका AVR चलने के दौरान यह कैसे करना है

पिन सेट करें pb5 आउटपुटराइट पिन pb5 हाई आउटपुट, आपके एलईडी को देखने में सक्षम होने के अलावा, इस तरह दिखेगा

root@ATmega328p> पिन pb5 आउटपुट सेट करेंआउटपुट के लिए pb5 सेट करेंरूट@ATmega328p> पिन लिखें pb5 उच्च पिन करने के लिए उच्च तर्क लिखें pb5 "रूट@ATmega328p>" शेल का संकेत है जो इंगित करता है कि यह आप से आदेश स्वीकार करने के लिए तैयार है। एलईडी को बंद करने के लिए, आप बस पिन को कम लिखेंगे। यदि आप पिन से डिजिटल इनपुट पढ़ना चाहते हैं, तो रीड कमांड का उपयोग करें। हमारे उपरोक्त उदाहरण का उपयोग करना

root@ATmega328p> पिन पढ़ें pb5पिन: pb5 हाई है वैकल्पिक रूप से, बस उस पिन रजिस्टर को प्रतिध्वनित करें जो उस पिन पोर्ट को नियंत्रित करता है। उदाहरण के लिए, यदि हमारे पास डिजिटल पिन 7 और 8 (PD7 और PD8) से जुड़े डिप स्विच हैं, तो आप कमांड भेज सकते हैं

इको %PIND और फिर शेल उस रजिस्टर की सामग्री को प्रदर्शित करेगा, जो आपको कनेक्टेड डिवाइसों के सभी इनपुट/आउटपुट राज्यों को दिखाएगा और स्विच की स्थिति चालू या बंद थी या नहीं।

चरण 3: फ़्यूज़ पढ़ना और लिखना

पढ़ना और लिखना फ़्यूज़
पढ़ना और लिखना फ़्यूज़

फ़्यूज़ विशेष प्रकार के रजिस्टर होते हैं। वे आपके माइक्रोकंट्रोलर की घड़ी की गति से लेकर EEPROM को लिखने-संरक्षित करने के लिए कौन सी प्रोग्रामिंग विधियाँ उपलब्ध हैं, सब कुछ नियंत्रित करते हैं। कभी-कभी आपको इन सेटिंग्स को बदलने की आवश्यकता होगी, खासकर यदि आप एक स्टैंड-अलोन AVR सिस्टम बना रहे हैं। मुझे यकीन नहीं है कि आपको Arduino पर अपनी फ़्यूज़ सेटिंग बदलनी चाहिए। अपने फ़्यूज़ से सावधान रहें; यदि आप उन्हें गलत तरीके से सेट करते हैं तो आप खुद को लॉक कर सकते हैं। पिछले निर्देश में, मैंने दिखाया कि आप अपने प्रोग्रामर और एवरड्यूड का उपयोग करके अपने फ़्यूज़ को कैसे पढ़ और सेट कर सकते हैं। यहां, मैं आपको दिखाऊंगा कि रन टाइम पर अपने फ़्यूज़ को कैसे पढ़ना है, यह देखने के लिए कि आपके एमसीयू ने वास्तव में उन्हें कैसे सेट किया है। ध्यान दें, कि यह संकलन-समय सेटिंग नहीं है जो आपको परिभाषाओं से मिलती है, लेकिन वास्तविक फ़्यूज़ MCU के रूप में उन्हें रन टाइम पर पढ़ता है। ATmega328P डेटाशीट (डेटाबुक, इसे और अधिक) में तालिका 27-9 से फ्यूज लो बाइट के बिट्स इस प्रकार हैं:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0ध्यान देने वाली एक दिलचस्प बात यह है कि फ़्यूज़ के साथ, 0 का अर्थ प्रोग्राम किया गया है और 1 का अर्थ है कि वह विशेष बिट अनप्रोग्राम्ड है। कुछ हद तक प्रति-सहज ज्ञान युक्त, लेकिन एक बार जब आप इसे जान लेते हैं तो आप इसे जान लेते हैं।

  • CKDIV8 आपके CPU घड़ी को 8 से विभाजित करने के लिए सेट करता है। ATmega328P, 8MHz पर अपने आंतरिक थरथरानवाला का उपयोग करने के लिए प्रोग्राम किए गए कारखाने से आता है जिसमें CKDIV8 प्रोग्राम किया गया है (यानी 0) आपको अंतिम F_CPU या 1MHz की CPU आवृत्ति देता है। Arduino पर, इसे बदल दिया जाता है क्योंकि वे 16MHz पर बाहरी थरथरानवाला का उपयोग करने के लिए कॉन्फ़िगर किए गए हैं।
  • प्रोग्राम किए जाने पर CKOUT आपकी CPU घड़ी को PB0 पर आउटपुट करेगा, जो कि Arduinos पर डिजिटल पिन 8 है।
  • SUT[1..0] आपके AVR के लिए स्टार्टअप समय निर्दिष्ट करता है।
  • CKSEL[3..0] घड़ी के स्रोत को सेट करता है, जैसे आंतरिक RC थरथरानवाला, बाहरी थरथरानवाला, आदि।

जब आप अपने फ़्यूज़ पढ़ते हैं, तो यह आपको हेक्साडेसिमल में वापस कर दिया जाएगा। यह वह प्रारूप है जिसकी आपको आवश्यकता है यदि आप avrdude के माध्यम से फ़्यूज़ लिखना चाहते हैं। मेरे arduino पर, जब मैं निचले फ्यूज बाइट को पढ़ता हूं तो मुझे यही मिलता है:

root@ATmega328p> lfuseलोअर फ्यूज पढ़ें: 0xffतो, सभी बिट्स 1 पर सेट हैं। मैंने Arduino क्लोन पर समान प्रक्रिया की और समान मान प्राप्त किया। मेरे एक स्टैंड-अलोन AVR सिस्टम की जाँच करने पर, मुझे 0xDA मिला, जो कि चिप को कॉन्फ़िगर करते समय मैंने कुछ समय पहले निर्धारित किया था। हाई फ्यूज बाइट, एक्सटेंडेड फ्यूज बाइट और लॉक फ़्यूज़ की जाँच के लिए उसी प्रक्रिया का उपयोग किया जाता है। कैलिब्रेशन और सिग्नेचर फ़्यूज़ बाइट्स को #if 0 प्रीप्रोसेसर निर्देश के साथ कोड में अक्षम कर दिया गया है, जिसे आप खराब महसूस होने पर बदल सकते हैं।

चरण 4: अन्य आदेश

अन्य आदेश
अन्य आदेश

कई अन्य कमांड हैं जिन्हें डिफ़ॉल्ट कमांड दुभाषिया समझता है कि आपको उपयोगी लग सकता है। आप प्रॉम्प्ट पर सहायता या मेनू जारी करके सभी कार्यान्वित और भविष्य-रिलीज़ कमांड देख सकते हैं। मैं उन्हें जल्दी से यहाँ कवर करूँगा क्योंकि वे ज्यादातर आत्म-व्याख्यात्मक हैं। सीपीयू क्लॉक फ़्रीक्वेंसी सेटिंग्स आप यह पता लगा सकते हैं कि आपके फ़र्मवेयर को सीपीयू क्लॉक सेटिंग्स के रूप में उपयोग करने के लिए fcpu कमांड के साथ क्या कॉन्फ़िगर किया गया है:

रूट@ATmega328p> fcpuCPU फ्रीक: 16000000यह 16 मिलियन या 16 मिलियन हर्ट्ज है, जिसे आमतौर पर 16 मेगाहर्ट्ज के रूप में जाना जाता है। आप इसे किसी भी कारण से, क्लॉक कमांड के साथ मक्खी पर बदल सकते हैं। यह आदेश एक तर्क लेता है: आपकी घड़ी की गति को विभाजित करते समय उपयोग करने के लिए प्रीस्कूलर। क्लॉक कमांड इन प्रीस्कूलर मूल्यों को समझता है:

  • सीकेडीआईवी2
  • सीकेडीआईवी4
  • सीकेडीआईवी८
  • सीकेडीआईवी16
  • सीकेडीआईवी32
  • सीकेडीवी64
  • सीकेडीवी128
  • सीकेडीआईवी256

कमांड का उपयोग करना:

घड़ी ckdiv2 जब आपकी सीपीयू की गति 16 मेगाहर्ट्ज है, तो आपकी घड़ी की गति 8 मेगाहर्ट्ज में बदल जाएगी। 16MHz की आरंभिक घड़ी की गति के साथ ckdiv64 के प्रीस्केलर का उपयोग करने से अंतिम घड़ी की गति 250 KHz हो जाएगी। पृथ्वी पर आप अपने MCU को धीमा क्यों बनाना चाहेंगे? ठीक है, एक के लिए, एक कम घड़ी की गति कम बिजली की खपत करती है और यदि आपके पास प्रोजेक्ट एनक्लोजर में आपका एमसीयू बैटरी से चल रहा है, तो आपको इसे शीर्ष गति पर चलाने की आवश्यकता नहीं हो सकती है, और इसलिए, गति कम हो सकती है और बिजली की खपत कम हो सकती है, बैटरी जीवन में वृद्धि। इसके अलावा, यदि आप किसी अन्य एमसीयू के साथ किसी भी प्रकार के समय के मुद्दों के लिए घड़ी का उपयोग कर रहे हैं, जैसे कि एक सॉफ्टवेयर यूएआरटी या कुछ ऐसी चीज को लागू करना, तो आप इसे एक विशेष मूल्य पर सेट करना चाह सकते हैं जो कि एक अच्छी बॉड दर भी प्राप्त करना आसान है कम त्रुटि दर। पेरिफेरल सब-सिस्टम को पावर अप और पावर डाउन करना पहले उल्लेखित बिजली की खपत को कम करने के समान नोट पर, आप कुछ ऑन-बोर्ड बाह्य उपकरणों को बंद करके बिजली को और कम करना चाह सकते हैं जिनका आप उपयोग नहीं कर रहे हैं। कमांड दुभाषिया और शेल वर्तमान में निम्नलिखित बाह्य उपकरणों को चालू और बंद कर सकते हैं:

  • एनालॉग-टू-डिजिटल कनवर्टर (एडीसी)। इस परिधीय का उपयोग तब किया जाता है जब आपके पास डेटा (जैसे तापमान, प्रकाश, त्वरण, आदि) प्रदान करने वाला एक एनालॉग सेंसर होता है और इसे डिजिटल मान में बदलने की आवश्यकता होती है।
  • सीरियल पेरिफेरल इंटरफेस (एसपीआई)। एसपीआई बस का उपयोग अन्य एसपीआई-सक्षम उपकरणों के साथ संचार करने के लिए किया जाता है, जैसे बाहरी यादें, एलईडी ड्राइवर, बाहरी एडीसी, आदि। एसपीआई के कुछ हिस्सों का उपयोग आईएसपी प्रोग्रामिंग के लिए किया जाता है, या कम से कम पिन होते हैं, इसलिए इसे बंद करते समय सावधान रहें। यदि आप ISP के माध्यम से प्रोग्रामिंग कर रहे हैं।
  • दो-तार इंटरफ़ेस। कुछ बाहरी उपकरण संचार के लिए I2C बस का उपयोग करते हैं, हालांकि इन्हें तेजी से SPI-सक्षम उपकरणों द्वारा प्रतिस्थापित किया जा रहा है क्योंकि SPI का थ्रूपुट अधिक है।
  • USART. यह आपका सीरियल इंटरफ़ेस है। यदि आप सीरियल कनेक्शन के माध्यम से AVR से जुड़े हैं, तो आप शायद इसे बंद नहीं करना चाहेंगे! हालाँकि, मैंने इसे यहाँ उन उपकरणों को पोर्ट करने के लिए एक कंकाल के रूप में जोड़ा है जिनमें ATmega162 या ATmega644P जैसे कई USART हैं।
  • सब। पॉवरअप या पॉवरडाउन कमांड के लिए यह तर्क उल्लिखित सभी बाह्य उपकरणों को चालू करता है या उन सभी को एक कमांड के साथ बंद कर देता है। दोबारा, इस आदेश का बुद्धिमानी से उपयोग करें।

root@ATmega328p> ट्वी का पावरडाउन पूरा।

टाइमर शुरू करना और रोकना शेल में एक अंतर्निहित 16-बिट टाइमर है जो उपयोग के लिए उपलब्ध है। आप टाइमर को टाइमर कमांड से शुरू करते हैं:

टाइमर प्रारंभऔर स्टॉप तर्क के साथ टाइमर बंद करो

टाइमर स्टॉपयह टाइमर आंतरिक USART टाइमर के साथ विरोध नहीं करेगा। USART टाइमर के कार्यान्वयन विवरण के लिए कोड देखें, यदि उस प्रकार के रक्तरंजित विवरण में आपकी रुचि है

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

root@ATmega328p> पासवार्ड ब्लाह ने EEPROM को रूट पासवर्ड लिखाऑथ कमांड के साथ पासवर्ड (या कोड के माध्यम से प्रोग्रामेटिक रूप से प्राधिकरण की आवश्यकता होती है) के खिलाफ अधिकृत करें। ध्यान दें, यदि आप रूट पासवर्ड बदलने का प्रयास करते हैं और पहले से ही एक रूट पासवर्ड सेट है, तो आपको इसे नए पासवर्ड में बदलने की अनुमति देने से पहले पुराने पासवर्ड के खिलाफ खुद को अधिकृत करना होगा।

root@ATmega328p> पासवार्ड ब्लिंकीआपको पहले स्वयं को अधिकृत करना होगा।बेशक, आपको avrsh.eep फ़ाइल लोड करनी होगी यदि आप फ़र्मवेयर को मिटाते हैं ताकि आपके पुराने मान और वेरिएबल को पुनर्स्थापित किया जा सके। मेकफ़ाइल आपके लिए EEPROM फ़ाइल बनाएगा। चर शैल उपयोक्ता-परिभाषित चरों की धारणा को समझता है। कोड इसे 20 तक सीमित करता है, लेकिन यदि आप चाहें तो script.h में MAX_VARIABLES परिभाषित करके इसे बदल सकते हैं। आप किसी भी 16-बिट मान (यानी 65, 536 तक की कोई भी संख्या) को बाद में वापस बुलाए जाने वाले चर में सहेज सकते हैं। सिंटैक्स एक डॉलर चिह्न ($) को छोड़कर रजिस्टरों के समान है, जिसका उपयोग शेल में चर को निरूपित करने के लिए किया जाता है। अपने सभी चरों को प्रिंट चर कमांड के साथ सूचीबद्ध करें

प्रिंट चर उपयोगकर्ता-परिभाषित चर: अनुक्रमणिका नाम -> मान (01): $ मुफ़्त $ -> 0 (02): $ मुफ़्त $ -> 0 (03): $ मुफ़्त $ -> 0 (04): $ मुफ़्त $ -> 0(05): $फ्री$ -> 0(06): $फ्री$ -> 0(07): $फ्री$ -> 0(08): $फ्री$ -> 0(09): $फ्री$ -> 0(10): $फ्री$ -> 0(11): $फ्री$ -> 0(12): $फ्री$ -> 0(13): $फ्री$ -> 0(14): $फ्री$ -> 0(15): $फ्री$ -> 0(16): $फ्री$ -> 0(17): $फ्री$ -> 0(18): $फ्री$ -> 0(19): $फ्री$ -> 0(20): $मुफ्त$ -> 0पूर्ण।एक चर सेट करें

$newvar = 25$समयबाह्य = 23245किसी दिए गए चर का मान प्राप्त करें

रूट@ATmega328p> इको $newvar$ newvar 25आप देख सकते हैं कि आपने वर्तमान में प्रिंट कमांड के साथ कौन से वेरिएबल को इंस्टेंट किया है जिसे आप पहले से जानते हैं

उपयोगकर्ता परिभाषित चर: अनुक्रमणिका नाम -> मान (01): newvar -> 25(02): समयबाह्य -> 23245(03): $मुफ्त$ -> 0(04): $मुफ्त$ -> 0(05): $ मुफ़्त $ -> 0 (06): $ मुफ़्त $ -> 0 (07): $ मुफ़्त $ -> 0 (08): $ मुफ़्त $ -> 0 (09): $ मुफ़्त $ -> 0 (10): $फ्री$ -> 0(11): $फ्री$ -> 0(12): $फ्री$ -> 0(13): $फ्री$ -> 0(14): $फ्री$ -> 0(15): $फ्री$ -> 0(16): $फ्री$ -> 0(17): $फ्री$ -> 0(18): $फ्री$ -> 0(19): $फ्री$ -> 0(20): $मुफ्त$ -> 0पूर्ण।$FREE$ नाम केवल यह दर्शाता है कि वह चर स्थान मुफ़्त है और उसे अभी तक एक चर नाम नहीं दिया गया है।

चरण 5: शेल को अनुकूलित करना

शेल को अनुकूलित करना
शेल को अनुकूलित करना

आप कोड को हैक करने के लिए स्वतंत्र हैं और यदि आप चाहें तो इसे अपनी आवश्यकताओं के अनुसार अनुकूलित कर सकते हैं। अगर मुझे पता होता कि मैं इस कोड को जारी कर रहा हूं, तो मैं एक अलग कमांड इंटरप्रेटर क्लास और कमांड स्ट्रक्चर बना लेता और फंक्शन पॉइंटर को कॉल करके इसे आसानी से दोहराता। यह कोड की मात्रा को कम करेगा, लेकिन जैसा कि यह खड़ा है शेल कमांड लाइन को पार्स करता है और उपयुक्त शेल विधि को कॉल करता है। अपने स्वयं के कस्टम कमांड में जोड़ने के लिए, निम्न कार्य करें: 1. पार्स सूची में अपना कमांड जोड़ें कमांड पार्सर करेगा कमांड लाइन को पार्स करें और आपको कमांड और कोई भी तर्क अलग से दें। तर्कों को पॉइंटर्स टू पॉइंटर्स, या पॉइंटर्स की एक सरणी के रूप में पारित किया जाता है, हालांकि आप उनके साथ काम करना पसंद करते हैं। यह shell.cpp में पाया जाता है। shell.cpp खोलें और AVRShell वर्ग की ExecCmd विधि खोजें। आप प्रोग्राम मेमोरी में कमांड जोड़ना चाह सकते हैं। यदि आप करते हैं, तो progmem.h और progmem.cpp में कमांड जोड़ें। आप PSTR () मैक्रो का उपयोग करके सीधे प्रोग्राम मेमोरी में कमांड जोड़ सकते हैं, लेकिन आप पहले बताए गए प्रकार की एक और चेतावनी उत्पन्न करेंगे। फिर से, यह C++ के साथ काम करने वाला एक ज्ञात बग है, लेकिन आप सीधे प्रोग्राम में कमांड जोड़कर इसे प्राप्त कर सकते हैं। * फाइलें, जैसा कि मैंने किया है। यदि आपको अपने SRAM उपयोग को जोड़ने में कोई आपत्ति नहीं है, तो आप कमांड को जोड़ सकते हैं जैसा कि मैंने "घड़ी" कमांड के साथ सचित्र किया है। मान लें कि आप "newcmd" नामक एक नई कमांड जोड़ना चाहते हैं। AVRShell::ExecCmd पर जाएं और निम्नलिखित कोड डालने के लिए एक सुविधाजनक स्थान खोजें:

और अगर (!strcmp(c, "newcmd")) cmdNewCmd(args);यह आपकी कमांड को जोड़ देगा और cmdNewCmd मेथड को कॉल करेगा जिसे आप अगले स्टेप में लिखेंगे। 2. अपना कस्टम कमांड कोड लिखें उसी फाइल में, अपना कस्टम कमांड कोड जोड़ें। यह विधि परिभाषा है। आप अभी भी घोषणा को shell.h में जोड़ना चाहेंगे। बस इसे अन्य आदेशों में संलग्न करें। पिछले उदाहरण में, कोड कुछ इस तरह दिख सकता है

voidAVRShell::cmdNewCmd(char ** args){sprintf_P(buff, PSTR("आपका आदेश %s\r\n", args[0]); WriteRAM(buff);}यहां कई चीजें हैं। सबसे पहले, "बफ़" आपके उपयोग के लिए कोड में प्रदान किया गया एक 40-वर्ण सरणी बफर है। हम sprintf के प्रोग्राम मेमोरी संस्करण का उपयोग करते हैं क्योंकि हम इसे एक PSTR पास कर रहे हैं। यदि आप चाहें तो नियमित संस्करण का उपयोग कर सकते हैं, लेकिन सुनिश्चित करें कि आप प्रारूप को PSTR में पास नहीं करते हैं। साथ ही, तर्क args सरणी में हैं। यदि आपने "newcmd arg1 arg2" टाइप किया है तो आप इन तर्कों को args[0] और args[1] सबस्क्रिप्ट के साथ प्राप्त कर सकते हैं। जैसा कि कोड में परिभाषित किया गया है, आप अधिकतम MAX_ARGS तर्क पारित कर सकते हैं। जब आप पुन: संकलित करते हैं तो उस मान को बदलने के लिए स्वतंत्र महसूस करें यदि आपको एक साथ पारित करने के लिए कई और तर्कों की आवश्यकता है। राइटलाइन और राइटरैम वैश्विक कार्य हैं जो यूएआरटी के समान नाम के तरीकों को वापस करते हैं। इस फ़ंक्शन का दूसरा तर्क निहित है। यदि आप कुछ भी पास नहीं करते हैं, तो बाद में एक कमांड प्रॉम्प्ट लिखा जाएगा। यदि आप दूसरे तर्क के रूप में 0 पास करते हैं, तो एक संकेत नहीं लिखा जाएगा। यह तब उपयोगी होता है जब आप उपयोगकर्ता को कमांड प्रॉम्प्ट वापस करने से पहले आउटपुट में कई अलग-अलग स्ट्रिंग लिखना चाहते हैं। 3. शेल को कमांड कोड निष्पादित करने के लिए कहें, जब आप नया कमांड सेट करते हैं तो आपने शेल एक्ज़ीक्यूटर को cmdNewCmd विधि निष्पादित करने के लिए कहा है, लेकिन इसे शेल ऑब्जेक्ट द्वारा समझने के लिए इसे shell.h फ़ाइल में जोड़ें। बस इसे आखिरी कमांड के नीचे या पहले कमांड के सामने, या कहीं भी जोड़ें।और बस। फर्मवेयर को अपने Arduino पर पुन: संकलित करें और अपलोड करें और आपकी नई कमांड प्रॉम्प्ट पर शेल से उपलब्ध है।

चरण 6: सारांश

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

सिफारिश की: