विषयसूची:

ATtiny और ATmega के लिए I2C बस: 8 कदम
ATtiny और ATmega के लिए I2C बस: 8 कदम

वीडियो: ATtiny और ATmega के लिए I2C बस: 8 कदम

वीडियो: ATtiny और ATmega के लिए I2C बस: 8 कदम
वीडियो: #atmega328p LCD using I2C 2024, जुलाई
Anonim
ATtiny और ATmega. के लिए I2C बस
ATtiny और ATmega. के लिए I2C बस

मुझे एटमेल एवीआर माइक्रोकंट्रोलर पसंद हैं! इस निर्देश में वर्णित यहूदी बस्ती विकास प्रणाली के निर्माण के बाद से, मुझे विशेष रूप से AVR ATtiny2313 और ATmega168 के साथ प्रयोग करने में मज़ा नहीं आया। मैं यहां तक कि इनपुट के रूप में स्विच का उपयोग करने पर एक निर्देशयोग्य लिखने के लिए चला गया, और सीपीएलडी के लिए यहूदी बस्ती विकास प्रणाली अवधारणा का विस्तार किया। हाल ही में एक परियोजना के दौरान, मुझे नियंत्रण मूल्यों को स्थापित करने के लिए कई स्विच की आवश्यकता थी। AVR में पर्याप्त I/O पिन नहीं थे, इसलिए मुझे कुछ सोचना पड़ा। मैं एक कीबोर्ड और डिस्प्ले के साथ एक जटिल इनपुट सिस्टम की कोशिश कर सकता था, लेकिन ATtiny2313 संसाधनों से बाहर हो गया होगा। सौभाग्य से, एटमेल ने इस समस्या को हल करने का एक तरीका प्रदान किया है जिसमें एक इंटरफ़ेस शामिल है जो एक साधारण दो तार इंटरफ़ेस के साथ अतिरिक्त चिप्स (जैसे मेमोरी या आई / ओ पोर्ट) से जुड़ सकता है। यह सही है, एक AVR पर सिर्फ दो I/O पिन का उपयोग करके हम कई अतिरिक्त I/O पिन, और अन्य संसाधनों तक भी पहुंच सकते हैं। यह दो तार इंटरफेस औपचारिक रूप से इंटर-एकीकृत सर्किट बस, या सिर्फ I2C बस के रूप में जाना जाता है और इसका आविष्कार एनएक्सपी द्वारा किया गया था जब यह अभी भी फिलिप्स सेमीकंडक्टर्स था। यदि आप इस निर्देश को पढ़ रहे हैं तो आपने शायद I2C बस के बारे में सुना होगा और इसका उपयोग PIC या अन्य माइक्रोकंट्रोलर पर भी किया होगा। जबकि अवधारणात्मक रूप से बहुत सरल, और AVRs पर हार्डवेयर संसाधनों द्वारा समर्थित, I2C बस का उपयोग करने के लिए सॉफ़्टवेयर ड्राइवर अभी भी आवश्यक हैं। Atmel एप्लिकेशन नोट्स प्रदान करता है (इस निर्देश में बाद में संसाधन देखें), लेकिन ये अधूरे हैं और किसी अन्य AVR डिवाइस के साथ संचार करने से परे कोई उदाहरण नहीं दिखाते हैं। किसी को भी I2C ड्राइवर बनाने का तरीका सिखाने के लिए इस निर्देश का उद्देश्य नहीं है एवीआर। इसके बजाय, मैं ATtiny2313 और ATmega168 उपकरणों के लिए Atmel ड्राइवरों के विस्तारित संस्करण प्रदान करूंगा, मैं इनका उपयोग करते समय लागू होने वाली आवश्यकताओं और प्रतिबंधों की व्याख्या करूंगा, और मैं आपको I2C उपकरणों के कार्यशील उदाहरण दिखाऊंगा। इस निर्देश के माध्यम से काम करने के बाद आप अपने AVR प्रोजेक्ट्स में I2C बस का सफलतापूर्वक उपयोग कर पाएंगे। जाहिर है, यदि आप केवल उनमें से एक में रुचि रखते हैं, तो आप छोटे या मेगा के लिए ड्राइवरों को अनदेखा कर सकते हैं। I2C बस के बारे में अधिक जानने के इच्छुक लोगों के लिए, मैं उपयुक्त सामग्री के लिंक प्रदान करूँगा।

चरण 1: वैसे भी यह सब I2C सामान क्या है?

यह सब क्या है I2C सामान वैसे भी?
यह सब क्या है I2C सामान वैसे भी?
यह सब I2C सामान वैसे भी क्या है?
यह सब I2C सामान वैसे भी क्या है?
यह सब क्या है I2C सामान वैसे भी?
यह सब क्या है I2C सामान वैसे भी?
यह सब I2C सामान वैसे भी क्या है?
यह सब I2C सामान वैसे भी क्या है?

I2C बस एक सरल, दो-तार कनेक्शन है जो कई उपकरणों को एक साथ जोड़ सकता है और उन्हें डेटा का आदान-प्रदान करने की अनुमति देता है। अपने सरलतम रूप में एक मास्टर डिवाइस होता है जो कई स्लेव डिवाइसेस से संचार करता है। सभी उपकरण I2C बस के दो तारों के समानांतर जुड़े हुए हैं। दो तारों को SCL और SDA के रूप में जाना जाता है। SCL क्लॉक लाइन है और इसे मास्टर डिवाइस द्वारा नियंत्रित किया जाता है। एसडीए द्वि-दिशात्मक डेटा लाइन है। डेटा ट्रांसफर करने के लिए, मास्टर एक स्लेव एड्रेस को एक बिट रीड/राइट फ्लैग के साथ भेजता है। यदि कोई लेखन वांछित है, तो मास्टर संबोधित दास को डेटा भेजना जारी रखेगा। यदि पढ़ने का अनुरोध किया जाता है, तो दास डेटा के साथ जवाब देगा। लेन-देन को समन्वित करने के लिए, SCL और SDA लाइनों को मास्टर और दास द्वारा कई स्थितियों को संकेत देने के लिए हेरफेर किया जाता है। इनमें START, STOP, ACK (स्वीकृति) और NAK (कोई स्वीकार नहीं) शामिल हैं। इन शर्तों का विवरण ड्राइवरों द्वारा नियंत्रित किया जाता है। आप में से सच्चे गीक्स इस निर्देश के अंत में दिए गए लिंक में सभी विवरण सीख सकते हैं। बिजली की आवश्यकताएं बहुत सरल हैं। मास्टर और दासों को Vcc के लिए समान स्तर का उपयोग करना चाहिए, आधार को जोड़ा जाना चाहिए, और SCL और SDA लाइनों को Vcc तक खींचा जाना चाहिए। पुल-अप प्रतिरोधों का मूल्य बस में कुल समाई के आधार पर गणना द्वारा निर्धारित किया जाता है, लेकिन व्यावहारिक रूप से 1.8K और 10K के बीच का कोई भी मूल्य हो सकता है। मैं 5.1K से शुरू करता हूं और जब तक यह काम नहीं करता तब तक निम्न मानों का उपयोग करता हूं। यह आमतौर पर तब तक कोई समस्या नहीं है जब तक कि आपके पास उपकरणों के बीच बहुत सारे उपकरण या लंबी लंबाई के तार न हों। I2C बस पर नाममात्र डेटा दर 100Kbit/सेकंड है। 400Kbits/सेकंड, 1Mbits/सेकंड, और उससे आगे की दरें भी संभव हैं, लेकिन इस निर्देश में ड्राइवरों द्वारा समर्थित नहीं हैं। सभी I2C डिवाइस 100Kbit/सेकंड पर काम करेंगे। ATtiny2313 और ATmega168 प्रत्येक I2C बस को अलग तरह से लागू करते हैं। ATtiny2313 यूनिवर्सल सीरियल इंटरफेस (USI) हार्डवेयर का उपयोग करता है - जिसका उपयोग SPI बस के लिए भी किया जा सकता है। ATmega168 में I2C बस के लिए समर्पित हार्डवेयर है जिसे टू वायर इंटरफेस (TWI) के रूप में जाना जाता है। एक बार ड्राइवर लिखे जाने के बाद, ये अंतर उपयोगकर्ता के लिए अधिकतर पारदर्शी होते हैं। सॉफ्टवेयर में एक महत्वपूर्ण अंतर है: ATmega168 I2C ड्राइवर इंटरप्ट संचालित है जबकि ATtiny2313 के लिए नहीं है। इसका मतलब यह है कि ATmega168 प्रोग्राम को I2C डेटा ट्रांसफर होने के लिए इंतजार नहीं करना पड़ता है, लेकिन केवल एक और ट्रांसफर शुरू करने से पहले या रीड ऑपरेशन से डेटा आने तक इंतजार करना पड़ता है। अनुसरण करने के लिए उदाहरण और चर्चा से यह स्पष्ट हो जाना चाहिए। I2C पते 7 बिट लंबे हैं, इसलिए 127 डिवाइस तक बस में हो सकते हैं यदि प्रत्येक का एक अद्वितीय पता हो। जैसा कि चित्र में दिखाया गया है, यह 7 बिट पता एक बिट बाईं ओर स्थानांतरित कर दिया गया है और पते पर डिवाइस के पढ़ने या लिखने के लिए सबसे कम महत्वपूर्ण बिट का उपयोग किया जाता है। इस प्रकार पूरा दास पता एक 8 बिट बाइट है। वास्तविक पता आंशिक रूप से डिवाइस के लिए आंतरिक रूप से निर्धारित किया जाता है और इसे बदला नहीं जा सकता (4 सबसे महत्वपूर्ण बिट्स), और आंशिक रूप से बिट्स द्वारा निर्धारित किया जाता है जो डिवाइस पिन (3 कम से कम महत्वपूर्ण बिट्स) से जुड़ा हो सकता है जिसे सेट करने के लिए उच्च या निम्न बांधा जा सकता है एक विशिष्ट पता। भ्रमित करने वाला लगता है, लेकिन एक उदाहरण इसे स्पष्ट कर देगा। PCA8574A डेटा शीट से पता चलता है कि I2C पते के चार सबसे महत्वपूर्ण बिट्स हमेशा 0111 होंगे। अगले तीन बिट पिन AD0, AD1 और AD2 पर सेटिंग्स द्वारा निर्धारित किए जाते हैं। इन पिनों को क्रमशः 0 या 1 का प्रतिनिधित्व करने के लिए जमीन या सकारात्मक वोल्टेज आपूर्ति (5 वोल्ट) से बांधा जा सकता है। तो संभावित पतों की सीमा 38 से 3F हेक्साडेसिमल है, जैसा कि PCA8574 डेटा शीट से अन्य आंकड़े में दिखाया गया है। तो पता बिट सेटिंग्स को बदलकर, एक ही समय में I2C बस में 8 PCA8574As हो सकते हैं। प्रत्येक अपने विशिष्ट दास के पते पर ही प्रतिक्रिया देगा। यदि और भी अधिक I/O पोर्ट की आवश्यकता है, तो PCA8574 का उपयोग किया जा सकता है। PCA8574 और PCA8574A के बीच एकमात्र अंतर यह है कि PCA8574 की I2C स्लेव एड्रेस रेंज 20 से 27 हेक्साडेसिमल है। किसी दिए गए डिवाइस का पता निर्धारित करना भ्रामक हो सकता है क्योंकि कुछ डेटा शीट रीड/राइट बिट को इसका हिस्सा मानते हैं। पता। डेटा शीट को ध्यान से पढ़ें और ध्यान रखें कि दास का पता 7 बिट लंबा होगा। पढ़ने/लिखने के बिट को अलग से माना जाना चाहिए। फिर, एक उदाहरण मदद करेगा। 24C16 EEPROM के लिए हम जिस डेटा शीट के साथ प्रयोग करेंगे, वह कहती है कि स्लेव एड्रेस के पहले (सबसे महत्वपूर्ण) चार बिट्स 1010 हैं। अगले तीन बिट्स A0, A1 और A2 द्वारा निर्धारित किए जा सकते हैं; लेकिन ध्यान दें कि डेटा शीट में 24C01 से 24C08 भी शामिल हैं जो छोटे आकार के EEPROM हैं। डेटा शीट के आंकड़े से पता चलता है कि आकार बढ़ने पर इन एड्रेस बिट्स की सेटिंग्स को नजरअंदाज कर दिया जाता है और 24C16 के लिए पूरी तरह से नजरअंदाज कर दिया जाता है। यही है, अंतिम तीन बिट्स मायने नहीं रखते हैं और 24C16 वास्तव में सभी I2C गुलाम पते 50 से 57 हेक्साडेसिमल का उपयोग करता है। दास पतों की श्रेणी वास्तव में 24C16 के भीतर विभिन्न वर्गों को संबोधित करेगी। पहले 256 बाइट्स 50h पते पर हैं, अगले 256 51h पर, और इसी तरह अंतिम 256 तक 57h पर - कुल 2K बाइट्स के लिए। चूंकि हम जिस PCF8570 RAM के साथ प्रयोग करते हैं उसका पता भी इसी श्रेणी में है, इसलिए 24C16 और PCF8570 का एक साथ उपयोग नहीं किया जा सकता है।

चरण 2: कुछ I2C डिवाइस ऑर्डर करें

अब जब आप I2C बस के बारे में कुछ जानते हैं और इसका उपयोग करना चाहते हैं, तो क्यों न कुछ I2C उपकरणों को अभी प्रयोग करने का आदेश दिया जाए ताकि जब आप सॉफ़्टवेयर तैयार कर रहे हों तो वे आपके रास्ते में आ सकें? उपयुक्त उपकरणों में एक I/ हे इंटरफ़ेस विस्तारक (मेरा पसंदीदा), एक स्थिर राम, और एक EEPROM। और भी बहुत कुछ है, लेकिन ये एक अच्छी शुरुआत है। हम जिन AVR प्रोसेसर का उपयोग करेंगे वे ATtiny2313 और Atmega168 (Arduino में प्रयुक्त) हैं। यदि आप इनके लिए नए हैं, तो उनके बारे में जानने और अपनी यहूदी बस्ती विकास प्रणाली बनाने के लिए इस महान निर्देश पर एक नज़र डालें। वर्तमान निर्देश में ATmega168 का योजनाबद्ध दिखाता है कि इस प्रोसेसर के लिए यहूदी बस्ती विकास प्रणाली को कैसे लागू किया जाए। समानांतर पोर्ट केबल ATtiny2313 के समान है। (मैंने यहूदी बस्ती विकास प्रणाली के यूएसबी संस्करण की कोशिश नहीं की है, इसलिए मुझे यकीन नहीं है कि इस पर I2C बस का उपयोग कैसे किया जाता है। Arduino के लिए भी।) यहां डिजिके भाग संख्याएं हैं। पोर्ट विस्तारक: आईसी I2C I/O विस्तारक 568-4236-5-एनडीआरएएम:आईसी एसआरएएम 256X8 डब्ल्यू/आई2सी 568-1071-5-एनडीईईपीरोम:आईसी ईईपीरोम सीरियल 16के सीएटी24सी16एलआई-जी-एनडी

चरण 3: I2C ड्राइवर

यहाँ I2C बस के लिए ड्राइवर के कार्यों का विवरण दिया गया है। इन्हें शुरुआत के लिए Atmel Apps Notes का उपयोग करके विकसित किया गया था। मैं उनके बिना निर्माण के आधार के रूप में ऐसा नहीं कर सकता था। WinAVR और gcc C कंपाइलर का उपयोग करके विकास किया गया था। प्रत्येक प्रोसेसर के लिए घड़ी दर प्रतिबंध नीचे वर्णित हैं। चूंकि मैं सभी संभावित प्रोसेसर स्वाद/घड़ी दर संयोजनों का परीक्षण करने में सक्षम नहीं हूं, इसलिए मैं केवल वही रहूंगा जो मैं वास्तव में परीक्षण कर सकता हूं और प्रतिबंधों और सीमाओं को इंगित करने का प्रयास करूंगा। यहां ड्राइवर कार्य हैं और उनका उपयोग कैसे करें। कृपया अधिक विवरण के लिए उदाहरणों को देखें और पूर्ण कार्यक्रमों में उपयोग में आने वाले कार्यों को देखें। ATtiny2313 के लिए: घड़ी की आवश्यकता: ड्राइवरों को ATtiny2313 के लिए 1MHz (डिफ़ॉल्ट दर) की घड़ी दर के लिए डिज़ाइन किया गया है। यदि आप अन्य दरों पर दौड़ना चाहते हैं, तो आपको ड्राइवरों में स्थिरांक समायोजित करना होगा। अगर आपको ऐसा करने में मदद चाहिए तो मुझे ईमेल करें। आप संसाधन चरण में लिंक में Atmel ऐप्स नोट्स से कुछ संकेत भी प्राप्त कर सकते हैं।USI_TWI_Master_Initialise()यह फ़ंक्शन I2C मोड ऑपरेशन के लिए USI हार्डवेयर को इनिशियलाइज़ करता है। अपने प्रोग्राम की शुरुआत में इसे एक बार कॉल करें। यह शून्य लौटाता है और इसमें कोई तर्क नहीं है। चूंकि यह फ़ंक्शन केवल एक त्रुटि कोड देता है, मैं त्रुटि एलईडी फ्लैश करने के लिए फ़ंक्शन TWI_Act_On_Failure_In_Last_Transmission(TWIerrorMsg) का उपयोग करता हूं। त्रुटि कोड USI_TWI_Master.h में परिभाषित हैं। यहां इसे कॉल करने का तरीका बताया गया है:TWI_Act_On_Failure_In_Last_Transmission(USI_TWI_Get_State_Info())USI_TWI_Start_Read_Write()इस फ़ंक्शन का उपयोग I2C डिवाइस पर सिंगल बाइट्स को पढ़ने और लिखने के लिए किया जाता है। इसका उपयोग कई बाइट्स लिखने के लिए भी किया जाता है। इस फ़ंक्शन का उपयोग करने के लिए 6 चरण हैं। 1) दास पते और डेटा बाइट को भेजने या प्राप्त करने के लिए अपने प्रोग्राम में एक संदेश बफर घोषित करें। अहस्ताक्षरित चार संदेशबुफ (MESSAGEBUF_SIZE); 2) स्लेव एड्रेस को बफर में पहले बाइट के रूप में रखें। इसे थोड़ा बाएँ और OR रीड/राइट बिट में शिफ्ट करें। ध्यान दें कि रीड/राइट बिट रीड के लिए 1 और राइट के लिए 0 होगा। यह उदाहरण पढ़ने के लिए है। messageBuf(0) = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT); 3) लिखते समय, बाइट को बफर में अगले स्थान पर लिखने के लिए रखें। 4) संदेश बफर के साथ USI_TWI_Start_Read_Write फ़ंक्शन को कॉल करें और संदेश का आकार तर्कों के रूप में। अस्थायी = USI_TWI_Start_Read_Write(messageBuf, 2);5) लौटाया गया मान (इस मामले में अस्थायी) का परीक्षण यह देखने के लिए किया जा सकता है कि कोई त्रुटि हुई है या नहीं। यदि ऐसा है, तो इसे ऊपर चर्चा के अनुसार संभाला जाता है। कार्यक्रमों में उदाहरण देखें। ६) यदि एक रीड का अनुरोध किया गया था, तो बाइट रीड बफर में दूसरे स्थान पर होगा। यदि कई बाइट्स लिखे जाने हैं (जैसे कि मेमोरी डिवाइस के लिए), तो इसी रूटीन का उपयोग किया जा सकता है। बफर सेट करना और रूटीन को कॉल करना थोड़ा अलग है। बफर में दूसरा बाइट प्रारंभिक मेमोरी एड्रेस होगा जिसमें लिखना है। लिखा जाने वाला डेटा बाद के बाइट्स में होगा। संदेश का आकार सभी मान्य डेटा सहित आकार का होगा। इसलिए यदि ६ बाइट्स लिखे जाने हैं, तो संदेश का आकार ८ होगा (दास का पता + स्मृति पता + डेटा का ६ बाइट्स)। किसी प्रकार की स्मृति। इस रूटीन का उपयोग दो अपवादों के साथ पिछले रूटीन के समान ही है। रीड/राइट बिट की सेटिंग कोई मायने नहीं रखती। इस रूटीन को कॉल करने से हमेशा एक रीड ऑपरेशन होता है। संदेश का आकार 2 और पढ़ने के लिए बाइट्स की संख्या होनी चाहिए। यदि कोई त्रुटि नहीं हुई, तो डेटा दूसरे स्थान से शुरू होने वाले बफर में होगा। ATmega168 के लिए: घड़ी की आवश्यकता: ड्राइवरों को ATmega168 के लिए 4MHz की घड़ी दर के लिए डिज़ाइन किया गया है। उदाहरण कोड दिखाता है कि इस घड़ी की दर को कैसे सेट किया जाए। यदि आप अन्य दरों पर दौड़ना चाहते हैं, तो आपको ड्राइवरों में स्थिरांक समायोजित करना होगा। यदि आपको ऐसा करने की आवश्यकता हो तो मुझे ईमेल करें। TWI_Master_Initialise () यह फ़ंक्शन I2C मोड ऑपरेशन के लिए TWI हार्डवेयर को इनिशियलाइज़ करता है। अपने प्रोग्राम की शुरुआत में इसे एक बार कॉल करें। यह शून्य हो जाता है और कोई तर्क नहीं है। प्रारंभ करने के बाद swi() को कॉल करके इंटरप्ट को सक्षम करना सुनिश्चित करें। TWI_Get_State_Info () यह फ़ंक्शन I2C त्रुटि जानकारी देता है और इसका उपयोग I2C लेनदेन के दौरान कोई त्रुटि होने पर किया जाता है। चूंकि यह फ़ंक्शन केवल एक त्रुटि कोड देता है, मैं त्रुटि एलईडी फ्लैश करने के लिए TWI_Act_On_Failure_In_Last_Transmission(TWIerrorMsg) फ़ंक्शन का उपयोग करता हूं। त्रुटि कोड TWI_Master.h में परिभाषित किए गए हैं, लेकिन त्रुटि एलईडी पर सिग्नलिंग के लिए संशोधित किए गए हैं। विवरण के लिए उदाहरण कोड देखें। यहां इसे कॉल करने का तरीका बताया गया है:TWI_Act_On_Failure_In_Last_Transmission(TWI_Get_State_Info())ध्यान दें कि त्रुटि जांच यह सुनिश्चित करके की जाती है कि I2C लेनदेन पूरा हो गया है (नीचे वर्णित फ़ंक्शन) और फिर वैश्विक स्थिति शब्द में थोड़ा परीक्षण करें।TWI_Start_Read_Write()TWI_Start_Random_Read() दो फ़ंक्शन ऊपर वर्णित संबंधित फ़ंक्शन के समान काम करते हैं लेकिन कुछ अपवादों के साथ। वे कोई त्रुटि मान नहीं लौटाते हैं। डेटा रीड को बफर में स्थानांतरित नहीं किया जाता है। ऐसा करना आगे वर्णित फ़ंक्शन के साथ किया जाएगा। TWI_Start_Random_Read को कॉल करते समय, संदेश आकार अनुरोधित डेटा बाइट्स की संख्या होनी चाहिए, न कि दो। ATmega168 के लिए I2C ड्राइवर इंटरप्ट संचालित है। यही है, I2C लेनदेन शुरू किया जाता है और फिर स्वतंत्र रूप से निष्पादित किया जाता है जबकि मुख्य दिनचर्या चलती रहती है। जब मुख्य रूटीन शुरू किए गए I2C लेनदेन से डेटा चाहता है, तो उसे यह देखने के लिए जांचना चाहिए कि डेटा उपलब्ध है या नहीं। त्रुटि जाँच के लिए भी यही स्थिति है। मुख्य रूटीन को यह सुनिश्चित करना चाहिए कि त्रुटियों की जाँच करने से पहले I2C लेनदेन पूरा हो गया है। इन उद्देश्यों के लिए अगले दो कार्यों का उपयोग किया जाता है। TWI_Transceiver_Busy() इस फ़ंक्शन को यह देखने के लिए कॉल करें कि त्रुटियों की जांच करने से पहले I2C लेनदेन पूरा हो गया है या नहीं। उदाहरण प्रोग्राम दिखाते हैं कि इसका उपयोग कैसे किया जाता है। TWI_Read_Data_From_Buffer () इस फ़ंक्शन को I2C ड्राइवर के रिसीव बफर से डेटा को संदेश बफर में स्थानांतरित करने के लिए कॉल करें। यह फ़ंक्शन यह सुनिश्चित करेगा कि डेटा स्थानांतरित करने से पहले I2C लेनदेन पूरा हो गया है। जबकि इस फ़ंक्शन द्वारा एक मान वापस किया जाता है, मुझे लगता है कि त्रुटि बिट को सीधे अधिक विश्वसनीय होने के लिए जांचना है। यहां बताया गया है कि इसे कैसे कॉल करें। संदेश का आकार वांछित डेटा बिट्स की संख्या से एक बड़ा होना चाहिए। डेटा दूसरे स्थान से शुरू होने वाले संदेश में होगा। अस्थायी = TWI_Read_Data_From_Buffer (messageBuf, संदेश आकार);

चरण 4: चलो निर्माण करें

चलो बनाते है!
चलो बनाते है!
चलो बनाते है!
चलो बनाते है!
चलो बनाते है!
चलो बनाते है!
चलो बनाते है!
चलो बनाते है!

I2C Schematics.zip फ़ाइल डाउनलोड करके प्रारंभ करें। आप अपने कार्य क्षेत्र में योजनाबद्ध और उदाहरण प्रोग्राम फ़ाइलों को रखने के लिए एक I2C फ़ोल्डर बनाना चाह सकते हैं। इस निर्देशिका में स्कीमैटिक्स को अनज़िप करें। आपको I2C Schematics नाम का फोल्डर मिलेगा। छोटे I2C.pdf नाम की फ़ाइल खोलें। यह योजनाबद्ध ATtiny2313 यहूदी बस्ती विकास प्रणाली, और PCA8574A I/O पोर्ट विस्तारक (इसके चारों ओर बड़ा धराशायी बॉक्स है) दिखाता है। पोर्ट एक्सपैंडर सर्किट एक ब्रेडबोर्ड पर बनाया गया है। तस्वीरों पर एक नज़र डालें कि ये सर्किट कैसा दिखते हैं। वे वास्तव में बहुत सरल हैं। योजनाबद्ध का ATtiny2313 भाग सिर्फ तीन ब्लिंकलाइट्स (LED1, 2, और 3, प्लस R4, 5, और 6) के साथ यहूदी बस्ती विकास प्रणाली है और एक पुशबटन (S1) इसके साथ जुड़ा हुआ है, साथ ही एक अतिरिक्त विवरण। वह विवरण जंपर्स (JP4, 5, और 6) का जोड़ है जिसे I2C बस SCL और SDA लाइनों के कनेक्शन की अनुमति देने के लिए हटाया जा सकता है। प्रोग्रामिंग के लिए जंपर्स को जगह में होना चाहिए, फिर हटा दिया जाना चाहिए ताकि एससीएल और एसडीए को जोड़ा जा सके। तस्वीरें कूदने वालों को जगह में दिखाती हैं और हटा देती हैं। इन जंपर्स का प्लेसमेंट आप पर निर्भर है, यदि आप I2C बस का उपयोग करना चाहते हैं तो आपको बस उन्हें अपने यहूदी बस्ती विकास प्रणाली पर रखना होगा। I2C बस को डिस्कनेक्ट किया जाना चाहिए और प्रोग्रामिंग के लिए जंपर्स लगाए जाने चाहिए। ध्यान दें कि I2C बस के लिए आपको केवल JP4 और JP6 के साथ वास्तव में चिंतित होने की आवश्यकता है। JP5 डालें यदि आपको लगता है कि आप कभी भी SPI बस का उपयोग करना चाहेंगे। PCA8574A I/O पोर्ट एक्सपैंडर को ब्रेडबोर्ड करना बहुत सरल है। Vcc (+5 वोल्ट) और Gnd (ग्राउंड) कनेक्शन प्रदान करें और AD0, 1, और 2 को ग्राउंड से कनेक्ट करें (I2C स्लेव एड्रेस को 38 हेक्स बनाता है)। फिर 4 ब्लिंकलाइट और 4 डीआईपी स्विच कनेक्ट करें। (यदि आपके पास डीआईपी स्विच नहीं हैं तो आप केवल तारों का उपयोग कर सकते हैं। जमीन से बांधें या क्रमशः सिग्नल चालू या बंद करने के लिए फ्लोटिंग छोड़ दें।) अंत में, एसडीए और एससीएल से पुल-अप रेसिस्टर्स (आर11 और 12) को वीसीसी से कनेक्ट करें। इन्हें 3.3K के रूप में दिखाया गया है, लेकिन 1.8K से 5.1K तक का कोई भी मान काम करना चाहिए (शायद 10K तक लेकिन मैंने ऐसा करने की कोशिश नहीं की है)। एक बार जब आप ATtiny2313 को प्रोग्राम कर लेते हैं तो आप जंपर्स को हटा सकते हैं और परीक्षण के लिए SDA और SCL को कनेक्ट कर सकते हैं। अब ATmega168 के लिए। यहां एकमात्र झुर्रियां यह है कि आपने इस प्रोसेसर के लिए यहूदी बस्ती विकास प्रणाली नहीं बनाई होगी। अगर ऐसा है, तो मेरे द्वारा प्रदान किया गया योजनाबद्ध (MEGA I2C.pdf) आपको दिखाएगा कि कैसे। यह ATtiny2313 संस्करण का सिर्फ एक क्रमपरिवर्तन है। यदि आप आगे की योजना बनाते हैं तो आप सुनिश्चित कर सकते हैं कि आपकी प्रोग्रामिंग केबल दोनों प्रणालियों में फिट होगी। मुख्य अंतर C2 और C3 का जोड़ है। इन्हें लगाने के लिए चित्र देखें, वे चिप के बहुत करीब होने चाहिए; उनमें से एक वास्तव में चिप के नीचे है। ये विशेष रूप से एनालॉग से डिजिटल कनवर्टर के शोर को दूर रखने में मदद करते हैं। जब तक आप SPI बस का उपयोग करने की योजना नहीं बनाते हैं, तब तक आपको जंपर्स लगाने की आवश्यकता नहीं है क्योंकि इस चिप पर I2C बस की आवश्यकता नहीं है। ध्यान दें कि PCA8754A ब्रेडबोर्ड अपरिवर्तित रहेगा। आप बस एसडीए और एससीएल को जोड़ देंगे और चले जाओगे! आसान, हुह?

चरण 5: आइए कोड और परीक्षण करें

आइए कोड और परीक्षण करें!
आइए कोड और परीक्षण करें!
आइए कोड और परीक्षण करें!
आइए कोड और परीक्षण करें!
आइए कोड और परीक्षण करें!
आइए कोड और परीक्षण करें!

यह ड्राइवरों और उदाहरण कार्यक्रमों के निर्माण का समय है। हम ATtiny2313 और PCA8574A ब्रेडबोर्ड से शुरू करेंगे जिसे हमने अभी बनाया है। I2C.zip फ़ाइल को अपनी I2C कार्य निर्देशिका में डाउनलोड करें और इसे अनज़िप करें। आपके पास I2C नामक एक नया फ़ोल्डर होगा। इसमें आपको USI I2C (ATtiny2313 के लिए) और TWI I2C (ATmega168 के लिए) मिलेगा। USI I2C में, आपको I_O पोर्ट फ़ोल्डर मिलेगा। उस फ़ोल्डर में हमारे पहले उदाहरण प्रोग्राम और USI I2C ड्राइवरों के लिए कोड है। WinAVR का उपयोग करके, कोड को ATtiny2313 में संकलित और लोड करें। एक गहरी सांस लें और बिजली चालू करें। यहाँ क्या उम्मीद की जाए: बिजली चालू होने पर, ATtiny2313 के पोर्ट PD6 पर LED 1 दो बार झपकाता है। जब तक आप बटन (S1) को धक्का नहीं देते तब तक कुछ और नहीं होगा। हर बार जब बटन दबाया जाता है, तो स्विच पढ़े जाते हैं और उनकी सेटिंग PCA8574A से जुड़ी एलईडी पर प्रदर्शित की जाएगी। स्विच का मान बदलें, बटन दबाएं, और एलईडी बदलनी चाहिए। इसे तब तक करते रहें जब तक आप इसे काम करते हुए देखने का रोमांच खत्म न कर दें। अगर (भगवान न करे!) चीजें उम्मीद के मुताबिक काम नहीं करती हैं, तो ध्यान से अपनी वायरिंग की जांच करें। I2C त्रुटियों को LED3 (PD4) पर पलक झपकते संकेत दिया जाएगा और शायद इसका मतलब है कि आपको यह जांचने की आवश्यकता है कि SDA और SCL सही पिन से जुड़े हैं और सही तरीके से खींचे गए हैं।अगर चीजें अभी भी काम नहीं करती हैं, तो डिबगिंग के बारे में जानने के लिए इस सेक्शन के बाकी हिस्सों को पढ़ें। अब वापस जाएं और कोड पर एक नजर डालते हैं। फ़ाइल खोलें USI_I2C_Port.c. यह उदाहरण कार्यक्रम के लिए कोड है। (USI_TWI_Master.c और USI_TWI_Master.h में ड्राइवर होते हैं - जब तक आप उत्सुक न हों तब तक आप उन्हें अनदेखा कर सकते हैं।) अपने स्वयं के I2C अनुप्रयोगों को निर्देशित करने के लिए उदाहरण का उपयोग करें। अधिकतर, प्रोग्राम आपको दिखाता है कि सेटिंग सहित I2C ड्राइवरों को कैसे प्रारंभ और उपयोग करना है दास का पता और शेष संदेश बफर, और इससे डेटा प्राप्त करना। आप यह भी देखेंगे कि मैं कैसे बटन को डिब्यू करता हूं और जबकि लूप सेट करता हूं। कार्यक्रम के बारे में कुछ विवरण ध्यान देने योग्य हैं। ध्यान दें कि पोर्ट एक्सपैंडर पर एलईडी को लिखे जाने से पहले स्विच से डेटा उलटा होता है। यह भी ध्यान दें कि पोर्ट एक्सपैंडर पर इनपुट पोर्ट को ठीक से काम करने के लिए उच्च के रूप में लिखा जाना चाहिए। उन विवरणों का वर्णन PCA8574A डेटा शीट में किया गया है। डेटा शीट को हमेशा ध्यान से पढ़ें! सशर्त डिबगिंग का उपयोग अधिक रुचि का है। प्रोग्राम फ़ाइल की शुरुआत के पास स्टेटमेंट है //# डिफाइन DEBUG और पूरे कोड में छिड़काव #ifdef DEBUG स्टेटमेंट हैं। जब तक DEBUG परिभाषित नहीं किया जाता है (दो स्लैश लाइन को एक टिप्पणी बनाते हैं और इसे परिभाषित होने से रोकते हैं), #ifdef से #endif स्टेटमेंट के भीतर कोड संकलित नहीं किया जाएगा। लेकिन अगर चीजें आपकी अपेक्षा के अनुरूप काम नहीं करती हैं, तो कोड को #define DEBUG असम्बद्ध के साथ फिर से संकलित करें और पुनः लोड करें। आपको एल ई डी पर बहुत अधिक ब्लिंक मिलेंगे जिन्हें आप अपने प्रोग्राम के निष्पादन का पालन करने के लिए डीकोड कर सकते हैं और आपको यह पता लगाने में सहायता कर सकते हैं कि चीजें कहां गलत हैं। वास्तव में, मैं अनुशंसा करता हूं कि आप यह देखने के लिए प्रयास करें कि क्या होता है। आप जो देखेंगे वह यह है कि कार्यक्रम के माध्यम से निष्पादन प्रगति के रूप में एलईडी 2 (पीडी 5 पर) झपकाएगा। पोर्ट एक्सपैंडर एलईडी पर प्रदर्शित होने से पहले स्विच से पढ़े गए मान को एलईडी 1 (पीडी 6) पर ब्लिंक किया जाएगा। आपको इन एल ई डी का उपयोग करके प्रोग्राम के चलने पर ट्रैक करने में सक्षम होना चाहिए। हम आगे ATmega168 के साथ काम करेंगे; यदि आप केवल ATtiny2313 में रुचि रखते हैं तो इस अनुभाग को छोड़ दें। अभी तक मेरे साथ है? अच्छा। TWI_I2C फ़ोल्डर में ले जाएँ, अपनी कार्यशील निर्देशिका को IO_Port में बदलें, और TWI_I2C_Port.c को ATmega168 में संकलित और लोड करें। SDA और SCL लाइनों को ATtiny2313 से डिस्कनेक्ट करें और उन्हें ATmega168 से कनेक्ट करें। पावर और ग्राउंड को हुक करें, और पावर अप करें। ऑपरेशन वही होना चाहिए! जब तक रोमांच कम न हो जाए तब तक खेलें, फिर आइए कोड देखें। TWI_I2C_Port.c खोलें। त्रुटि प्रबंधन और इंटरप्ट संचालित ड्राइवरों को समायोजित करने के अलावा कोड लगभग समान है। यहां अंतर हैं: ध्यान दें कि I2C बस के ठीक से काम करने के लिए घड़ी को 4MHz पर सेट किया जाना चाहिए। सेई (); I2C ड्राइवरों के आरंभीकरण के बाद स्टेटमेंट इंटरप्ट को चालू करता है। त्रुटियों की जांच करने के लिए, एक विशिष्ट स्थिति बिट का परीक्षण किया जाता है। पढ़ने के दौरान, संदेश बफर में पढ़े गए डेटा को स्थानांतरित करने के लिए TWI_Read_Data_From_Buffer फ़ंक्शन को कॉल किया जाना चाहिए। लेखन के दौरान, जबकि (TWI_Transceiver_Busy ()) का उपयोग यह सुनिश्चित करने के लिए किया जाना चाहिए कि त्रुटियों की जांच करने से पहले स्थानांतरण पूरा हो गया है। ये अंतिम दो कार्य ड्राइवरों के विवरण में ऊपर वर्णित हैं। इसके अलावा, कोड काफी हद तक ATtiny2313 के समान ही है। यदि आप उसके साथ प्रयोग करना चाहते हैं तो DEBUG भी वही काम करता है।

चरण 6: I2C मेमोरी का उपयोग करना

I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना
I2C मेमोरी का उपयोग करना

अब जब हमने I/O पोर्ट एक्सपैंडर को पढ़ने और लिखने के लिए I2C बस का उपयोग करना सीख लिया है, तो चलिए I2C मेमोरी, RAM और EEPROM दोनों का उपयोग करने के लिए आगे बढ़ते हैं। मुख्य अंतर यह है कि एक I2C कमांड के साथ कई बाइट्स को मेमोरी से पढ़ा या लिखा जा सकता है। इन प्रयोगों के लिए तैयार होने के लिए, हमें हार्डवेयर को थोड़ा संशोधित करने और ब्रेडबोर्ड पर कुछ नए सर्किट बनाने की आवश्यकता है। पोर्ट एक्सपैंडर सर्किट रखें क्योंकि हम इसका उपयोग कुछ मेमोरी वैल्यू प्रदर्शित करने के लिए करेंगे। PCA8574A से DIP स्विच निकालें और उन पिनों पर ब्लिंकनलाइट्स लगाएं। यदि आपके पास पर्याप्त ब्लिंकनलाइट्स नहीं हैं, तो P4 के माध्यम से P7 पर P3 के माध्यम से P0 पर ले जाएँ। (प्रदर्शित किए जाने वाले मान काफी छोटे हैं।) अब योजनाबद्ध I2C Ram.pdf को देखें और ब्रेडबोर्ड पर PCF8570 को हुक करें। आप भी देखिए तस्वीर। पिन 7 को Vcc से अवश्य बांधें। PCA8574A से SDA और SCL के लिए तार चलाएँ। कोई अतिरिक्त पुल-अप प्रतिरोधों की आवश्यकता नहीं है। यदि आप EEPROM में भी रुचि रखते हैं, तो उस सर्किट को 24C16 के लिए I2C EEPROM.pdf का उपयोग करके भी बनाएं, लेकिन सावधान रहें कि उदाहरण ATmega168 का उपयोग करता है। यह सर्किट वास्तव में सरल है। जैसा कि ऊपर चर्चा की गई है, पता बिट्स को अनदेखा किया जाना चाहिए। बस सत्ता और जमीन को जोड़ो। SDA और SCL को अभी तक कनेक्ट न करें क्योंकि हमने राम के साथ प्रयोग करना समाप्त नहीं किया है। हम PCA8574A पोर्ट एक्सपैंडर और PCF8570 Ram से जुड़े ATtiny2313 के साथ अपने मेमोरी प्रयोग शुरू करेंगे। प्रोग्राम राम को कुछ नंबर लिखेगा, फिर उन्हें वापस पढ़ेगा और पोर्ट एक्सपैंडर पर प्रदर्शित करेगा। USI I2C के तहत अपनी कार्यशील निर्देशिका को RAM में बदलें। USI_I2C_RAM.c को संकलित और डाउनलोड करने के लिए मेक फ़ाइल का उपयोग करें। ध्यान दें कि I2C ड्राइवर फ़ाइलें उन फ़ाइलों के समान हैं जिनका हमने पहले उपयोग किया था। पावर को हुक करें और आपको LED 1 (PD6) पर सिंगल ब्लिंक देखना चाहिए। मेमोरी के पहले 4 बाइट्स में डेटा लिखा जाएगा। बटन दबाएं और दो बाइट्स वापस पढ़े जाएंगे और प्रदर्शित होंगे। आपको पोर्ट एक्सपैंडर (P0) पर एक एलईडी लाइट, दो सेकंड का ठहराव, फिर दो एलईडी लाइट (P0 और P1) देखनी चाहिए। एक और दो सेकंड का विराम और एल ई डी बंद हो जाना चाहिए। क्रम को फिर से शुरू करने के लिए फिर से बटन दबाएं। डिबगिंग ऊपर वर्णित विधि के समान है। आइए कोड पर एक नज़र डालें। USI_I2C_RAM.c खोलें। यह पिछले कोड के समान ही दिखना चाहिए। मुख्य अंतर स्मृति पढ़ने और लिखने का विवरण है। वास्तव में लिखने वाले कॉल से पहले संदेश बफर लोड होने के तरीके को देखें। पहला बाइट स्लेव एड्रेस है जिसमें उचित रूप से रीड / राइट बिट सेट होता है। लेकिन अगला बाइट मेमोरी एड्रेस है जिस पर डेटा लिखना शुरू करना है। फिर वास्तविक डेटा बाइट्स आता है जो हमारे द्वारा निर्दिष्ट पते पर शुरू होने वाली मेमोरी में क्रमिक रूप से लोड किया जाएगा। हम संदेश का आकार 6 के रूप में निर्दिष्ट करते हैं। इसलिए हम पते 00 पर लिखना शुरू करते हैं और मान 01, 03, 02 और 06 को स्मृति स्थानों 00 से 03 में लिखते हैं। मेमोरी से डेटा को वापस पढ़ने के लिए हमें USI_TWI_Start_Random_Read फ़ंक्शन का उपयोग करना चाहिए। संदेश बफर को पहले बाइट में दास का पता और दूसरे बाइट में शुरुआती पता मिलता है। फिर फ़ंक्शन को संदेश आकार सेट के साथ बाइट्स की संख्या पर प्लस 2 पढ़ने के लिए कॉल करें। ध्यान दें कि पढ़ने/लिखने का बिट कोई फर्क नहीं पड़ता क्योंकि एक पठन परवाह किए बिना किया जाएगा। लौटाया गया डेटा संदेश बफ़र में दूसरे स्थान पर प्रारंभ होगा। एक बार डेटा पढ़ने के बाद, इसे पोर्ट एक्सपैंडर पर प्रदर्शित करने के लिए उलटा किया जाता है और मूल्यों के बीच एक विराम के साथ एक बार में एक बाइट लिखा जाता है। अंत में, पोर्ट एक्सपैंडर एलईडी बंद कर दिए जाते हैं। पोर्ट एक्सपैंडर को लिखे गए लेख पिछले उदाहरणों में किए गए लेखन के समान हैं। मनोरंजन के लिए, आप उपरोक्त के रूप में #define DEBUG स्टेटमेंट को अनकम्मेंट कर सकते हैं और बहुत सारे ब्लिंकिंग एल ई डी देख सकते हैं। एक और सफल प्रयोग के बाद उत्साह से भरे हुए, आइए ATmega168 और एक EEPROM पर चलते हैं। TWI I2C के तहत अपनी कार्यशील निर्देशिका को EEPROM में बदलें। TWI_I2C_EEPROM.c को संकलित और डाउनलोड करने के लिए मेक फ़ाइल का उपयोग करें। ध्यान दें कि I2C ड्राइवर फ़ाइलें उन फ़ाइलों के समान हैं जिन्हें हमने पहले PCA8574A के लिए उपयोग किया था। प्रोग्राम का परीक्षण करने के लिए, ATtiny2313 को डिस्कनेक्ट करें और ATmega168. I2C बस को राम से लगा रहने दें और पावर अप करें। परिणाम अलग हैं क्योंकि अब हम अधिक डेटा लिख और पढ़ रहे हैं। PD7 पर LED 1 को इनिशियलाइज़ेशन के समय ब्लिंक करना चाहिए। बटन दबाएं और डेटा मेमोरी से वापस पढ़ा जाएगा और प्रदर्शित किया जाएगा। PCA8574 पर एलईडी को निम्नलिखित क्रम में ब्लिंक करना चाहिए: P1, P0 और P2, (सभी बंद), P0 और P1, P1 और P2। अंत में पोर्ट एलईडी को बंद कर देना चाहिए। इसे दोहराने के लिए फिर से बटन दबाएं।ओह, लेकिन रुको, तुम कहो। क्या यह कार्यक्रम EEPROM के लिए नहीं है? चूंकि हम एक ही I2C पते पर एक मेमोरी डिवाइस का उपयोग कर रहे हैं, वही प्रोग्राम राम और EEPROM दोनों के लिए काम करता है। पावर डाउन करें और एसडीए और एससीएल को राम से ईईपीरोम में ले जाएं और प्रोग्राम को फिर से चलाएं। यह बिल्कुल वैसा ही काम करना चाहिए। ध्यान दें कि EEPROM और Ram को एक ही समय में I2C बस से नहीं जोड़ा जा सकता क्योंकि वे एक ही पता साझा करते हैं। (आप में से चतुर लोग राम पर प्रोग्राम करने योग्य पता बिट्स को बदलने पर विचार कर सकते हैं, लेकिन यह अभी भी काम नहीं करेगा। 24C16 पते के पूरे ब्लॉक का उपयोग करता है जिसे राम के लिए प्रोग्राम किया जा सकता है।) ठीक है, आइए इस अंतिम कार्यक्रम को देखें।. TWI_I2C_EEPROM.c खोलें। ध्यान देने वाली पहली बात यह है कि मैंने संकेत दिया है कि पूरे 24C16 EEPROM को कैसे संबोधित किया जाए। इसे 8 अलग-अलग I2C स्लेव एड्रेस पर 256 बाइट चंक्स में एक्सेस किया जा सकता है। देखें कि MEMORY_ADDR को ५० हेक्साडेसिमल पर आरंभिक पते के रूप में कैसे परिभाषित किया जाता है; इसलिए राम ने काम किया। यदि आप २४सी१६ के अन्य ब्लॉकों तक पहुंचना चाहते हैं, तो अन्य पतों का उपयोग करें जैसा मैंने बताया है। इस पर एक नज़र डालें कि मैंने स्मृति में लिखने के लिए कैसे सेट अप किया। पहले रीड/राइट बिट सेट के साथ स्लेव एड्रेस को बफर में रखा जाता है, फिर 00 का शुरुआती पता, फिर 16 बाइट्स डेटा। फ़ंक्शन TWI_Start_Read_Write को डेटा (पहले की तरह) लिखने के लिए कहा जाता है, जिसमें संदेश का आकार 18 पर सेट होता है। जब बटन दबाया जाता है, तो हम डेटा को वापस पढ़ने के लिए TWI_Start_Random_Read और TWI_Read_Data_From_Buffer का उपयोग करते हैं। हर तीसरे बाइट को पोर्ट एक्सपैंडर एलईडी पर प्रदर्शित किया जाता है। अंत में, अगले बटन प्रेस की प्रतीक्षा करने के लिए एल ई डी बंद कर दिए जाते हैं। आपको आश्चर्य हो सकता है कि मैंने 16 बाइट्स लिखना क्यों चुना। यदि आप डेटा शीट को ध्यान से पढ़ते हैं, तो आप देखेंगे कि 24C16 एक लेखन चक्र करता है जब भी उसे 16 बाइट प्राप्त होते हैं, भले ही अधिक बाइट भेजे जा रहे हों। तो यह उपयोग करने के लिए एक अच्छी संख्या की तरह लग रहा था। यदि आप इसे बढ़ाना चुनते हैं, तो आपको MESSAGEBUF_SIZE का आकार बदलना होगा। आपको TWI_Master.h में TWI_BUFFER_SIZE मान भी बदलना होगा। ऐसा इसलिए है क्योंकि ड्राइवर इंटरप्ट सर्विस रूटीन द्वारा उपयोग के लिए संदेश बफर से डेटा की प्रतिलिपि बनाता है। बधाई हो! अब आप अपनी परियोजनाओं में I2C बस का उपयोग करने के लिए तैयार हैं!

चरण 7: वेब संसाधन

प्रयोगों के लिए उपयोग किए गए भागों के लिए डेटाशीट के लिंक यहां दिए गए हैं। यदि आपको और कुछ नहीं मिलता है तो आपको ये निश्चित रूप से प्राप्त करने चाहिए। पोर्ट एक्सपैंडररामईप्रोमआई२सी के निर्माता होने के नाते, एनएक्सपी (फिलिप्स) में बहुत सारी अच्छी चीजें हैं। (वे अपने URL में वर्गाकार कोष्ठकों का उपयोग करना पसंद करते हैं, इसलिए मैं उन्हें यहाँ ठीक से शामिल नहीं कर सकता। क्षमा करें।] I2C क्षेत्र में जाने के लिए, उत्पाद सूची से इंटरफ़ेस चुनें। आप उनकी I2C साइट पर जा सकेंगे और उनके द्वारा ऑफ़र किए जाने वाले सभी डेटाशीट और ऐप्स नोट तक पहुंच। I2C बस विवरण और विशेष रूप से तकनीकी विवरण यहां हैं। Atmel से ATtiny2313 और ATmega168 डेटाशीट (डेटा बुक?) प्राप्त करें। Atmel एप्लिकेशन नोट यहां हैं। AVR310 और AVR315 देखें। कोड भी प्राप्त करें। बहुत अधिक I2C सामान के लिए यहां देखें।

चरण 8: गीक्स के लिए नोट्स

सच्चे गीक के लिए जो विवरण जानना चाहता है, अगर आप एटमेल ऐप्स नोट्स और ड्राइवर कोड को देखते हैं तो कुछ बातों को ध्यान में रखना चाहिए: - I2C डिवाइस को संबोधित करने और कमांड करने की विधि कल्पना का हिस्सा नहीं है! स्लेव एड्रेस और रीड/राइट बिट के अलावा, कमांड, मोड आदि निर्दिष्ट नहीं हैं और किसी दिए गए डिवाइस के लिए विशिष्ट हैं। इसे बहुत स्पष्ट करने के लिए, ध्यान दें कि एटमेल उदाहरण में उपयोग की जाने वाली योजना केवल उस उदाहरण पर लागू होती है, और यह काफी गैर-मानक है। यूएसआई कार्यान्वयन कुछ महत्वपूर्ण तरीकों से टीडब्ल्यूआई कार्यान्वयन से अलग है। + यूएसआई के साथ, सॉफ्टवेयर द्वारा क्लॉकिंग प्रदान की जाती है; TWI के साथ यह एक बिट दर जेनरेटर द्वारा प्रदान किया जाता है। + यूएसआई विधि इंटरप्ट का उपयोग नहीं करती है; TWI करता है। यह एक निश्चित मात्रा में समझ में आता है क्योंकि मेगा परिवार (TWI का उपयोग करके) बहुत सी अन्य चीजें कर सकता है और I2C स्थानान्तरण से प्रभावित नहीं होना चाहिए। यूएसआई के लिए एक इंटरप्ट संचालित संस्करण निश्चित रूप से संभव है, यह इस निर्देश में लागू नहीं किया गया है। + USI हार्डवेयर I2C के लिए अनुकूलित नहीं है और केवल 8 बिट स्थानान्तरण को संभाल सकता है। इसका मतलब है कि नौवें बिट (या तो एनएके या एसीके) भेजने के लिए दो स्थानान्तरण की आवश्यकता है। TWI हार्डवेयर इसे स्वचालित रूप से संभालता है। यह USI ड्राइवर कार्यान्वयन को थोड़ा और जटिल बनाता है। + TWI के लिए त्रुटि का पता लगाने को हार्डवेयर में नियंत्रित किया जाता है। यूएसआई को सॉफ्टवेयर में हैंडलिंग की आवश्यकता होती है जो चीजों को कुछ हद तक जटिल बनाता है। + TWI हार्डवेयर सीधे पोर्ट के कॉन्फ़िगरेशन को नियंत्रित करता है। USI हार्डवेयर के लिए आवश्यक है कि पोर्ट का उपयोग करने से पहले पोर्ट बिट्स को कॉन्फ़िगर किया जाए। आप इसे USI के लिए Master_Initialize रूटीन में देखेंगे।- Atmel का दावा है कि I2C बस पुल-अप के लिए AVR पोर्ट पुल-अप का उपयोग करना संभव है। मुझे उस दृष्टिकोण को काम करने का कोई तरीका नहीं मिला है। दो बाहरी प्रतिरोधों का उपयोग करना एक बहुत ही सरल योजना की तरह लगता है, इसलिए मैंने इस पर बहुत समय नहीं लगाया।

सिफारिश की: