हमारे पिछले ट्यूटोरियल में, हमने PIC माइक्रोकंट्रोलर का उपयोग करके एक पलक झपकने के बारे में सीखा और एक ही सर्किट को परफेक्ट बोर्ड पर बनाया। फिर हमने अपने परफेक्ट बोर्ड पर प्रोग्राम को डंप करने के लिए PICkit 3, ICSP और MPLAB IPE का उपयोग किया । अब, इस ट्यूटोरियल में हम PIC माइक्रोकंट्रोलर पर अधिक पिन का उपयोग करने के लिए अपने आप को आगे बढ़ाएंगे। हम 7 आउटपुट (एलईडी) और एक इनपुट का उपयोग करेंगे। इस ट्यूटोरियल के लिए हम पुराने परफ़ेक्ट बोर्ड (नीचे दिखाए गए) का उपयोग करेंगे और दूसरे एलईडी बोर्ड पर आवश्यक पिनों को बाहर निकालने के लिए बर्ग की छड़ें जोड़ेंगे। इस ट्यूटोरियल के अंत में हम PIC माइक्रोकंट्रोलर PIC16F877A का उपयोग करके ब्लिंकिंग एलईडी की एक सीक्वेंस उत्पन्न करेंगे और यह सीखेंगे कि 'लूप और फंक्शन कॉलिंग के लिए' पर कई इनपुट और आउटपुट, कुछ बेसिक्स का उपयोग कैसे करें।
एलईडी बोर्ड एक और पूर्ण बोर्ड के अलावा कुछ भी नहीं है, जिस पर हम एलईडी को एक वर्तमान सीमित रेजिस्टर (नीचे दिखाया गया है) के साथ मिलाप करेंगे। हम अनुक्रम LED ब्लिंकिंग शुरू करने के लिए एक पुशबटन भी जोड़ेंगे।
सर्किट आरेख:
PIC माइक्रोकंट्रोलर PIC16F877A एलईडी निमिष अनुक्रम कोड और कार्य स्पष्टीकरण:
पूरा कोड नीचे दिया गया है (अंत में जांच करें), यहां हम इसे लाइन से लाइन के माध्यम से प्राप्त करेंगे। यह कोड अनुक्रमिक तरीके से एल ई डी चमकना शुरू कर देगा जब पुश बटन दबाया जाएगा। दृश्यों को समझने के लिए कृपया ट्यूटोरियल के अंत में वीडियो देखें । मैं आपको नीचे दिए गए कोड के साथ वीडियो में दिखाए गए आउटपुट की तुलना करने और कार्यक्रम को समझने की कोशिश करने की सलाह दूंगा।
कोड लाइन को लाइन से देखते हैं। पहली कुछ पंक्तियाँ विन्यास बिट्स को स्थापित करने के लिए हैं जिन्हें पिछले ट्यूटोरियल में समझाया गया था इसलिए मैं उन्हें अभी के लिए छोड़ रहा हूँ। किसी भी कार्यक्रम को समझने का सबसे अच्छा तरीका मुख्य ( शून्य मुख्य () ) फ़ंक्शन से शुरू करना है, तो चलो ऐसा करते हैं
TRISB0 = 1; // MCU को निर्देश दें कि PORTB पिन 0 का उपयोग बटन के इनपुट के रूप में किया जाता है। TRISD = 0x00; // MCU को निर्देश दें कि सभी पिन आउटपुट PORTD = 0x00 हैं; // सभी पिंस को 0 पर प्रारंभ करें
TRIS शब्द का उपयोग यह परिभाषित करने के लिए किया जाता है कि पिन का उपयोग इनपुट / आउटपुट के रूप में किया जा रहा है और PORT शब्द का उपयोग पिन को उच्च / निम्न बनाने के लिए किया जाता है। लाइन TRISB0 = 1 इनपुट के रूप में पोर्ट बी का 0 वां पिन बना देगा। यह हमारा पुशबटन होगा । रेखाएं TRISD = 0x00; पोर्ट = 0x00; पोर्ट डी के सभी पिन को आउटपुट के रूप में बनाएगा और उन पिनों के लिए एलओडब्ल्यू का प्रारंभिक मूल्य प्रदान करेगा।
चूँकि हमने कहा कि B0 को इनपुट के रूप में प्रयोग किया जाता है, हम पुशबटन के एक छोर को B0 और दूसरे छोर को जमीन से जोड़ देंगे। तब तक जब भी हम बटन दबाते हैं पिन को जमीन पर रखा जाएगा जैसा कि ऊपर दिए गए कनेक्शन आरेख में दिखाया गया है। लेकिन ऐसा होने के लिए हमें पुल अप रेज़र का उपयोग करना होगा ताकि बटन दबाए जाने पर पिन ऊँची रहे। पुल अप रेज़िस्टर कुछ इस तरह है।
लेकिन हमारे PIC MCU में इंटरनल कमज़ोर पुल-अप रेज़िस्टर होता है जिसे सॉफ्टवेयर द्वारा सक्रिय किया जा सकता है जिससे बहुत सी परेशानी से बचा जा सकता है (जब अधिक बटन कनेक्ट होने हों)।
एक कमजोर पुल रोकनेवाला क्या है?
पुल अप रेज़र के दो प्रकार हैं, एक है कमजोर पुल अप और दूसरा है स्ट्रॉंग पुल अप । कमज़ोर पुल अप रेज़िस्टर्स उच्च मूल्य के होते हैं और इस प्रकार एक कमजोर धारा को प्रवाहित होने की अनुमति देते हैं और मजबूत पुल अप प्रतिरोध कम मूल्य के होते हैं और इस प्रकार एक मज़बूत करंट प्रवाहित होने की अनुमति देते हैं। सभी MCU ज्यादातर कमजोर पुल प्रतिरोधों का उपयोग करते हैं। हमारे PIC MCU में इसे सक्रिय करने के लिए हमें नीचे दिए गए स्नैपशॉट में दिखाए गए अनुसार OPTION_REG (विकल्प रजिस्टर) के लिए हमारी डेटा शीट पर गौर करना होगा ।
जैसा कि दिखाया गया है कि कमजोर खींचने वाले प्रतिरोध के साथ बिट 7 सौदे। इसे सक्रिय करने के लिए इसे शून्य बनाया जाना चाहिए। यह OPTION_REG <7> = 0 द्वारा किया जाता है । यह विशेष रूप से बिट 7 के साथ अन्य बिट्स को उसके डिफ़ॉल्ट मानों पर छोड़ता है। इसके साथ हम अपने लूप में आते हैं, जहां यह जांचता है कि क्या बटन का उपयोग करके दबाया जाता है यदि (RB0 == 0)। यदि हालत संतुष्ट है, तो हम अपने फ़ंक्शन को 1, 3, 7 और 15 के मापदंडों के साथ कहते हैं।
sblink (1); // फंक्शन सेल 1 पैरामीटर 1 स्बलिंक (3) के साथ; // पैरामीटर कॉल 3 पैरामीटर 3 स्बलिंक (7) के साथ; // फंक्शन सेल 7 पैरामीटर 7 स्बलिंक (15) के साथ; // फंक्शन कॉल 4 पैरामीटर 15 के साथ
हम कार्यों का उपयोग क्यों करते हैं?
हमारे कोड में लाइनों की संख्या को कम करने के लिए फ़ंक्शंस का उपयोग किया जाता है। यह हम में से ज्यादातर लोग जानते होंगे। लेकिन हमें लाइनों की संख्या को कम करने की आवश्यकता क्यों है, खासकर जब यह एमसीयू प्रोग्रामिंग की बात आती है। इसका कारण हमारी प्रोग्राम मेमोरी में सीमित स्थान है । यदि हम कोड को ठीक से ऑप्टिमाइज़ नहीं करते हैं तो हम मेमोरी स्पेस से बाहर निकल सकते हैं। जब हम कोड के लंबे पृष्ठ लिखेंगे तब यह काम आएगा।
किसी भी फंक्शन में एक फंक्शन डेफिनिशन ( sblink (int get) in our case) और एक फंक्शन Call ( sblink (1) हमारे केस में) होगा। फ़ंक्शन की घोषणा करना वैकल्पिक है, इससे बचने के लिए मैंने फ़ंक्शन को अपने मुख्य फ़ंक्शन में कॉल करने से पहले अपनी फ़ंक्शन परिभाषा रखी है।
फ़ंक्शन पैरामीटर वे मान हैं जो फ़ंक्शन कॉल से फ़ंक्शन परिभाषा में पारित किए जाएंगे। हमारे मामले में पूर्णांक मान (1, 3, 7, 15) ऐसे पैरामीटर हैं जो फ़ंक्शन कॉल से पारित किए जाते हैं और उन्हें " प्रोसेस्स " के वेरिएबल मान को प्रोसेस करने के लिए फ़ंक्शन परिभाषा में मान मिलता है। एक फ़ंक्शन में एक से अधिक पैरामीटर हो सकते हैं।
एक बार फ़ंक्शन को कॉल करने के बाद, फ़ंक्शन परिभाषा में नीचे की पंक्तियों को निष्पादित किया जाएगा।
for (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // एलईडी चाल वाम अनुक्रम __delay_ms (50); } के लिए (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // एलईडी चाल वाम अनुक्रम __delay_ms (50); }
अब यह रेखा विषम प्रतीत होती है: PORTD = get << i । मैं समझाऊंगा कि वास्तव में यहाँ क्या हो रहा है।
"<<" एक लेफ्ट शिफ्ट ऑपरेटर है जो सभी बिट्स को उसके लेफ्ट पोज़िशन में शिफ्ट करता है। अब जब हम sblink (int get) फ़ंक्शन को पैरामीटर '1' के साथ sblink (1) कहते हैं, तो यह 'get' का मान 1 बना देगा, जो कि बाइनरी 0b00000001 में है। इसलिए यह लाइन PORTD = 0b00000001 << i जैसी होगी ।
"I" का मान 0 से 7 तक भिन्न होगा क्योंकि हमने ' int ' = 'के लिए लूप' का उपयोग किया है ; i <= 7 = & RB0 == 0; i ++)। The i’का मान 0 से 7 तक होने से परिणाम निम्नानुसार बदल जाएगा:
जैसा कि आप देख सकते हैं कि हमने एक ऑफ को एक बार (बाएं से दाएं) बाकी के ऑफ को बंद करके चालू किया है। अगले 'लूप के लिए ' (int i = 7; i> = 0 && RB0 == 0; i--) , भी ऐसा ही करेंगे, लेकिन इस बार एलईडी को एक क्रम में दाईं से बाईं ओर चालू किया जाएगा, जैसा कि हमने 7 से शुरू किया और 0. से नीचे जा रहे हैं। हमने 200 मी की देरी का उपयोग किया है ताकि हम एलईडी को चालू और बंद होने की कल्पना कर सकें।
अब जब हम sblink (int get) फंक्शन में value 3 पास करते हैं, तो फंक्शन sblink (3) निष्पादित किया जाएगा जो 'get' के मान को 0b00000011 के रूप में बनाता है, इसलिए PORTD पर परिणाम होगा:
तो अब इस बार sblink (3) का उपयोग करके किसी भी समय दो एल ई डी को चालू किया जाएगा । इसी प्रकार सेब्लिंक (7) और स्बलिंक (15) के लिए, तीन और चार एल ई डी एक क्रम में ऑन होंगे। एक बार यह पूरा हो जाने पर हम सभी पोर्ट PORTD = 0xFF का उपयोग करने के लिए एलईडी का निर्माण करेंगे । पूर्ण प्रदर्शन के लिए नीचे दिए गए वीडियो की जाँच करें ।
आशा है कि आपने कोड को समझ लिया है और इस प्रकार सीख लिया है कि अपने वांछित आउटपुट प्राप्त करने के लिए ',' और 'लूप' के लिए फ़ंक्शन का उपयोग कैसे करें । अब आप एलईडी ब्लिंकिंग के अपने अलग अनुक्रम को प्राप्त करने के लिए कोड के आसपास ट्विक कर सकते हैं। अपने कोड को संकलित करें और अपने MCU पर डंप करें और आउटपुट का आनंद लें। यदि आप कहीं अटक जाते हैं तो आप टिप्पणी अनुभाग का उपयोग कर सकते हैं। मैंने यहां सिमुलेशन और प्रोग्राम फाइलों को भी संलग्न किया है।
अब यह हमारे अगले ट्यूटोरियल में है, हम सीखेंगे कि देरी कार्यों का उपयोग करने के बजाय PIC16F877A टाइमर का उपयोग कैसे करें । आप यहां सभी PIC माइक्रोकंट्रोलर ट्यूटोरियल ब्राउज़ कर सकते हैं।