विषयसूची:

भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विच: 6 चरण
भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विच: 6 चरण

वीडियो: भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विच: 6 चरण

वीडियो: भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विच: 6 चरण
वीडियो: Master GPIO with Raspberry Pi Pico & MicroPython - Uncover the Secrets! 2024, नवंबर
Anonim
भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विचेस
भाग 2 - GPIO आर्म असेंबली - RGB - फंक्शन कॉल्स - स्विचेस

भाग 1 में, हमने सीखा कि कैसे C / C++ के बजाय असेंबली का उपयोग करके, टेक्सास इंस्ट्रूमेंट्स से MSP432 लॉन्चपैड डेवलपमेंट बोर्ड पर सिंगल रेड एलईडी को टॉगल करना है।

इस निर्देश में, हम कुछ ऐसा ही करेंगे - एक RGB LED को नियंत्रित करें जो उसी बोर्ड पर भी हो।

रास्ते में, हम एआरएम असेंबली के बारे में अपने ज्ञान को आगे बढ़ाने की उम्मीद करते हैं, न कि केवल कुछ एल ई डी को रोशन करने का मज़ा लें।

चरण 1: चलो सही में कूदें

वास्तव में, पहला वीडियो यह सब कहता है। जोड़ने के लिए बहुत अधिक नहीं है।

इसका मुख्य बिंदु इस विचार को घर ले जाना है कि MSP432 पर प्रत्येक I/O पोर्ट में "रजिस्टर" पतों का एक ब्लॉक होता है, जो बदले में कई बिट्स से मिलकर बनता है।

इसके अलावा, बिट्स को ऑर्थोगोनल तरीके से समूहीकृत किया जाता है। अर्थात्, प्रत्येक रजिस्टर पते का बिट 0 समान बाहरी I/O पिन को संदर्भित करता है।

हमने इस विचार को दोहराया कि उस पोर्ट के लिए केवल एक बिट या पिन के साथ कुछ करने के लिए कई रजिस्टर पते लगते हैं।

लेकिन इस मामले में, चूंकि हम आरजीबी एलईडी के साथ काम कर रहे हैं, इसलिए हमें प्रत्येक रजिस्टर पते के लिए तीन बिट्स से निपटने की जरूरत है।

हमने इस बात पर बल दिया कि हमें कई रजिस्टरों की आवश्यकता है: DIR रजिस्टर, SEL0 रजिस्टर, SEL1 रजिस्टर और OUTPUT रजिस्टर। और हर बार तीन बिट्स।

चरण 2: कोड में सुधार करें - एक फ़ंक्शन जोड़ें

Image
Image

जैसा कि आपने उपरोक्त चरण में देखा, मुख्य प्रोग्राम लूप में बहुत बार दोहराया गया कोड था, अर्थात्, जब हम एल ई डी बंद करते हैं।

तो हम प्रोग्राम में एक फंक्शन जोड़ सकते हैं। जब भी हम एल ई डी को बंद करना चाहते हैं, तब भी हमें उस फ़ंक्शन को कॉल करना पड़ता है, लेकिन यह कुछ कोड को एक ही कथन में ढहने का कारण बनता है।

यदि हमारा एलईडी-ऑफ कोड कई और निर्देशों के साथ अधिक शामिल होता, तो यह एक वास्तविक मेमोरी-सेवर होता।

एम्बेडेड प्रोग्रामिंग और माइक्रो-कंट्रोलर का हिस्सा प्रोग्राम आकार के बारे में अधिक जागरूक हो रहा है।

वीडियो बताता है।

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

चरण 3: एक व्यस्त-लूप विलंब जोड़ें

कोड के घोषणा अनुभाग में, वांछित समय के लिए ट्वीक करना आसान बनाने के लिए एक स्थिरांक जोड़ें:

; सेमी-कोलन (';') के बाद कोई भी शब्द एक टिप्पणी शुरू करता है।

; इस भाग में कोड एक मान को एक नाम निर्दिष्ट करता है।; आप '.equ' का भी इस्तेमाल कर सकते थे लेकिन वे थोड़े अलग हैं।; '.equ' (मुझे लगता है) को बदला नहीं जा सकता, जबकि '.set' का मतलब है कि आप कर सकते हैं; यदि आप चाहें तो कोड में बाद में 'DLYCNT' का मान बदलें।;'DLYCNT' का उपयोग विलंब सबरूटीन में उलटी गिनती मूल्य के रूप में किया जाएगा। DLYCNT.सेट 0x30000

एक नया विलंब फ़ंक्शन जोड़ें:

देरी:.asmfunc; 'देरी' सबरूटीन या फ़ंक्शन की शुरुआत।

MOV R5, #DLYCNT; लोड कोर सीपीयू रजिस्टर R5 'DLYCNT' को दिए गए मान के साथ। डाइलूप; यह देरी लूप की शुरुआत को चिह्नित करता है। कोडांतरक पता निर्धारित करता है। उप R5, #0x1; कोर सीपीयू रजिस्टर R5 में वर्तमान मूल्य से 1 घटाएं। सीएमपी R5, #0x0; R5 से 0 में वर्तमान मान की तुलना करें। BGT dlyloop; शाखा यदि R5 में मान 0 से अधिक है, तो लेबल (पता) 'dlyloop' के लिए। बीएक्स एलआर; अगर हम यहां पहुंचे, तो इसका मतलब है कि R5 मान 0 था। सबरूटीन से वापसी।.endasmfunc; सबरूटीन के अंत के निशान।

फिर मुख्य निकाय में, मुख्य लूप के भीतर, उस विलंब फ़ंक्शन को कॉल या कॉल करें:

; यह मुख्य भाग या मुख्य कार्य का एक कोड खंड है (फ़ाइल 'main.asm' देखें)।

; यह 'मेन' में एक लूप है, और दिखाता है कि हम उस नए 'देरी' फ़ंक्शन को कैसे कॉल या उपयोग करते हैं।; '#REDON' और '#GRNON' भी घोषणाएं (स्थिरांक) हैं ('main.asm' के ऊपर देखें)।; वे आरजीबी एलईडी के निर्दिष्ट रंग को सेट करने का एक आसान तरीका हैं। लूप MOV R0, #REDON; रेड - सेट कोर सीपीयू रजिस्टर R0 'REDON' को दिए गए मान के साथ। STRB R0, [R4]; कोर रजिस्टर R4 को पहले GPIO आउटपुट एड्रेस के साथ सेट किया गया था।; R0 में क्या है, R4 द्वारा निर्दिष्ट पते में लिखें। बीएल देरी; नए 'देरी' समारोह के लिए शाखा। बीएल लेडऑफ़; पहले से मौजूद 'लेड्सऑफ़' फ़ंक्शन की शाखा। बीएल देरी; ठीक वैसे ही MOV R0, #GRNON; हरा - ठीक वैसा ही STRB R0, [R4]; और इसी तरह। बीएल देरी बीएल एलईडीऑफ बीएल देरी

वीडियो विस्तार से जाता है।

चरण 4: एआरएम आर्किटेक्चर प्रक्रिया कॉल स्टैंडर्ड (एएपीसीएस)

शायद कुछ पेश करने का यह एक अच्छा समय है। यह एक असेंबली-भाषा सम्मेलन है। एआरएम आर्किटेक्चर के लिए प्रक्रिया कॉल मानक के रूप में भी जाना जाता है।

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

अन्यथा, हमें ऐसा लग सकता है कि हम पानी की एक बड़ी नली से पी रहे हैं। बहुत ज्यादा जानकारी।

कोर रजिस्टर

चूंकि हम MSP432 के मूल रजिस्टरों से परिचित हो गए हैं, आइए अब इनमें से कुछ मानकों को अपनाने का प्रयास करें। जब हम अगला फंक्शन लिखेंगे तो हम इसके अनुरूप होंगे (एक एलईडी चालू / बंद करें)।

1) हमें फ़ंक्शन पैरामीटर के रूप में R0 का उपयोग करना चाहिए। यदि हम फ़ंक्शन (सबरूटीन) में एक मान पास करना चाहते हैं, तो हमें ऐसा करने के लिए R0 का उपयोग करना चाहिए।

2) हमें लिंक रजिस्टर का उपयोग उसके इच्छित उद्देश्य के लिए करना है - इसमें वह पता होता है जो इंगित करता है कि सबरूटीन पूरा होने के बाद कहाँ वापस जाना है।

आप देखेंगे कि हम इन्हें कैसे लागू करते हैं।

चरण 5: पैरामीटर के साथ कार्य - नेस्टेड कार्य

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

विवरण के लिए वीडियो पर एक नज़र डालें। (लंबाई के लिए खेद है)

चरण 6: GPIO इनपुट - स्विच जोड़ें

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

इस निर्देशयोग्य में छवियां हैं जो दिखाती हैं कि दो ऑन-बोर्ड स्विच MSP432 से कैसे जुड़े हैं।

अनिवार्य रूप से: स्विच 1 (SW1 या S1) P1.1 से जुड़ा है, और स्विच 2 (SW2 या S2) P1.4 से जुड़ा है।

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

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

पोर्ट 1 रजिस्टर पता ब्लॉक

याद रखें कि हमने इन्हें पिछले इंस्ट्रक्शनल में कवर किया था, लेकिन हमें एक नया शामिल करना होगा:

  • पोर्ट 1 इनपुट रजिस्टर पता = 0x40004C00
  • पोर्ट 1 आउटपुट रजिस्टर पता = 0x40004C02
  • पोर्ट 1 दिशा रजिस्टर पता = 0x40004C04
  • पोर्ट 1 रोकनेवाला रजिस्टर पता सक्षम करें = 0x40004C06
  • पोर्ट 1 चुनें 0 रजिस्टर पता = 0x40004C0A
  • पोर्ट 1 1 चुनें रजिस्टर पता = 0x40004C0C

इनपुट के रूप में बंदरगाहों का उपयोग करते समय, MSP432 के आंतरिक पुल-अप या पुल-डाउन प्रतिरोधों का उपयोग करना अच्छा होता है।

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

पुल अप / पुल डाउन रेसिस्टर्स

उन स्विच इनपुट को पुल-अप प्रतिरोधों से जोड़ने के लिए दो अलग-अलग पोर्ट 1 रजिस्टर पते लेता है।

१) पोर्ट १ रेसिस्टर-एनेबल रजिस्टर (0x40004C06) का उपयोग केवल यह इंगित करने के लिए करें कि आप रेसिस्टर्स चाहते हैं (उन दो बिट्स के लिए), 2) और फिर प्रतिरोधों को पुल-अप या पुल-डाउन के रूप में सेट करने के लिए पोर्ट 1 आउटपुट रजिस्टर (0x40004C02) का उपयोग करें। यह भ्रामक लग सकता है कि हम इनपुट पर आउटपुट रजिस्टर का उपयोग कर रहे हैं। आउटपुट रजिस्टर लगभग एक दोहरे उद्देश्य की तरह है।

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

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

(वीडियो समझाने की कोशिश करता है)

एक पोर्ट इनपुट बिट पढ़ना

  • GPIO कार्यक्षमता के लिए SEL0 / SEL1 सेट करें
  • स्विच बिट्स के लिए इनपुट के रूप में डीआईआर रजिस्टर सेट करें, लेकिन एलईडी के लिए आउटपुट के रूप में (एक साथ एक ही बाइट में)
  • प्रतिरोधों को सक्षम करें
  • उन्हें पुल-अप प्रतिरोधक के रूप में सेट करें
  • पोर्ट पढ़ें
  • आप केवल आवश्यक बिट्स को अलग करने के लिए पढ़े गए मान को फ़िल्टर करना चाह सकते हैं (स्विच 1 और 2)

सिफारिश की: