- आवश्यकताएँ:
- UART संचार के लिए प्रोग्रामिंग PIC माइक्रोकंट्रोलर:
- हमारे कार्यक्रम का अनुकरण:
- हार्डवेयर सेटअप और आउटपुट का परीक्षण:
इस ट्यूटोरियल में हम UART संचार को PIC माइक्रोकंट्रोलर के साथ सक्षम करना सीखते हैं और अपने कंप्यूटर से डेटा ट्रांसफर कैसे करते हैं । अब तक, हमने एडीसी, टाइमर, पीडब्लूएम जैसे सभी बुनियादी मॉड्यूल को कवर किया है और यह भी सीखा है कि एलसीडी और 7-सेगमेंट डिस्प्ले को कैसे इंटरफ़ेस किया जाए। अब, हम अपने आप को UART नामक एक नए संचार उपकरण से लैस करेंगे, जो कि अधिकांश माइक्रोकंट्रोलर परियोजनाओं में व्यापक रूप से उपयोग किया जाता है। यहां MPLAB और XC8 का उपयोग करके हमारे संपूर्ण PIC माइक्रोकंट्रोलर ट्यूटोरियल देखें।
यहां हमने PIC16F877A MCU का उपयोग किया है, इसका एक मॉड्यूल है जिसे "पता योग्य यूनिवर्सल सिंक्रोनस अतुल्यकालिक रिसीवर और ट्रांसमीटर" कहा जाता है, जिसे जल्द ही USART के रूप में जाना जाता है । USART एक दो तार संचार प्रणाली है जिसमें डेटा क्रमिक रूप से प्रवाहित होता है। USART एक पूर्ण-द्वैध संचार भी है, जिसका अर्थ है कि आप उसी समय डेटा भेज और प्राप्त कर सकते हैं जिसका उपयोग परिधीय उपकरणों जैसे कि CRT टर्मिनलों और व्यक्तिगत कंप्यूटरों के साथ संचार करने के लिए किया जा सकता है।
USART निम्नलिखित मोड में विन्यस्त किया जा सकता:
- अतुल्यकालिक (पूर्ण-द्वैध)
- तुल्यकालिक - मास्टर (आधा द्वैध)
- तुल्यकालिक - गुलाम (आधा द्वैध)
8-बिट और 9-बिट मोड अर्थात् दो अलग-अलग मोड भी हैं, इस ट्यूटोरियल में हम 8-बिट संचार प्रणाली के साथ अतुल्यकालिक मोड में काम करने के लिए USART मॉड्यूल को कॉन्फ़िगर करेंगे, क्योंकि यह संचार का सबसे अधिक उपयोग किया जाने वाला प्रकार है। जैसा कि यह अतुल्यकालिक है, इसे डेटा सिग्नल के साथ घड़ी सिग्नल भेजने की आवश्यकता नहीं है। UART भेजने (Tx) और प्राप्त करने (Rx) डेटा के लिए दो डेटा लाइनों का उपयोग करता है। दोनों उपकरणों का आधार भी सामान्य होना चाहिए। इस प्रकार का संचार एक सामान्य घड़ी साझा नहीं करता है इसलिए प्रणाली के काम करने के लिए एक सामान्य आधार बहुत महत्वपूर्ण है।
इस ट्यूटोरियल के अंत में आप अपने कंप्यूटर और अपने PIC माइक्रोकंट्रोलर के बीच एक संचार (UART) स्थापित करने में सक्षम होंगे और अपने लैपटॉप से PIC बोर्ड पर एक एलईडी टॉगल करेंगे। LED की स्थिति PIC MCU से आपके लैपटॉप पर भेजी जाएगी। हम कंप्यूटर में हाइपर टर्मिनल का उपयोग करके आउटपुट का परीक्षण करेंगे। इस ट्यूटोरियल के अंत में विस्तृत वीडियो भी दिया गया है।
आवश्यकताएँ:
हार्डवेयर:
- PIC16F877A परफेक्ट बोर्ड
- RS232 USB कनवर्टर मॉड्यूल के लिए
- संगणक
- PICkit 3 प्रोग्रामर
सॉफ्टवेयर:
- MPLABX
- अति अवसान
एक यूएसबी कनवर्टर करने के लिए RS232 कंप्यूटर पठनीय रूप में धारावाहिक डेटा कन्वर्ट करने के लिए आवश्यक है। अपने स्वयं के मॉड्यूल को खरीदने के बजाय अपने स्वयं के सर्किट को डिजाइन करने के तरीके हैं लेकिन वे विश्वसनीय नहीं हैं क्योंकि वे शोर के अधीन हैं। जो हम उपयोग कर रहे हैं वह नीचे दिखाया गया है
नोट: प्रत्येक RS232 USB कनवर्टर करने के लिए एक विशेष ड्राइवर की आवश्यकता होगी; जैसे ही आप डिवाइस में प्लग करते हैं, उनमें से अधिकांश स्वचालित रूप से इंस्टॉल हो जाना चाहिए। लेकिन, अगर यह आराम नहीं करता है !!! टिप्पणी अनुभाग का उपयोग करें और मैं आपकी सहायता करूंगा।
UART संचार के लिए प्रोग्रामिंग PIC माइक्रोकंट्रोलर:
सभी मॉड्यूल (ADC, टाइमर, PWM) की तरह हमें भी अपने PIC16F877A MCU के हमारे USART मॉड्यूल को इनिशियलाइज़ करना चाहिए और इसे UART 8-बिट कम्युनिकेशन मोड में काम करने का निर्देश देना चाहिए। चलो कॉन्फ़िगरेशन बिट्स को परिभाषित करते हैं और UART आरंभीकरण फ़ंक्शन के साथ शुरू करते हैं।
PIC माइक्रोकंट्रोलर के UART मॉड्यूल की शुरुआत:
Tx और Rx पिन शारीरिक रूप से पिन RC6 और RC7 में मौजूद हैं। डेटाशीट के अनुसार आइए TX को आउटपुट के रूप में घोषित करें और आरएक्स को इनपुट के रूप में ।
// **** UART के लिए I / O पिन सेट करना **** // TRISC6 = 0; // TX पिन आउटपुट TRISC7 = 1 के रूप में सेट; // RX पिन सेट इनपुट के रूप में // ________ I / O पिन सेट __________ //
अब बॉड दर निर्धारित करनी होगी । बॉड दर वह दर है जिस पर संचार चैनल में सूचना स्थानांतरित की जाती है। यह कई डिफ़ॉल्ट मूल्यों में से एक हो सकता है, लेकिन इस कार्यक्रम में हम 9600 का उपयोग कर रहे हैं क्योंकि इसकी सबसे अधिक उपयोग की जाने वाली बॉड दर है।
/ ** आवश्यक बॉड दर के लिए एसपीबीआरजी रजिस्टर शुरू करें और तेजी से बॉड_रेट के लिए बीआरजीएच सेट करें ** / एसपीबीआरजी = ((_XTAL_FREQ / 16) / बॉड_रेट) - 1; BRGH = 1; // उच्च बॉड_रेट के लिए // _________ बॉड_रेट की समाप्ति _________ //
बॉड दर का मूल्य रजिस्टर SPBRG का उपयोग करके सेट किया जाना है, मूल्य बाहरी क्रिस्टल आवृत्ति के मूल्य पर निर्भर करता है, बॉड दर की गणना करने के सूत्र नीचे दिखाए गए हैं:
SPBRG = ((_XTAL_FREQ / 16) / बॉड_रेट) - 1;
उच्च गति बिट दर को सक्षम करने के लिए बिट BRGH को उच्च बनाया जाना चाहिए। डेटाशीट (पृष्ठ 13) के अनुसार इसे सक्षम करने के लिए हमेशा फायदेमंद होता है, क्योंकि यह संचार के दौरान त्रुटियों को समाप्त कर सकता है।
जैसा कि पहले कहा गया है कि हम एसिंक्रोनस मोड में काम करेंगे, इसलिए बिट SYNC को शून्य बनाया जाना चाहिए और सीरियल पिन (TRISC6 और TRICSC5) को सक्षम करने के लिए बिट SPEM को उच्च बनाया जाना चाहिए
// **** एसिंक्रोनस सीरियल पोर्ट को सक्षम करें ******* // SYNC = 0; // एसिंक्रोनस एसपीएन = 1; // सीरियल पोर्ट पिन सक्षम करें // _____ अतुल्यकालिक सीरियल पोर्ट सक्षम _______ //
इस ट्यूटोरियल में हम MCU और कंप्यूटर के बीच डेटा भेजना और प्राप्त करना दोनों होंगे, इसलिए हमें TXEN और CREN बिट्स को सक्षम करना होगा ।
// ** आओ हम ट्रांसमिशन और रिसेप्शन की तैयारी करें। // TXEN = 1; // सक्षम संचरण CREN = 1; // सक्षम रिसेप्शन // __ UART मॉड्यूल ऊपर और ट्रांसमिशन और रिसेप्शन के लिए तैयार __ //
बिट्स TX9 और RX9 शून्य किए जाने के लिए है ताकि हम 8 बिट मोड में कार्य करते हैं। अगर उच्च विश्वसनीयता स्थापित करनी है तो 9-बिट मोड का चयन किया जा सकता है।
// ** 8-बिट मोड का चयन करें ** // TX9 = 0; // 8-बिट रिसेप्शन चयनित RX9 = 0; // 8-बिट रिसेप्शन मोड चयनित // __ 8-बिट मोड चयनित __ //
इसके साथ हम अपना इनिशियलाइज़ेशन सेटअप पूरा करते हैं। और ऑपरेशन के लिए तैयार है।
UART का उपयोग करके डेटा संचारित करना:
नीचे दिए गए फ़ंक्शन का उपयोग UART मॉड्यूल के माध्यम से डेटा प्रसारित करने के लिए किया जा सकता है:
// ** UART को तारीख का एक बाइट भेजने का कार्य ** // void UART_send_char (char bt) {{जबकि (TXIF); // प्रोग्राम को तब तक पकड़ें जब तक कि TX बफर फ्री TXREG = bt; // प्राप्त मान के साथ ट्रांसमीटर बफर लोड करें // // _____________ फ़ंक्शन का अंत ________________ //
एक बार जब मॉड्यूल को इनिशियलाइज़ किया जाता है तो जो भी मूल्य रजिस्टर TXREG में लोड किया जाता है वह UART के माध्यम से प्रसारित होगा, लेकिन ट्रांसमिशन ओवरलैप हो सकता है। इसलिए हमें हमेशा ट्रांसमिशन इंटरप्ट फ्लैग TXIF की जांच करनी चाहिए । केवल अगर यह बिट कम है तो हम ट्रांसमिशन के लिए अगले बिट के साथ आगे बढ़ सकते हैं अन्यथा हमें इस ध्वज के कम होने की प्रतीक्षा करनी चाहिए।
हालांकि, उपरोक्त फ़ंक्शन का उपयोग केवल डेटा के केवल एक बाइट को भेजने के लिए किया जा सकता है, एक पूर्ण भेजने के लिए नीचे फ़ंक्शन का उपयोग किया जाना चाहिए
// ** स्ट्रिंग को बाइट में परिवर्तित करने का कार्य // इसे बाइट डेटा के रूप में प्रोसेस करें} // ___________ फ़ंक्शन का अंत ______________ //
यह फ़ंक्शन समझने में थोड़ा मुश्किल हो सकता है क्योंकि इसमें पॉइंटर्स हैं, लेकिन मुझे विश्वास है कि पॉइंटर्स अद्भुत हैं और वे प्रोग्रामिंग को अधिक आसान बनाते हैं और यह उसी का एक अच्छा उदाहरण है।
जैसा कि आप देख सकते हैं कि हमने फिर से UART_send_char () कहा है, लेकिन अब जबकि लूप के अंदर है। हमने स्ट्रिंग को अलग-अलग वर्णों में विभाजित किया है, हर बार जब यह फ़ंक्शन कहा जाता है, तो एक चार TXREG को भेजा जाएगा और यह प्रसारित हो जाएगा।
UART का उपयोग करके डेटा प्राप्त करना:
UART मॉड्यूल से डेटा प्राप्त करने के लिए निम्नलिखित फ़ंक्शन का उपयोग किया जा सकता है:
// ** UART से तारीख का एक बाइट पाने का कार्य ** // char UART_get_char () {if (OERR) // त्रुटि के लिए जाँच करें {CREN = 0; // यदि त्रुटि -> रीसेट CREN = 1; // यदि त्रुटि -> रीसेट} जबकि (! RCIF); // कार्यक्रम को पकड़ें जब तक कि आरएक्स बफर मुफ्त रिटर्न आरसीआरईजी न हो; // मान प्राप्त करें और इसे मुख्य समारोह में भेजें} // _____________ फ़ंक्शन का अंत ________________ //
जब कोई डेटा UART मॉड्यूल द्वारा प्राप्त किया जाता है तो इसे उठाता है और इसे RCREG रजिस्टर में संग्रहीत करता है । हम बस किसी भी वैरिएबल को मान ट्रांसफर कर सकते हैं और उसका उपयोग कर सकते हैं। लेकिन ओवरलैप त्रुटि हो सकती है या उपयोगकर्ता लगातार डेटा भेज रहा हो सकता है और हमने अभी तक उन्हें एक चर में स्थानांतरित नहीं किया है।
उस स्थिति में रिसीव फ्लैग बिट आरसीआईएफ बचाव के लिए आता है। जब भी कोई डेटा प्राप्त होगा और यह अभी तक संसाधित नहीं हुआ है, तो यह कम हो जाएगा। इसलिए जब तक हम उस मूल्य से निपटने के लिए कार्यक्रम को आयोजित करने में देरी करते हुए लूप का उपयोग करते हैं।
PIC माइक्रोकंट्रोलर के UART मॉड्यूल का उपयोग करके टॉगलिंग एलईडी:
अब हम प्रोग्राम के अंतिम भाग, शून्य मुख्य (शून्य) फ़ंक्शन पर आते हैं, जहां हम PIC और कंप्यूटर के बीच UART संचार का उपयोग करते हुए कंप्यूटर के माध्यम से एक एलईडी टॉगल करेंगे ।
जब हम एक चरित्र "1" (कंप्यूटर से) भेजते हैं, तो एलईडी चालू हो जाएगा और स्थिति संदेश "RED LED -> ON" कंप्यूटर पर वापस (PIC MCU से) भेजा जाएगा।
इसी तरह हम एक वर्ण "0" (कंप्यूटर से) भेजते हैं, एलईडी बंद हो जाएगा और स्थिति संदेश "RED LED -> OFF" कंप्यूटर पर वापस (PIC MCU से) भेजा जाएगा।
जबकि (1) // अनंत लूप {get_value = UART_get_char (); if (get_value == '1') // यदि उपयोगकर्ता "1" {RB3 = 1 भेजता है; // LED UART_send_string ("RED LED -> ON") चालू करें; // कंप्यूटर को सूचना भेजें UART_send_char (10); // ASCII मान 10 का उपयोग गाड़ी वापसी (नई लाइन में प्रिंट करने के लिए) के लिए किया जाता है} अगर (get_value == '0') // यदि उपयोगकर्ता "0" {RB3 भेजता है = 0; // LED UART_send_string ("RED -> OFF") बंद करें; // कंप्यूटर को सूचना भेजें UART_send_char (10); // ASCII मान 10 का उपयोग गाड़ी वापसी (नई लाइन में प्रिंट करने के लिए) के लिए किया जाता है}}
हमारे कार्यक्रम का अनुकरण:
हमेशा की तरह चलो हमारे कार्यक्रम को प्रोटीस का उपयोग करके अनुकरण करते हैं और पता लगाते हैं कि क्या यह उम्मीद के मुताबिक काम करता है।
उपरोक्त छवि एक आभासी टर्मिनल दिखाती है जिसमें एक यह एलईडी का स्वागत संदेश और स्थिति दिखाता है। रेड कलर एलईडी को पिन RB3 से जोड़ा जा सकता है। सिमुलेशन के विस्तृत काम को वीडियो में अंत में पाया जा सकता है ।
हार्डवेयर सेटअप और आउटपुट का परीक्षण:
इस सर्किट का कनेक्शन वास्तव में सरल है, हम अपने PIC perf बोर्ड का उपयोग करते हैं और बस तीन तारों को RS232 से USB कनवर्टर से कनेक्ट करते हैं और USB डेटा केबल का उपयोग करके मॉड्यूल को हमारे कंप्यूटर से कनेक्ट करते हैं जैसा कि नीचे दिखाया गया है।
अगला हम हाइपर टर्मिनल एप्लिकेशन इंस्टॉल करते हैं (इसे यहां से डाउनलोड करें) और इसे खोलें। इसे कुछ इस तरह दिखाना चाहिए
अब अपने कंप्यूटर पर डिवाइस मैनेजर खोलें और चेक करें कि आपका मॉड्यूल किस कॉम पोर्ट से जुड़ा है, मेरा COM पोर्ट 17 से जुड़ा है जैसा कि नीचे दिखाया गया है
नोट: आपके मॉड्यूल का COM पोर्ट नाम आपके विक्रेता के अनुसार बदल सकता है, यह कोई समस्या नहीं है।
अब हाइपर टर्मिनल एप्लिकेशन पर वापस जाएं और निम्न पॉप-अप बॉक्स प्राप्त करने के लिए सेट अप -> पोर्ट कॉन्फ़िगरेशन या Alt + C दबाएं, और पॉप-अप विंडो में वांछित पोर्ट (COM17 मेरे मामले में) का चयन करें और कनेक्ट पर क्लिक करें ।
एक बार कनेक्शन स्थापित होने के बाद अपने PIC परफेक्ट बोर्ड को चालू करें और आपको नीचे कुछ इस तरह दिखना चाहिए
कमांड विंडो में अपना कर्सर रखें और 1 दर्ज करें फिर एंटर दबाएं। एलईडी को चालू किया जाएगा और नीचे दिखाए अनुसार स्थिति प्रदर्शित की जाएगी।
उसी तरह, अपने कर्सर को कमांड विंडो में रखें और 0 दर्ज करें फिर एंटर दबाएं। एलईडी को बंद कर दिया जाएगा और नीचे दिखाए अनुसार स्थिति प्रदर्शित की जाएगी।
नीचे पूरा कोड और विस्तृत वीडियो दिया गया है , जो यह बताएगा कि "1" और "0" के लिए वास्तविक समय में एलईडी कैसे प्रतिक्रिया करता है।
यही कारण है कि दोस्तों, हमने अपने कंप्यूटर के साथ PIC UART को बाधित किया है और हाइपर टर्मिनल का उपयोग करके एलईडी को चालू करने के लिए डेटा स्थानांतरित किया है । आशा है कि आप समझ गए होंगे, यदि नहीं, तो अपनी क्वेरी पूछने के लिए टिप्पणी अनुभाग का उपयोग करें। हमारे अगले ट्यूटोरियल में हम फिर से UART का उपयोग करेंगे लेकिन ब्लूटूथ मॉड्यूल का उपयोग करके इसे और अधिक दिलचस्प बना देंगे और डेटा को हवा में प्रसारित करेंगे।
इसके अलावा दो ATmega8 माइक्रोकंट्रोलर्स और UART संचार ATmega8 और Arduino Uno के बीच UART संचार की जाँच करें।