- हार्डवेयर तैयार हो रहा है
- STM8S103F पर GPIO पिनआउट को समझना
- Pinout विवरण और STM8S103F GPIO चयन के लिए सुझाव
- SPL का उपयोग करके GPIO इनपुट और आउटपुट के लिए प्रोग्रामिंग STM8S
- कार्यक्रम को अपलोड करना और परीक्षण करना
माइक्रोकंट्रोलर्स के लिए, एक एलईडी ब्लिंकिंग प्रोग्राम "हैलो वर्ल्ड" प्रोग्राम के बराबर है। हमारे पिछले ट्यूटोरियल में, हमने सीखा कि STM8S103F3 डेवलपमेंट बोर्ड के साथ कैसे शुरुआत करें और अपने STM8S कंट्रोलर को प्रोग्राम करने के लिए IDE और कंपाइलर कैसे सेट करें। हमने यह भी सीखा है कि मानक परिधीय पुस्तकालयों का उपयोग कैसे करें, और कोड को हमारे माइक्रोकंट्रोलर में कैसे संकलित और अपलोड करें। कवर किए गए सभी मूल बातों के साथ, वास्तव में कोड लिखना शुरू कर देता है। इस ट्यूटोरियल में, हम सीखेंगे कि STM8S नियंत्रकों पर सामान्य GPIO फ़ंक्शन कैसे करें। बोर्ड में पहले से ही पोर्ट बी के पिन 5 से जुड़ा एक ऑनबोर्ड एलईडी है, हम सीखेंगे कि इस एलईडी को कैसे ब्लिंक किया जाए और एक बाहरी एलईडी को भी जोड़ा जाए और इसे पुश-बटन से नियंत्रित किया जाए। यदि आप पूरी तरह से नए हैं, तो इससे पहले कि आप किसी भी आगे बढ़ने से पहले पिछले ट्यूटोरियल को पढ़ने के लिए अत्यधिक अनुशंसित हो।
हार्डवेयर तैयार हो रहा है
इससे पहले कि हम कार्यक्रम में गोता लगाएँ, हार्डवेयर कनेक्शन तैयार होने दें। जैसा कि पहले उल्लेख किया गया है, हम यहां दो एलईडी का उपयोग कर रहे हैं, एक ऑनबोर्ड एलईडी है जो निरंतर झपकी लेगा और दूसरा एक बाहरी एलईडी है जिसे एक पुश बटन के साथ टॉगल किया जाएगा। यह विचार एक सरल सेट अप में सभी GPIO कार्यक्षमता को सीखना है। ऑन-बोर्ड एलईडी पहले से ही PB5 (PORTB के पिन 5) से जुड़ा हुआ है, इसलिए मैंने बस एक एलईडी को PA3 और एक पुश-बटन को PA2 से जोड़ा है, जैसा कि आप नीचे दिए गए चित्र में देख सकते हैं।
लेकिन, हमारे नियंत्रित पर उपलब्ध सभी आउटपुट पिनों में मैंने आउटपुट के लिए PA3 और इनपुट के लिए PA2 का चयन क्यों किया? प्रश्न मान्य हैं और मैं इस लेख में बाद में समझाऊंगा। इस ट्यूटोरियल के लिए मेरा हार्डवेयर सेट-अप नीचे दिखाया गया है। जैसा कि आप देख सकते हैं, मैंने अपने एसटी-लिंक प्रोग्रामर को प्रोग्रामिंग पिन से भी जोड़ा है जो न केवल हमारे बोर्ड को प्रोग्राम करेगा, बल्कि एक शक्ति स्रोत के रूप में भी कार्य करेगा।
STM8S103F पर GPIO पिनआउट को समझना
अब सवाल पर वापस आ रहा हूं, इनपुट के लिए पीए 2 और आउटपुट के लिए पीए 3 क्यों? यह समझने के लिए, आइए नीचे दिखाए गए माइक्रोकंट्रोलर के पिनआउट पर करीब से नज़र डालें।
पिनआउट आरेख के अनुसार, हमारे पास हमारे माइक्रोकंट्रोलर पर चार पोर्ट हैं, अर्थात्, P, A, B, C और D को क्रमशः PA, PB, PC और PD द्वारा निरूपित किया गया है। प्रत्येक GPIO पिन को कुछ अन्य विशेष कार्यक्षमता के साथ भी जोड़ा जाता है। उदाहरण के लिए, PB5 (PORT B का पिन 5) न केवल GPIO पिन के रूप में, बल्कि I2C संचार के लिए SDA पिन और टाइमर 1 आउटपुट पिन के रूप में भी काम कर सकता है। इसलिए, यदि हम इस पिन का उपयोग साधारण GPIO प्रयोजनों के लिए करते हैं जैसे कि LED कनेक्ट करना, तो हम I2C और LED को एक ही समय में उपयोग नहीं कर पाएंगे। अफसोस की बात है कि ऑन-बोर्ड एलईडी इस पिन से जुड़ा हुआ है, इसलिए हमारे पास यहां ज्यादा विकल्प नहीं हैं, और इस कार्यक्रम में, हम I2C का उपयोग नहीं करने जा रहे हैं, इसलिए यह बहुत समस्या नहीं है।
Pinout विवरण और STM8S103F GPIO चयन के लिए सुझाव
सच में, यह PA1 एक इनपुट पिन का उपयोग करने के लिए चोट नहीं होगा और यह सिर्फ पिन काम करेगा। लेकिन मैंने जानबूझकर इसे आपके लिए कुछ सामान्य जाल दिखाने का अवसर प्रदान किया, जिसे आप एक नए माइक्रोकंट्रोलर पर GPIO पिन का चयन करते समय पड़ सकते हैं। जाल से बचने के लिए सबसे अच्छा है कि STM8S103F3P6 डेटशीट में दिए गए पिन विवरण और पिन विवरण को पढ़ें। STM8S103F3P6 माइक्रोकंट्रोलर पिन विवरण के विवरण जो डेटाशीट में उल्लिखित हैं, छवियों के नीचे दिखाए गए हैं।
हमारे माइक्रोकंट्रोलर पर इनपुट पिन या तो फ्लोटिंग या कमजोर पुल-अप हो सकते हैं और आउटपुट पिन या तो ओपन ड्रेन या पुश-पुल हो सकते हैं। ओपन ड्रेन और पुश-पुल आउटपुट पिंस के बीच अंतर पहले से ही चर्चा में है, इसलिए हम इसके विवरण में नहीं आएंगे। इसे सरल करने के लिए, एक ओपन ड्रेन आउटपुट पिन आउटपुट को केवल उतना ही कम नहीं कर सकता है, जबकि एक पुश-पुल आउटपुट पिन आउटपुट को उच्च और उच्च दोनों बना सकता है।
इसके अलावा उपरोक्त तालिका से, आप यह भी देख सकते हैं कि एक आउटपुट पिन या तो फास्ट आउटपुट (10 मेगाहर्ट्ज) या स्लो आउटपुट (2 मेगाहर्ट्ज) हो सकता है। यह GPIO स्पीड निर्धारित करता है, यदि आप अपने GPIO पिन को उच्च और निम्न के बीच बहुत तेजी से स्विच करना चाहते हैं, तो हम फास्ट आउटपुट चुन सकते हैं।
हमारे नियंत्रक पर कुछ GPIO पिन ट्रू ओपन ड्रेन (T) और हाई सिंक करेंट (HS) का समर्थन करते हैं जैसा कि ऊपर की छवि में बताया गया है। ओपन ड्रेन और ट्रू ओपन ड्रेन के बीच पर्याप्त अंतर यह है कि ओपन ड्रेन से जुड़े आउटपुट को माइक्रोकंट्रोलर (वीडीडी) के ऑपरेटिंग वोल्टेज से अधिक नहीं खींचा जा सकता है, जबकि एक सच्चे ओपन-ड्रेन आउटपुट पिन को वीडीडी से अधिक खींचा जा सकता है। उच्च सिंक क्षमता वाले पिंस का मतलब है कि यह अधिक वर्तमान को डुबो सकता है। किसी भी GPIO HS पिन का स्रोत और सिंक करंट 20mA है, जबकि बिजली लाइन 100 mA तक की खपत कर सकती है।
उपरोक्त छवि पर करीब से नज़र डालने पर, आप देखेंगे कि लगभग सभी GPIO पिन पीबी 4 और पीबी 5 को छोड़कर हाई सिंक करंट (एचएस) प्रकार हैं जो ट्रू ओपन ड्रेन टाइप (टी) हैं। इसका मतलब है कि इन पिनों को उच्च नहीं बनाया जा सकता है, वे पिन उच्च होने पर भी 3.3V प्रदान करने में सक्षम नहीं होंगे। यही कारण है कि एलईडी जहाज एक 3.3V से जुड़ा हुआ है और इसे GPIO पिन से सीधे पावर करने के बजाय PB5 के माध्यम से ग्राउंड किया गया है।
विस्तृत पिन विवरण के लिए डेटाशीट पर पृष्ठ 28 का संदर्भ लें। जैसा कि ऊपर की छवि में बताया गया है, PA1 स्वचालित रूप से एक कमजोर पुल-अप के रूप में कॉन्फ़िगर किया गया है और इसे आउटपुट पिन के रूप में उपयोग करने की अनुशंसा नहीं की जाती है। वैसे भी इसे एक पुश-बटन के साथ एक इनपुट पिन के रूप में उपयोग किया जा सकता है, लेकिन मैंने प्रोग्राम से पुल अप को सक्षम करने के लिए पीए 2 का उपयोग करने का निर्णय लिया। ये कुछ बुनियादी चीजें हैं जो तब उपयोगी होंगी जब हम बहुत अधिक जटिल कार्यक्रम लिखेंगे। अभी के लिए, यह ठीक है यदि कई चीजें आपके सिर से उछल जाती हैं, तो हम इसे अन्य ट्यूटोरियल में लेयर में लाएंगे।
SPL का उपयोग करके GPIO इनपुट और आउटपुट के लिए प्रोग्रामिंग STM8S
एक कार्यक्षेत्र और नई परियोजना बनाएं जैसा कि हमने अपने पहले ट्यूटोरियल में चर्चा की थी। आप सभी हेडर और स्रोत फ़ाइलों को जोड़ सकते हैं या केवल gpio, config और stm8s फ़ाइलों को जोड़ सकते हैं। Main.c फ़ाइल खोलें और अपना प्रोग्राम लिखना शुरू करें।
सुनिश्चित करें कि आपने शीर्ष लेख फ़ाइलों को शामिल किया है जैसा कि ऊपर की छवि में दिखाया गया है। Main.c फाइल खोलें और कोड शुरू करें। इस पृष्ठ के निचले भाग में पूरा मेन सी कोड पाया जा सकता है और आप वहाँ से प्रोजेक्ट फ़ाइल भी डाउनलोड कर सकेंगे। कोड की व्याख्या इस प्रकार है, यदि आप कोडिंग भाग के बारे में भ्रमित हैं, तो आप एसपीएल उपयोगकर्ता पुस्तिका या इस पृष्ठ के नीचे लिंक किए गए वीडियो को भी देख सकते हैं।
आवश्यक पोर्ट को डी-इनिशियलाइज़ करना
हम अपने कार्यक्रम की शुरुआत आवश्यक बंदरगाहों को डी-इनिशियलाइज़ करके करते हैं। जैसा कि हमने पहले चर्चा की, प्रत्येक GPIO पिन में सामान्य इनपुट और आउटपुट की तरह काम करने के अलावा इसके साथ जुड़े कई अन्य कार्य होंगे। यदि इन पिनों को पहले कुछ अन्य अनुप्रयोगों के लिए उपयोग किया गया है, तो इसका उपयोग करने से पहले इसे डी-इनिशियलाइज़ किया जाना चाहिए। यह अनिवार्य नहीं है, हालांकि, यह एक अच्छा अभ्यास है। कोड की निम्नलिखित दो पंक्तियों का उपयोग डी- इनिशियल पोर्ट ए और पोर्ट बी के लिए किया जाता है। बस सिंटैक्स GPIO_DeInit (GPIOx) का उपयोग करें ; और x के स्थान पर पोर्ट नाम का उल्लेख करें।
GPIO_DeInit (GPIOA); // GPIO_DeInit (GPIOB) काम करने के लिए पोर्ट ए तैयार करें; // काम करने के लिए पोर्ट बी तैयार करें
इनपुट और आउटपुट GPIO घोषणा
अगला, हमें यह घोषित करना होगा कि कौन सा पिन इनपुट के रूप में और कौन सा आउटपुट के रूप में उपयोग किया जाएगा। हमारे मामले में, पिन PA2 का उपयोग इनपुट के रूप में किया जाएगा, हम इस पिन को आंतरिक पुल-अप के साथ भी घोषित करेंगे ताकि हमें बाहरी रूप से उपयोग न करना पड़े। वाक्य रचना GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z) है; । जहाँ x का पोर्ट नाम है, y पिन नंबर है, और z GPIO पिन मोड है।
// PA2 को इनपुट के रूप में घोषित करें पिन पिन GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
अगला, हमें पिंस पीए 3 और पीबी 5 को आउटपुट घोषित करना होगा। फिर से कई तरह के आउटपुट डिक्लेरेशन संभव हैं लेकिन हम “GPIO_MODE_OUT_PP_LOW_SLOW” का उपयोग कर रहे हैं, जिसका अर्थ है कि हम इसे धीमी गति के साथ पुश-पुल प्रकार के आउटपुट पिन के रूप में घोषित करेंगे। और डिफ़ॉल्ट रूप से, मूल्य कम होगा। वाक्य-विन्यास समान होगा।
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // PB5 को पुश पुल आउटपुट पिन GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW) के रूप में घोषित करें;
एसपीएल उपयोगकर्ता पुस्तिका से नीचे स्नैपशॉट सभी संभव GPIO मोड (z) का उल्लेख करता है।
लूप होते हुए भी अनंत
पिन घोषणा के बाद, हमें एक अनंत लूप बनाने की जरूरत है जिसके अंदर हम हमेशा के लिए एलईडी को झपकाते रहेंगे और एलईडी को चालू करने के लिए पुश बटन की स्थिति की निगरानी करेंगे। अनंत लूप या तो थोड़ी देर (1) या (;;) के साथ बना सकते हैं । यहाँ मैंने (1) का उपयोग किया है ।
जबकि (1) {}
इनपुट पिन की स्थिति की जाँच करना
हमें इनपुट पिन की स्थिति की जांच करनी है, जो करने के लिए सिंटैक्स GPIO_ReadInputPin (GPIOx, GPIO_PIN_y) है; जहां x पोर्ट नाम है और y पिन नंबर है। यदि पिन अधिक है, तो हमें '1' मिलेगा और यदि पिन कम है, तो हमें '0' मिलेगा। यदि पिन उच्च या निम्न है, तो यह जांचने के लिए हमने एक लूप के अंदर का उपयोग किया है।
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // अगर बटन दबाया जाए
GPIO पिन को उच्च या निम्न बनाना
GPIO पिन को उच्च या निम्न बनाने के लिए, हम GPIO_WriteHigh (GPIOx, GPIO_PIN_y) का उपयोग कर सकते हैं ; और GPIO_Witeite (GPIOx, GPIO_PIN_y); क्रमशः। यहां हमने बटन को दबाने के लिए एलईडी को चालू किया है और यदि बटन नहीं दबाया है तो बंद कर दें।
अगर (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // // बटन दबाया तो GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ON GP GP_WriteHigh (GPIOA, GPIO_PIN_3); //नेतृत्व किया
एक GPIO पिन टॉगल करना
GPIO पिन टॉगल करने के लिए, हमारे पास GPIO_WriteReverse (GPIOx, GPIO_PIN_R) है; इस फ़ंक्शन को कॉल करने से आउटपुट पिन की स्थिति बदल जाएगी। यदि पिन अधिक है, तो इसे निम्न में बदल दिया जाएगा, और यदि यह कम है, तो इसे उच्च में बदल दिया जाएगा। हम पीबी 5 पर ऑनबोर्ड एलईडी को ब्लिंक करने के लिए इस फ़ंक्शन का उपयोग कर रहे हैं।
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
देरी समारोह
Arduino के विपरीत, कॉस्मिक कंपाइलर में पूर्व-परिभाषित विलंब फ़ंक्शन नहीं होता है। इसलिए हमें अपने दम पर एक बनाना होगा। मेरा विलंब समारोह नीचे दिया गया है। वैल्यू डो को देरी से वेरिएबल एमएस में प्राप्त किया जाएगा और हम लूप को होल्ड करने या प्रोग्राम के निष्पादन के लिए दो का उपयोग करेंगे। जैसे _asm ("nop") एक असेंबली इंस्ट्रक्शन है, जो बिना किसी ऑपरेशन के आता है। इसका मतलब यह है कि नियंत्रक किसी भी ऑपरेशन को निष्पादित किए बिना लूप के लिए लूपिंग करेगा, इस प्रकार एक देरी पैदा करेगा।
शून्य विलंब (int ms) // फ़ंक्शन परिभाषा {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // कोई संचालन न करें // विधानसभा कोड}}
कार्यक्रम को अपलोड करना और परीक्षण करना
अब जब हमारा कार्यक्रम तैयार हो गया है, हम इसे अपलोड कर सकते हैं और इसका परीक्षण कर सकते हैं। एक बार अपलोड होने के बाद, मेरा हार्डवेयर उम्मीद के मुताबिक काम कर रहा था। ऑन-बोर्ड रेड एलईडी हर 500 मिलीसेकंड के लिए ब्लिंक कर रहा था और हर बार जब मैंने स्विच दबाया तो बाहरी ग्रीन एलईडी चालू हो गई।
पूरा काम नीचे दिए गए वीडियो में पाया जा सकता है। एक बार जब आप इस बिंदु पर पहुंच जाते हैं, तो आप स्विच और एलईडी को विभिन्न पिनों से कनेक्ट करने और अवधारणा को समझने के लिए कोड को फिर से लिखने का प्रयास कर सकते हैं। यदि आपने अवधारणाओं को स्पष्ट रूप से समझा है, तो आप यह जांचने के लिए विलंब समय के साथ भी खेल सकते हैं।
यदि आपके कोई प्रश्न हैं, तो कृपया उन्हें नीचे टिप्पणी अनुभाग में और अन्य तकनीकी प्रश्नों के लिए छोड़ दें, आप हमारे मंचों का उपयोग कर सकते हैं। निम्नलिखित के लिए धन्यवाद, आप अगले ट्यूटोरियल में देखें।