- I2C संचार प्रोटोकॉल क्या है?
- I2C संचार कैसे काम करता है?
- I2C संचार का उपयोग कहां करें?
- X28 कम्पाइलर का उपयोग करके PIC16F877a के साथ I2C
- I2C हेडर फ़ाइलों का उपयोग करके प्रोग्रामिंग:
- प्रोटीज सिमुलेशन:
PIC माइक्रोकंट्रोलर्स एम्बेडेड प्रोजेक्ट्स के लिए माइक्रोचिप द्वारा प्रदान किया जाने वाला एक शक्तिशाली मंच है, इसकी बहुमुखी प्रकृति ने इसे कई अनुप्रयोगों में तरीके खोजने के लिए बनाया है और चरण अभी भी चल रहा है। यदि आप हमारे PIC ट्यूटोरियल्स का अनुसरण कर रहे हैं, तो आपने देखा होगा कि हमने बहुत ही बेसिक्स से शुरू होने वाले PIC माइक्रोकंट्रोलर पर पहले से ही कई तरह के ट्यूटोरियल कवर किए हैं। अब से, हमने बुनियादी बातों को कवर कर लिया है जिससे हम संचार पोर्टल की तरह अधिक दिलचस्प सामानों में शामिल हो सकते हैं।
एम्बेडेड अनुप्रयोगों की विशाल प्रणाली में, कोई भी माइक्रोकंट्रोलर सभी गतिविधियों को खुद से नहीं कर सकता है। किसी समय में सूचना साझा करने के लिए अन्य उपकरणों से संवाद करना पड़ता है, इन सूचनाओं को साझा करने के लिए कई अलग-अलग प्रकार के संचार प्रोटोकॉल हैं, लेकिन सबसे अधिक उपयोग किए जाने वाले USART, IIC, SPI और CAN हैं । प्रत्येक संचार प्रोटोकॉल का अपना लाभ और नुकसान है। आइए अब मैं इस ट्यूटोरियल में सीखने के लिए आइआइसी के हिस्से पर ध्यान केंद्रित करता हूं ।
I2C संचार प्रोटोकॉल क्या है?
IIC शब्द " इंटर इंटीग्रेटेड सर्किट " के लिए है। इसे सामान्य रूप से I2C के रूप में निरूपित किया जाता है या I C या कुछ स्थानों पर 2-वायर इंटरफ़ेस प्रोटोकॉल (TWI) के रूप में भी स्क्वेर किया जाता है, लेकिन यह सभी का अर्थ समान है। I2C एक तुल्यकालिक संचार प्रोटोकॉल अर्थ है, दोनों डिवाइस जो सूचना साझा कर रहे हैं, उन्हें एक सामान्य घड़ी संकेत साझा करना होगा। इसमें जानकारी साझा करने के लिए केवल दो तार हैं जिनमें से एक का उपयोग मुर्गा सिग्नल के लिए किया जाता है और दूसरे का उपयोग डेटा भेजने और प्राप्त करने के लिए किया जाता है।
I2C संचार कैसे काम करता है?
I2C संचार पहली बार फिलिप्स द्वारा पेश किया गया था। जैसा कि पहले कहा गया है कि इसमें दो तार हैं, ये दो तार दो उपकरणों में जुड़े होंगे। यहाँ एक उपकरण को मास्टर और दूसरे उपकरण को दास कहा जाता है । संचार दो मास्टर और एक दास के बीच हमेशा होना चाहिए । I2C संचार का लाभ यह है कि एक से अधिक दास एक मास्टर से जुड़े हो सकते हैं।
संपूर्ण संचार इन दो तारों के माध्यम से होता है, सीरियल क्लॉक (एससीएल) और सीरियल डेटा (एसडीए)।
सीरियल क्लॉक (SCL): मास्टर द्वारा उत्पन्न घड़ी संकेत को दास के साथ साझा करता है
सीरियल डेटा (एसडीए): मास्टर और गुलाम के बीच और बाहर डेटा भेजता है।
किसी भी समय केवल मास्टर संचार शुरू करने में सक्षम होंगे। चूंकि बस में एक से अधिक दास हैं, इसलिए स्वामी को एक अलग पते का उपयोग करके प्रत्येक दास का उल्लेख करना होगा। जब केवल उस विशेष पते के साथ सलामी को संबोधित किया जाता है तो वह सूचनाओं के साथ वापस आ जाएगा, जबकि बाकी लोग छोड़ देते हैं। इस तरह हम एक ही बस का उपयोग कई उपकरणों के साथ संवाद करने के लिए कर सकते हैं।
I2C संचार का उपयोग कहां करें?
I2C संचार का उपयोग केवल कम दूरी के संचार के लिए किया जाता है । यह निश्चित रूप से एक हद तक विश्वसनीय है क्योंकि इसमें स्मार्ट बनाने के लिए एक सिंक्रनाइज़ घड़ी पल्स है। यह प्रोटोकॉल मुख्य रूप से सेंसर या अन्य उपकरणों के साथ संचार करने के लिए उपयोग किया जाता है, जिसे किसी मास्टर को जानकारी भेजनी होती है। यह बहुत आसान है जब एक माइक्रोकंट्रोलर को केवल अन्य तारों का उपयोग करके कई अन्य गुलाम मॉड्यूल के साथ संवाद करना पड़ता है। यदि आप एक लंबी दूरी के संचार की तलाश कर रहे हैं, तो आपको RS232 की कोशिश करनी चाहिए और यदि आप अधिक विश्वसनीय संचार की तलाश कर रहे हैं, तो आपको SPI प्रोटोकॉल का प्रयास करना चाहिए।
X28 कम्पाइलर का उपयोग करके PIC16F877a के साथ I2C
परिचयात्मक रूप से पर्याप्त, इसे अंदर लाने दें और जानें कि I2C संचार करने के लिए हम माइक्रोकंट्रोलर का उपयोग कैसे कर सकते हैं। इससे पहले कि हम यह स्पष्ट करें कि यह ट्यूटोरियल केवल X168 संकलक का उपयोग करके PIC16F877a में I2C के बारे में बात करता है, प्रक्रिया अन्य माइक्रोकंट्रोलर के लिए समान होगी लेकिन इसमें थोड़े बदलाव की आवश्यकता हो सकती है। यह भी याद रखें कि PIC18F श्रृंखला जैसे उन्नत माइक्रोकंट्रोलर्स के लिए कंपाइलर में कुछ लाइब्रेरी हो सकती हैं जो I2C सुविधाओं का उपयोग करने के लिए बनाई गई हों, लेकिन PIC16F877A के लिए ऐसा कुछ भी मौजूद नहीं है ताकि हम अपने दम पर निर्माण कर सकें। यहां बताई गई लाइब्रेरी को नीचे की ओर डाउनलोड के लिए एक हेडर फाइल के रूप में दिया जाएगा जो कि अन्य I2C उपकरणों के साथ संचार करने के लिए PIC16F877A के लिए उपयोग किया जा सकता है।
हमेशा कुछ भी शुरू करने के लिए सबसे अच्छी जगह हमारी डेटाशीट है। डेटशीट में I2C के बारे में विवरण देखें और जांचें कि कौन से रजिस्टर को कॉन्फ़िगर करना है। मैं विवरण में व्याख्या नहीं करने जा रहा हूं क्योंकि डेटाशीट पहले ही आपके लिए कर चुका है। आगे मैं हेडर फ़ाइल में मौजूद विभिन्न कार्यों और कार्यक्रम में उनकी जिम्मेदारी के बारे में बताने जा रहा हूँ।
शून्य I2C_Initialize ()
आरंभिक फ़ंक्शन का उपयोग माइक्रोकंट्रोलर को यह बताने के लिए किया जाता है कि हम I2C प्रोटोकॉल का उपयोग करने जा रहे हैं। यह SSPCON और SSPCON2 रजिस्टर पर आवश्यक बिट्स सेट करके किया जा सकता है। पहला कदम IIC पिनों को इनपुट पिन घोषित करना होगा, यहां पिन RC3 और RC4 का उपयोग I2C संचार के लिए किया जाना चाहिए, इसलिए हम उन्हें इनपुट पिन के रूप में घोषित करते हैं। इसके बाद हमें SSPCON और SSPCON2 सेट करना चाहिए जो MSSP कंट्रोल रजिस्टर है। हम FOSC / (4 * (SSPADD + 1)) की घड़ी आवृत्ति के साथ IIC मास्टर मोड में PIC का संचालन कर रहे हैं । यह समझने के लिए नीचे टिप्पणी लाइनों में उल्लिखित डेटशीट के पेज नंबरों को देखें कि क्यों उस विशेष रजिस्टर को इस तरह सेट किया गया है।
इसलिए अगली बार हमें घड़ी की आवृत्ति सेट करनी होगी, विभिन्न अनुप्रयोगों के लिए घड़ी की आवृत्ति भिन्न हो सकती है, इसलिए हमें चर feq_k के माध्यम से उपयोगकर्ता से विकल्प मिलता है और एसएसपीएडीडी रजिस्टर सेट करने के लिए अपने सूत्रों में इसका उपयोग करते हैं।
void I2C_Initialize (const unsign long feq_K) // IIC को मास्टर { TRISC3 = 1 के रूप में शुरू करें ; TRISC4 = 1; // इनपुट पिन के रूप में SDA और SCL पिन सेट करें SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // सेटिंग क्लॉक स्पीड pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
शून्य I2C_Hold ()
अगला महत्वपूर्ण कार्य I2C_hold फ़ंक्शन है जो वर्तमान I2C ऑपरेशन पूरा होने तक डिवाइस के निष्पादन को पकड़ने के लिए उपयोग किया जाता है । हमें यह जांचना होगा कि किसी नए ऑपरेशन को शुरू करने से पहले I2C के संचालन को आयोजित करना है या नहीं। यह रजिस्टर SSPSTAT और SSPCON2 की जाँच करके किया जा सकता है। SSPSTAT में I2C बस की स्थिति के बारे में जानकारी है।
कार्यक्रम थोड़ा जटिल लग सकता है क्योंकि इसमें "और" और "या" ऑपरेटर शामिल हैं। जब आप इसे तोड़ते हैं
SSPSTAT और 0b00000100 SSPCON2 और 0b00011111
उन्होंने कहा कि इस तरह की घटनाओं को रोकने के लिए सरकार ने कई कदम उठाए हैं।
इसका मतलब है कि हम यह सुनिश्चित कर रहे हैं कि SSPSTAT पर 2 nd बिट शून्य है और इसी तरह 0 से 4 तक के बिट्स SSPCON2 पर शून्य हैं । फिर हम इन सभी को जोड़कर देखते हैं कि परिणाम शून्य है। यदि परिणाम शून्य है तो कार्यक्रम आगे बढ़ेगा यदि यह तब तक आयोजित नहीं होगा जब तक कि यह शून्य नहीं हो जाता है क्योंकि यह थोड़ी देर के लूप में उपयोग किया जाता है ।
void I2C_Hold () { जबकि ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // यह सुनिश्चित करने के लिए रजिस्टरों पर जाँच करें कि IIC प्रगति पर नहीं है }
शून्य I2C_Begin () और शून्य I2C_End ()
हर बार जब हम I2C बस का उपयोग करके किसी भी डेटा को लिखते या पढ़ते हैं तो हमें I2C कनेक्शन को शुरू और समाप्त करना चाहिए । I2C संचार शुरू करने के लिए हमें SEN बिट सेट करना होगा और संचार को समाप्त करने के लिए हमें PEN स्थिति बिट सेट करना होगा। इनमें से किसी भी बिट को टॉगल करने से पहले हमें यह भी जांचना चाहिए कि I2C बस फ़ंक्शन I2C_Hold का उपयोग करके व्यस्त है जैसा कि ऊपर चर्चा की गई है।
शून्य I2C_Begin () { I2C_Hold (); // कार्यक्रम को पकड़ो I2C व्यस्त है SEN = 1; // IIC की शुरुआत pg85 / 234 } void I2C_End () { I2C_Hold (); // कार्यक्रम को पकड़ो I2C व्यस्त है PEN = 1; // अंतिम IIC pg85 / 234 }
शून्य I2C_Write ()
राइट फ़ंक्शन का उपयोग मास्टर मॉड्यूल से किसी भी डेटा को साल्वे मॉड्यूल में भेजने के लिए किया जाता है । इस फ़ंक्शन का उपयोग आमतौर पर I2C प्रारंभ फ़ंक्शन के बाद किया जाता है और इसके बाद I2C एंड फ़ंक्शन होता है। जिस डेटा को IIC बस को लिखना होता है, उसे वेरिएबल डेटा से गुजारा जाता है। इस डेटा को I2C बस में भेजने के लिए SSPBUF बफर रजिस्टर में लोड किया जाता है।
आम तौर पर एक डेटा लिखने से पहले एक पता लिखा जाएगा, इसलिए आपको दो बार लिखने के फ़ंक्शन का उपयोग करना होगा, एक बार पता सेट करने के लिए और दूसरी बार वास्तविक डेटा भेजने के लिए।
void I2C_Write (अहस्ताक्षरित डेटा) { I2C_Hold (); // कार्यक्रम पकड़ो I2C व्यस्त SSPBUF = डेटा है; // pg82 / 234 }
अहस्ताक्षरित लघु I2C_Read ()
अंतिम फ़ंक्शन जिसे हमें जानना है वह I2C_Read फ़ंक्शन है। इस फ़ंक्शन का उपयोग उस डेटा को पढ़ने के लिए किया जाता है जो वर्तमान में I2C बस पर है। इसका उपयोग दास से बस के लिए कुछ मूल्य लिखने के लिए कहने के बाद किया जाता है। जो मूल्य प्राप्त होता है वह SSPBUF में होगा हम उस मान को अपने ऑपरेशन के लिए किसी भी चर में स्थानांतरित कर सकते हैं।
I2C संचार के दौरान, मास्टर द्वारा अनुरोध किए गए डेटा को भेजने के बाद दास एक और बिट भेज देगा जो पावती बिट है, यह बिट मास्टर द्वारा जाँच की जानी चाहिए ताकि यह सुनिश्चित हो सके कि संचार सफल था। पावती के लिए ACKDT बिट की जाँच करने के बाद इसे ACKEN बिट सेट करके सक्षम किया जाना चाहिए।
अहस्ताक्षरित लघु I2C_Read (अहस्ताक्षरित छोटी ऐक) { अहस्ताक्षरित छोटी आवक; I2C_Hold (); आरसीएन = 1; I2C_Hold (); इनकमिंग = एसएसपीबीयूएफ; // SSPBUF I2C_Hold () में सहेजा गया डेटा प्राप्त करें ; ACKDT = (ack)? 0: 1; // जाँच करें कि क्या ऐक बिट प्राप्त ACKEN = 1; // pg 85/234 आने वाली वापसी; }
वह यह है, ये फ़ंक्शन एक I2C संचार स्थापित करने और डिवाइस से डेटा लिखने या पढ़ने के लिए पर्याप्त होना चाहिए। इस बात पर भी ध्यान दें कि I2C संचार कई अन्य कार्य कर सकते हैं, लेकिन सरलता के लिए हम यहां उनकी चर्चा नहीं कर रहे हैं। का पूरा काम जानने के लिए आप हमेशा डेटाशीट का संदर्भ ले सकते हैं
PIC16F877A I2C संचार के लिए हेडर फ़ाइल के साथ पूरा कोड लिंक से डाउनलोड किया जा सकता है।
I2C हेडर फ़ाइलों का उपयोग करके प्रोग्रामिंग:
अब जब हमने जान लिया है कि एक I2C संचार कैसे काम करता है और हम इसके लिए बनाई गई हेडर फ़ाइल का उपयोग कैसे कर सकते हैं, तो हम एक सरल प्रोग्राम बनाते हैं जिसमें हम हेडर फ़ाइल का उपयोग करेंगे और I2C लाइनों के लिए कुछ मान लिखेंगे। हम इस कार्यक्रम का अनुकरण करेंगे और जांचेंगे कि क्या ये मान बस में लिखे जा रहे हैं।
हमेशा की तरह कार्यक्रम विन्यास बिट्स की स्थापना के साथ शुरू होता है और घड़ी आवृत्ति को 20 मेगाहर्ट्ज के रूप में नीचे दिखाया गया है
#pragma config FOSC = HS // ऑसिलेटर चयन बिट्स (HS ऑसिलेटर) #pragma config WDTE = OFF // वॉचडॉग टाइमर सक्षम करें बिट (WDT अक्षम) #pragma config PWRTE = ON / पावर-अप टाइमर सक्षम करें बिट (PWRT सक्षम) # pragma config BOREN = ON // ब्राउन-आउट रीसेट सक्षम करें (BOR सक्षम) #pragma config LVP = OFF // कम-वोल्टेज (एकल-आपूर्ति) इन-सर्किट सीरियल प्रोग्रामिंग बिट सक्षम करें (RB3 डिजिटल / O, HV है) MCLR का उपयोग प्रोग्रामिंग के लिए किया जाना चाहिए) #pragma config CPD = OFF // Data EEPROM मेमोरी कोड प्रोटेक्शन बिट (Data EEPROM कोड प्रोटेक्शन ऑफ) #pragma config WRT = OFF // फ्लैश प्रोग्राम मेमोरी राइट बिट्स सक्षम करें (प्रोटेक्शन ऑफ लिखें; सभी प्रोग्राम मेमोरी; EECON नियंत्रण द्वारा लिखा जा सकता है) #pragma config CP = OFF // फ़्लैश प्रोग्राम मेमोरी कोड प्रोटेक्शन बिट (कोड सुरक्षा बंद) #define _XTAL_FREQ 20000000
अगला कदम उस शीर्ष लेख फ़ाइल को जोड़ना होगा जिसके बारे में हमने अभी चर्चा की है। शीर्ष लेख फ़ाइल को PIC16F877a_I2C.h नाम दिया गया है और इसे उस लिंक से डाउनलोड किया जा सकता है जिसकी हमने ऊपर चर्चा की थी। सुनिश्चित करें कि हेडर फ़ाइल आपकी प्रोजेक्ट सूची के हेडर फ़ाइल में जोड़ी गई है, आपकी प्रोजेक्ट फ़ाइल संरचना इस तरह दिखनी चाहिए
यह सुनिश्चित करने के बाद कि हेडर फाइल आपकी प्रोजेक्ट फाइल में शामिल है, हेडर फाइल को मुख्य C फाइल में शामिल करें
#शामिल
अंदर है, जबकि पाश हम I2C संचार शुरू हो जाएगा I2C बस को लिखने कुछ यादृच्छिक मान और फिर I2C संचार समाप्त करें। मेरे द्वारा चुने गए यादृच्छिक मान D0, 88 और FF हैं। आप किसी भी मान को इनपुट कर सकते हैं। लेकिन उन मूल्यों को याद रखें क्योंकि हम उन्हें अपने सिमुलेशन में सत्यापित करेंगे।
जबकि (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
पूरा कार्यक्रम पृष्ठ के तल पर पाया जा सकता है, तो आप उस का उपयोग करें या यहां से कार्यक्रम की पूरी ज़िप फ़ाइल डाउनलोड कर सकते हैं। कार्यक्रम को संकलित करने के बाद और अनुकरण के लिए तैयार हो जाएं।
प्रोटीज सिमुलेशन:
प्रोटीन में I2C डिबगर नामक एक अच्छा उपकरण होता है जिसका उपयोग I2C बस में डेटा को पढ़ने के लिए किया जा सकता है, इसलिए आइए हम इसका उपयोग करके एक सर्किट का निर्माण करें और जांचें कि क्या डेटा सफलतापूर्वक लिखा जा रहा है। पूरा सर्किट आरेख नीचे दिखाया गया है
माइक्रोकंट्रोलर पर डबल क्लिक करके हमारे प्रोग्राम द्वारा उत्पन्न हेक्स फ़ाइल लोड करें। फिर कार्यक्रम का अनुकरण करें। आपको एक विंडो पॉप अप दिखाई देगी जो I2C बस के बारे में सारी जानकारी प्रदर्शित करेगी। हमारे कार्यक्रम के लिए विंडो नीचे दी गई है।
यदि आप लिखे जा रहे डेटा पर कड़ी नज़र रखते हैं तो आप देख सकते हैं कि वे वही हैं जो हमने अपने कार्यक्रम में लिखे थे। मान D0, 88 और FF हैं। मान हर 1 सेकंड के लिए लिखे गए हैं इसलिए समय भी अपडेट हो रहा है जैसा कि नीचे दिखाया गया है। नीला तीर इंगित करता है कि यह मास्टर से दास के लिए लिखा गया है यदि यह विपरीत दिशा में इंगित किया जाएगा यदि अन्यथा। भेजे जा रहे डेटा का एक नज़दीकी विवरण नीचे दिखाया गया है।
यह सिर्फ I2C की एक झलक है, यह कई उपकरणों के डेटा को पढ़ और लिख सकता है। हम I2C प्रोटोकॉल के साथ काम करने वाले विभिन्न मॉड्यूल को रोककर अपने आगामी ट्यूटोरियल में I2C के बारे में अधिक जानकारी देंगे।
आशा है कि आप इस परियोजना को समझ गए हैं और इससे कुछ उपयोगी सीखा है। यदि आपको कोई संदेह है, तो उन्हें नीचे टिप्पणी अनुभाग में पोस्ट करें या तकनीकी मदद के लिए मंचों का उपयोग करें।
पूरा कोड नीचे दिया गया है; आप यहां से सभी कोड वाली हेडर फाइल डाउनलोड कर सकते हैं।