সুচিপত্র:

ATtiny এবং ATmega এর জন্য I2C বাস: 8 টি ধাপ
ATtiny এবং ATmega এর জন্য I2C বাস: 8 টি ধাপ

ভিডিও: ATtiny এবং ATmega এর জন্য I2C বাস: 8 টি ধাপ

ভিডিও: ATtiny এবং ATmega এর জন্য I2C বাস: 8 টি ধাপ
ভিডিও: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, জুলাই
Anonim
ATtiny এবং ATmega এর জন্য I2C বাস
ATtiny এবং ATmega এর জন্য I2C বাস

আমি Atmel AVR মাইক্রোকন্ট্রোলার পছন্দ করি! এই নির্দেশনায় বর্ণিত ঘেটো ডেভেলপমেন্ট সিস্টেম তৈরির পর থেকে, আমি বিশেষ করে AVR ATtiny2313 এবং ATmega168 এর সাথে মজা করার কোন শেষ ছিলাম না। আমি এমনকি ইনপুট হিসাবে সুইচ ব্যবহার করার জন্য একটি নির্দেশমূলক লিখতে গিয়েছিলাম, এবং ঘেটো ডেভেলপমেন্ট সিস্টেম ধারণাটি CPLDs পর্যন্ত প্রসারিত করেছি একটি সাম্প্রতিক প্রকল্পের সময়, নিয়ন্ত্রণ মান নির্ধারণের জন্য আমার বেশ কয়েকটি সুইচ প্রয়োজন। AVR গুলোর পর্যাপ্ত I/O পিন ছিল না, তাই আমাকে কিছু ভাবতে হয়েছিল। আমি একটি কীবোর্ড এবং ডিসপ্লে সহ একটি জটিল ইনপুট সিস্টেম চেষ্টা করতে পারতাম, কিন্তু ATtiny2313 সম্পদ শেষ হয়ে যেত। সৌভাগ্যবশত, এটমেল একটি ইন্টারফেস অন্তর্ভুক্ত করে এই সমস্যার সমাধানের একটি উপায় প্রদান করেছে যা একটি সহজ দুটি তারের ইন্টারফেসের সাথে অতিরিক্ত চিপ (যেমন মেমরি বা I/O পোর্ট) এর সাথে সংযুক্ত হতে পারে। এটা ঠিক, একটি AVR- এ মাত্র দুটি I/O পিন ব্যবহার করে আমরা অনেক অতিরিক্ত I/O পিন এবং অন্যান্য রিসোর্স অ্যাক্সেস করতে পারি। এই দুটি তারের ইন্টারফেসটি আনুষ্ঠানিকভাবে ইন্টার-ইন্টিগ্রেটেড সার্কিট বাস, বা কেবল আই 2 সি বাস হিসাবে পরিচিত এবং এটি তখনও ফিলিপস সেমিকন্ডাক্টর ছিল এনএক্সপি দ্বারা উদ্ভাবিত হয়েছিল। আপনি যদি এই নির্দেশনাটি পড়ছেন তবে আপনি সম্ভবত I2C বাসের কথা শুনেছেন এবং এমনকি এটি একটি PIC বা অন্যান্য মাইক্রোকন্ট্রোলারে ব্যবহার করতে পারেন। যদিও ধারণাগতভাবে খুব সহজ, এবং AVR- তে হার্ডওয়্যার রিসোর্স দ্বারা সমর্থিত, সফ্টওয়্যার ড্রাইভার এখনও I2C বাস ব্যবহার করার জন্য প্রয়োজনীয়। এটমেল অ্যাপ্লিকেশন নোট সরবরাহ করে (পরে এই নির্দেশাবলীতে সম্পদগুলি দেখুন), কিন্তু এগুলি অসম্পূর্ণ এবং অন্য AVR ডিভাইসের সাথে যোগাযোগের বাইরে কোন উদাহরণ দেখায় না। এই নির্দেশনাটির উদ্দেশ্য নয় যে কাউকে কিভাবে I2C ড্রাইভার তৈরি করতে হয় তা শেখানো। AVRs বরং, আমি ATtiny2313 এবং ATmega168 ডিভাইসের জন্য Atmel ড্রাইভারের সম্প্রসারিত সংস্করণ সরবরাহ করব, আমি এইগুলি ব্যবহার করার সময় প্রযোজ্য প্রয়োজনীয়তা এবং বিধিনিষেধগুলি ব্যাখ্যা করব এবং আমি আপনাকে I2C ডিভাইসের কাজের উদাহরণ দেখাব। আপনি এই নির্দেশের মাধ্যমে কাজ করার পর আপনি আপনার AVR প্রকল্পে I2C বাস সফলভাবে ব্যবহার করতে পারবেন। স্পষ্টতই, আপনি ছোট বা মেগা উভয়ের জন্য ড্রাইভারকে উপেক্ষা করতে পারেন যদি আপনি কেবল তাদের মধ্যে একটিতে আগ্রহী হন। যারা I2C বাস সম্পর্কে আরো জানতে আগ্রহী তাদের জন্য, আমি উপযুক্ত উপাদানের লিঙ্ক প্রদান করব।

ধাপ 1: যাই হোক না কেন এই সব I2C স্টাফ?

এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?
এই সব I2C স্টাফ যাই হোক না কেন?

I2C বাস একটি সহজ, দুই-তারের সংযোগ যা একাধিক ডিভাইসকে একসাথে লিঙ্ক করতে পারে এবং তাদের তথ্য বিনিময় করতে দেয়। এর সহজতম আকারে একটি মাস্টার ডিভাইস রয়েছে যা একাধিক স্লেভ ডিভাইসে যোগাযোগ করে। সমস্ত ডিভাইস I2C বাসের দুটি তারের সমান্তরালে সংযুক্ত। দুটি তারের এসসিএল এবং এসডিএ নামে পরিচিত। এসসিএল হল ক্লক লাইন এবং মাস্টার ডিভাইস দ্বারা নিয়ন্ত্রিত। SDA হল দ্বিমুখী ডেটা লাইন। ডেটা ট্রান্সফার করার জন্য, মাস্টার একটি বিট রিড/রাইট পতাকার সাথে একটি দাসের ঠিকানা পাঠায়। যদি কোন লেখার ইচ্ছা হয়, তাহলে মাস্টার ঠিকানাযুক্ত ক্রীতদাসকে তথ্য পাঠাতে থাকবে। যদি একটি পড়ার অনুরোধ করা হয়, ক্রীতদাস তথ্য দিয়ে সাড়া দেবে। লেনদেনের সমন্বয় করার জন্য, এসসিএল এবং এসডিএ লাইনগুলি বেশ কয়েকটি শর্তের সংকেত দিতে মাস্টার এবং দাস দ্বারা হেরফের করা হয়। এর মধ্যে রয়েছে START, STOP, ACK (স্বীকৃতি) এবং NAK (কোন স্বীকৃতি নেই)। এই অবস্থার বিবরণ চালকদের দ্বারা পরিচালিত হয়। আপনার মধ্যে সত্যিকারের geeks এই নির্দেশাবলীর শেষে প্রদত্ত লিঙ্কগুলিতে সমস্ত বিবরণ জানতে পারেন বৈদ্যুতিক প্রয়োজনীয়তা বেশ সহজ। Vcc- এর জন্য মাস্টার এবং ক্রীতদাসদের অবশ্যই একই স্তর ব্যবহার করতে হবে, ভিত্তিগুলি অবশ্যই সংযুক্ত থাকতে হবে, এবং SCLC এবং SDA লাইনগুলি Vcc পর্যন্ত টানতে হবে। পুল-আপ প্রতিরোধকগুলির মান বাসে মোট ক্যাপাসিট্যান্সের উপর ভিত্তি করে একটি গণনা দ্বারা সঠিকভাবে নির্ধারিত হয়, তবে কার্যত 1.8K এবং 10K এর মধ্যে যে কোনও মান হতে পারে। আমি 5.1K দিয়ে শুরু করি এবং কম মান ব্যবহার করি যতক্ষণ না এটি কাজ করে। এটি সাধারণত একটি সমস্যা নয় যদি না আপনার কাছে অনেকগুলি ডিভাইস বা ডিভাইসের মধ্যে দীর্ঘ তারের দৈর্ঘ্য থাকে I2C বাসে নামমাত্র ডেটা রেট 100Kbit/সেকেন্ড। 400 কেবিটস/সেকেন্ড, 1 এমবিটস/সেকেন্ড এবং তার পরেও হার সম্ভব, কিন্তু এই নির্দেশাবলীর ড্রাইভার দ্বারা সমর্থিত নয়। সমস্ত I2C ডিভাইস 100Kbit/সেকেন্ডে কাজ করবে। ATtiny2313 এবং ATmega168 প্রতিটি I2C বাসকে ভিন্নভাবে বাস্তবায়ন করে। ATtiny2313 ইউনিভার্সাল সিরিয়াল ইন্টারফেস (ইউএসআই) হার্ডওয়্যার ব্যবহার করে - যা এসপিআই বাসের জন্যও ব্যবহার করা যেতে পারে। ATmega168 I2C বাসের জন্য ডেডিকেটেড হার্ডওয়্যার রয়েছে যা টু ওয়্যার ইন্টারফেস (TWI) নামে পরিচিত। একবার ড্রাইভার লেখা হয়ে গেলে, এই পার্থক্যগুলি বেশিরভাগ ব্যবহারকারীর কাছে স্বচ্ছ। সফটওয়্যারের মধ্যে একটি উল্লেখযোগ্য পার্থক্য হল: ATmega168 I2C ড্রাইভার ইন্টারাপ্ট চালিত যখন ATTiny2313 এর জন্য নয়। এর মানে হল যে একটি ATmega168 প্রোগ্রামকে I2C ডেটা স্থানান্তরের জন্য অপেক্ষা করতে হবে না, তবে অন্য ট্রান্সফার শুরু করার আগে, অথবা একটি রিড অপারেশন থেকে ডেটা না আসা পর্যন্ত অপেক্ষা করতে হবে। উদাহরণ এবং আলোচনা অনুসরণ করা উচিত এটি স্পষ্ট করা উচিত I2C ঠিকানাগুলি 7 বিট লম্বা, তাই প্রতিটিতে একটি অনন্য ঠিকানা থাকলে 127 টি ডিভাইস বাসে থাকতে পারে। চিত্রে দেখানো হয়েছে, এই 7 বিট ঠিকানাটি এক বিট বামে স্থানান্তরিত করা হয়েছে এবং ঠিকানায় ডিভাইসের পড়া বা লিখতে পতাকা লাগানোর জন্য সর্বনিম্ন উল্লেখযোগ্য বিট ব্যবহার করা হয়। এইভাবে সম্পূর্ণ স্লেভ ঠিকানা হল একটি 8 বিট বাইট। আসল ঠিকানাটি ডিভাইসে আংশিকভাবে নির্ধারিত হয় এবং এটি পরিবর্তন করা যায় না (4 টি সবচেয়ে গুরুত্বপূর্ণ বিট), এবং আংশিকভাবে বিট দ্বারা নির্ধারিত হয় যা ডিভাইসের পিনের সাথে সংযুক্ত হতে পারে (3 টি কমপক্ষে উল্লেখযোগ্য বিট) যা সেট করার জন্য উঁচু বা নিচু হতে পারে একটি নির্দিষ্ট ঠিকানা। বিভ্রান্তিকর মনে হচ্ছে, কিন্তু একটি উদাহরণ এটি পরিষ্কার করবে। PCA8574A ডেটা শীট দেখায় যে I2C ঠিকানার চারটি উল্লেখযোগ্য বিট সবসময় 0111 হবে। পরবর্তী তিনটি বিট AD0, AD1 এবং AD2 পিনের সেটিংস দ্বারা নির্ধারিত হয়। এই পিনগুলি মাটিতে বা ধনাত্মক ভোল্টেজ সাপ্লাইতে (5 ভোল্ট) যথাক্রমে 0 বা 1 প্রতিনিধিত্ব করতে পারে। সুতরাং সম্ভাব্য ঠিকানার পরিসীমা 38 থেকে 3F হেক্সাডেসিমাল, যেমনটি PCA8574 ডেটা শীট থেকে অন্য চিত্রে দেখানো হয়েছে। তাই ঠিকানা বিট সেটিংস পরিবর্তন করে, 8 PCA8574A পর্যন্ত একই সময়ে I2C বাসে থাকতে পারে। প্রত্যেকে শুধুমাত্র তার নির্দিষ্ট দাসের ঠিকানায় সাড়া দেবে। যদি আরো 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/ O ইন্টারফেস এক্সপেন্ডার (আমার প্রিয়), একটি স্ট্যাটিক রাম, এবং একটি EEPROM। আরো অনেক কিছু আছে, কিন্তু এগুলি একটি দুর্দান্ত শুরু। আমরা যে AVR প্রসেসর ব্যবহার করব তা হল ATtiny2313 এবং Atmega168 (Arduino এ ব্যবহৃত)। যদি আপনি এইগুলিতে নতুন হন, তাহলে তাদের সম্পর্কে জানতে এবং আপনার ঘেটো ডেভেলপমেন্ট সিস্টেম তৈরির জন্য এই দুর্দান্ত নির্দেশিকাটি দেখুন। বর্তমান নির্দেশনায় ATmega168 এর পরিকল্পিত দেখায় কিভাবে এই প্রসেসরের জন্য ঘেটো ডেভেলপমেন্ট সিস্টেম বাস্তবায়ন করতে হয়। সমান্তরাল পোর্ট কেবলটি ATtiny2313 এর মতো। (আমি ঘেটো ডেভেলপমেন্ট সিস্টেমের ইউএসবি ভার্সন ব্যবহার করে দেখিনি, তাই আমি নিশ্চিত নই যে কিভাবে আই 2 সি বাসে প্রবেশ করা যায় এক্সপেন্ডার 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM সিরিয়াল 16K CAT24C16LI-G-ND

ধাপ 3: I2C ড্রাইভার

এখানে I2C বাসের ড্রাইভার ফাংশনের বর্ণনা দেওয়া হল। এগুলি শুরু করার জন্য এটমেল অ্যাপস নোট ব্যবহার করে তৈরি করা হয়েছিল। আমি তাদের ছাড়া এই কাজটি করতে পারতাম না। WinAVR এবং gcc C কম্পাইলার ব্যবহার করে উন্নয়ন করা হয়েছিল। প্রতিটি প্রসেসরের জন্য ক্লক রেট বিধিনিষেধ নিচে বর্ণিত হয়েছে। যেহেতু আমি সম্ভাব্য সব প্রসেসরের গন্ধ / ঘড়ির হার কম্বিনেশন পরীক্ষা করতে পারছি না, তাই আমি আসলে যা যা পরীক্ষা করতে পারি তা মেনে চলব এবং সীমাবদ্ধতা এবং সীমাবদ্ধতা নির্দেশ করার চেষ্টা করব। আরো বিস্তারিত জানার জন্য এবং সম্পূর্ণ প্রোগ্রামে ব্যবহারের ফাংশন দেখতে অনুগ্রহ করে উদাহরণ দেখুন। আপনি যদি অন্য হারে চালাতে চান, তাহলে আপনাকে ড্রাইভারগুলিতে স্থিরতা সামঞ্জস্য করতে হবে। আপনার যদি এটি করতে সাহায্যের প্রয়োজন হয় তবে আমাকে ইমেল করুন। আপনি সম্পদ ধাপের লিঙ্কগুলিতে Atmel অ্যাপস নোট থেকে কিছু ইঙ্গিত পেতে পারেন। আপনার প্রোগ্রামের শুরুতে একবার এটি কল করুন। এটি অকার্যকর হয়ে যায় এবং কোন যুক্তি নেই। যেহেতু এই ফাংশনটি শুধুমাত্র একটি ত্রুটি কোড প্রদান করে, তাই আমি একটি ত্রুটি LED ফ্ল্যাশ করার জন্য 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) দাস ঠিকানা বাফারে প্রথম বাইট হিসেবে রাখুন। এটি একটি বিট বাম দিকে স্থানান্তর করুন বা পড়ুন/লিখুন বিট। নোট করুন রিড/রাইট বিট একটি পড়ার জন্য 1 এবং একটি লেখার জন্য 0 হবে। এই উদাহরণটি একটি পড়ার জন্য। messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (সত্য << TWI_READ_BIT); 3) একটি লেখার সময়, বাইটটি বাফারে পরবর্তী অবস্থানে লিখতে হবে একটি ত্রুটি ঘটেছে কিনা তা দেখতে ফেরত মান (এই ক্ষেত্রে temp) পরীক্ষা করা যেতে পারে। যদি তাই হয়, এটি উপরে আলোচনা হিসাবে পরিচালিত হয়। প্রোগ্রামগুলিতে উদাহরণ দেখুন। 6) যদি একটি পড়ার অনুরোধ করা হয়, বাইটটি বাফারের দ্বিতীয় অবস্থানে থাকবে যদি একাধিক বাইট লিখতে হয় (যেমন একটি মেমরি ডিভাইসে), এই একই রুটিন ব্যবহার করা যেতে পারে। বাফার সেট করা এবং রুটিন কল করা কিছুটা আলাদা। বাফারের দ্বিতীয় বাইট হবে মেমরি অ্যাড্রেস যেখানে লিখতে হবে। লিখিত তথ্য পরবর্তী বাইটে থাকবে। সমস্ত বৈধ ডেটা সহ বার্তার আকার আকার হবে। সুতরাং যদি 6 বাইট লিখতে হয়, তাহলে বার্তার আকার 8 হবে (স্লেভ অ্যাড্রেস + মেমরি অ্যাড্রেস + ডেটা 6 বাইট)। এক ধরণের স্মৃতি। এই রুটিন ব্যবহার করা আগের রুটিনের সাথে খুব মিল, দুটি ব্যতিক্রম ছাড়া। পড়ুন/লিখুন বিট সেটিং কোন ব্যাপার না। এই রুটিনকে কল করা সর্বদা একটি রিড অপারেশনের কারণ হবে। ATMEGA168 এর জন্য ড্রাইভারগুলি 4MHz ঘড়ির হারের জন্য ডিজাইন করা হয়েছে। উদাহরণ কোড দেখায় কিভাবে এই ঘড়ির হার সেট করতে হয়। আপনি যদি অন্য হারে চালাতে চান, তাহলে আপনাকে ড্রাইভারগুলিতে স্থিরতা সামঞ্জস্য করতে হবে। আপনার যদি এটি করার প্রয়োজন হয় তবে আমাকে ইমেল করুন। আপনার প্রোগ্রামের শুরুতে একবার এটি কল করুন। এটি অকার্যকর হয়ে যায় এবং কোন যুক্তি নেই। শুরু করার পরে swi () কল করে বাধা সক্ষম করতে ভুলবেন না। TWI_Get_State_Info () এই ফাংশনটি I2C ত্রুটির তথ্য প্রদান করে এবং যদি একটি I2C লেনদেনের সময় ত্রুটি ঘটে তাহলে ব্যবহার করা হয়। যেহেতু এই ফাংশনটি শুধুমাত্র একটি ত্রুটি কোড প্রদান করে, তাই আমি একটি ত্রুটি LED ফ্ল্যাশ করার জন্য TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) ফাংশনটি ব্যবহার করি। ত্রুটি কোডগুলি TWI_Master.h তে সংজ্ঞায়িত করা হয়েছে, কিন্তু একটি ত্রুটি LED এ সংকেত দেওয়ার জন্য সংশোধন করা হয়েছে। বিস্তারিত জানার জন্য উদাহরণ কোড দেখুন। এখানে কিভাবে এটি কল করতে হয়: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) মনে রাখবেন যে I2C লেনদেন সম্পূর্ণ হয়েছে তা নিশ্চিত করে ত্রুটি যাচাই করা হয়েছে (নীচে বর্ণিত ফাংশন) এবং তারপর গ্লোবাল স্ট্যাটাস শব্দে একটু পরীক্ষা করে দেখুন। দুটি ফাংশন উপরে বর্ণিত সংশ্লিষ্ট ফাংশনগুলির মতই কাজ করে কিন্তু কয়েকটি ব্যতিক্রম ছাড়া তারা কোন ত্রুটির মান ফেরত দেয় না। ডেটা পড়া বাফারে স্থানান্তরিত হয় না। এটি করার পরের বর্ণিত ফাংশনটি সম্পন্ন করা হবে। অর্থাৎ, I2C লেনদেন শুরু হয় এবং তারপর স্বাধীনভাবে চালানো হয় যখন প্রধান রুটিন চলতে থাকে। যখন মূল রুটিনটি একটি I2C লেনদেন থেকে ডেটা চায় যা এটি শুরু করেছে, এটি অবশ্যই ডেটা পাওয়া যায় কিনা তা পরীক্ষা করে দেখতে হবে। ত্রুটি যাচাইয়ের ক্ষেত্রেও একই অবস্থা। প্রধান রুটিন অবশ্যই নিশ্চিত হওয়া উচিত যে I2C লেনদেন সম্পূর্ণ হয়েছে ত্রুটিগুলি পরীক্ষা করার আগে। পরবর্তী দুটি ফাংশন এই উদ্দেশ্যে ব্যবহার করা হয়। উদাহরণ প্রোগ্রামগুলি দেখায় যে এটি কিভাবে ব্যবহার করতে হয়। এই ফাংশনটি নিশ্চিত করবে যে ডেটা স্থানান্তরের আগে I2C লেনদেন সম্পূর্ণ হয়েছে। যদিও এই ফাংশন দ্বারা একটি মান ফেরত দেওয়া হয়, আমি আরো নির্ভরযোগ্য হতে সরাসরি ত্রুটি বিট চেকিং খুঁজে পাই। এখানে কিভাবে এটি কল করতে হয়। মেসেজের সাইজ কাঙ্ক্ষিত ডেটা বিটের সংখ্যার চেয়ে বড় হওয়া উচিত। ডেটা মেসেজবফে দ্বিতীয় অবস্থানে শুরু হবে। টেম্প = TWI_Read_Data_From_Buffer

ধাপ 4: আসুন তৈরি করি

চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!
চলুন গড়ে তুলি!

ফাইল I2C Schematics.zip ডাউনলোড করে শুরু করুন। আপনি আপনার কর্মক্ষেত্রে একটি I2C ফোল্ডার তৈরি করতে পারেন যাতে স্কিম্যাটিক্স এবং উদাহরণ প্রোগ্রাম ফাইলগুলি রাখা যায়। এই ডিরেক্টরিতে স্কিম্যাটিক্স আনজিপ করুন। আপনি I2C Schematics নামে একটি ফোল্ডার পাবেন। ক্ষুদ্র I2C.pdf নামের ফাইলটি খুলুন। এই পরিকল্পিতটি ATtiny2313 Ghetto Development System, এবং PCA8574A I/O Port Expander (এর চারপাশে বড় ড্যাশড বক্স আছে) দেখায়। পোর্ট এক্সপেন্ডার সার্কিটটি একটি ব্রেডবোর্ডের উপর নির্মিত। এই সার্কিটগুলি দেখতে কেমন তা দেখতে ফটোগুলি দেখুন। এগুলি সত্যিই খুব সহজ। পরিকল্পিত ATTiny2313 অংশটি কেবল ঘিটো ডেভেলপমেন্ট সিস্টেমের সাথে তিনটি ব্লিঙ্কলাইট (LED1, 2, এবং 3, প্লাস R4, 5, এবং 6) এবং একটি পুশবটন (S1) এর সাথে যুক্ত, প্লাস ওয়ান অতিরিক্ত বিস্তারিত। এই বিবরণটি হল জাম্পার (JP4, 5, এবং 6) এর সংযোজন যা I2C বাস এসসিএল এবং এসডিএ লাইনের সংযোগের জন্য সরানো যেতে পারে। জাম্পারগুলিকে অবশ্যই প্রোগ্রামিং এর জায়গায় থাকতে হবে, তারপর অপসারণ করা হবে যাতে এসসিএল এবং এসডিএ সংযুক্ত হতে পারে। ফটোগুলি দেখায় জাম্পারগুলি জায়গায় এবং সরানো হয়েছে। এই জাম্পারদের বসানো আপনার উপর নির্ভর করে, যদি আপনি 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 এর যোগ। এগুলি বসানোর জন্য ছবিগুলি দেখুন, সেগুলি চিপের খুব কাছাকাছি হওয়া উচিত; তাদের মধ্যে একটি আসলে চিপের নিচে। এগুলি বিশেষ করে এনালগ থেকে ডিজিটাল কনভার্টারের বাইরে শব্দ রাখতে সাহায্য করে। এসপিআই বাস ব্যবহার করার পরিকল্পনা না করা পর্যন্ত আপনাকে জাম্পার লাগানোর দরকার নেই কারণ এই চিপে I2C বাসের প্রয়োজন নেই। উল্লেখ্য যে PCA8754A ব্রেডবোর্ড অপরিবর্তিত থাকবে। আপনি শুধু এসডিএ এবং এসসিএল সংযুক্ত করবেন এবং আপনি চলে যাবেন! সহজ, তাই না?

ধাপ 5: আসুন কোড এবং পরীক্ষা করি

আসুন কোড এবং পরীক্ষা করি!
আসুন কোড এবং পরীক্ষা করি!
আসুন কোড এবং পরীক্ষা করি!
আসুন কোড এবং পরীক্ষা করি!
আসুন কোড এবং পরীক্ষা করি!
আসুন কোড এবং পরীক্ষা করি!

এটি ড্রাইভার এবং উদাহরণ প্রোগ্রাম নির্মাণের সময়। আমরা ATtiny2313 এবং PCA8574A ব্রেডবোর্ড দিয়ে শুরু করব যা আমরা সদ্য তৈরি করেছি। I2C.zip ফাইলটি আপনার I2C ওয়ার্ক ডিরেক্টরিতে ডাউনলোড করে আনজিপ করুন। আপনার কাছে I2C নামে একটি নতুন ফোল্ডার থাকবে। এতে আপনি USI I2C (ATtiny2313 এর জন্য) এবং TWI I2C (ATmega168 এর জন্য) পাবেন। USI I2C- এ, আপনি I_O পোর্ট ফোল্ডারটি পাবেন। সেই ফোল্ডারে আমাদের প্রথম উদাহরণ প্রোগ্রামের কোড এবং USI I2C ড্রাইভার রয়েছে। একটি গভীর শ্বাস নিন এবং শক্তি চালু করুন। এখানে কি আশা করা যায়: পাওয়ার এ, ATTiny2313 পোর্ট PD6 তে LED 1 দুবার জ্বলজ্বল করে। আপনি বাটন (S1) না চাপানো পর্যন্ত আর কিছুই হবে না। প্রতিবার বোতাম টিপে, সুইচগুলি পড়া হয় এবং তাদের সেটিং PCA8574A- এর সাথে সংযুক্ত LEDs তে প্রদর্শিত হবে। সুইচগুলির মান পরিবর্তন করুন, বোতাম টিপুন, এবং LEDs পরিবর্তন করা উচিত। এটি করতে থাকুন যতক্ষণ না আপনি এটিকে কাজ করে দেখার রোমাঞ্চ না পায়। যদি (forbশ্বর নিষেধ করেন!) জিনিসগুলি প্রত্যাশিতভাবে কাজ করে না, সাবধানে আপনার ওয়্যারিং পরীক্ষা করুন। LED2 (PD4) তে ঝলক দিয়ে I2C ত্রুটিগুলি সংকেত দেওয়া হবে এবং সম্ভবত এর মানে হল যে আপনাকে এসডিএ এবং এসসিএল সঠিক পিনের সাথে সংযুক্ত এবং সঠিকভাবে টেনে আনা হয়েছে কিনা তা পরীক্ষা করতে হবে।যদি জিনিসগুলি এখনও কাজ না করে, ডিবাগিং সম্পর্কে জানতে এই বিভাগের বাকি অংশ পড়ুন এখন ফিরে যান এবং কোডটি দেখুন। USI_I2C_Port.c ফাইলটি খুলুন। এটি উদাহরণ প্রোগ্রামের কোড। (USI_TWI_Master.c এবং USI_TWI_Master.h চালকদের ধারণ করে - আপনি কৌতূহলী না হওয়া পর্যন্ত আপনি তাদের উপেক্ষা করতে পারেন।) আপনার নিজের I2C অ্যাপ্লিকেশনগুলিকে গাইড করার জন্য উদাহরণটি ব্যবহার করুন। প্রধানত, প্রোগ্রামটি আপনাকে দেখায় কিভাবে সেটিং সহ I2C ড্রাইভারগুলি আরম্ভ এবং ব্যবহার করতে হয় ক্রীতদাসের ঠিকানা এবং বাকী বার্তা বাফার, এবং এটি থেকে তথ্য বের করা। আপনি আরও দেখতে পাবেন কিভাবে আমি বোতামটি ডিবাউন্স করি এবং যখন লুপ সেট আপ করি। প্রোগ্রামের কয়েকটি বিবরণ উল্লেখ করার মতো। মনে রাখবেন যে পোর্ট এক্সপেন্ডারে LEDs এ লেখা হওয়ার আগে সুইচগুলি থেকে তথ্য উল্টানো হয়। এছাড়াও লক্ষ্য করুন যে পোর্ট এক্সপেন্ডারের ইনপুট পোর্টগুলিকে সঠিকভাবে কাজ করার জন্য উচ্চ হিসাবে লিখতে হবে। সেই বিবরণ PCA8574A ডেটা শীটে বর্ণিত হয়েছে। সর্বদা ডেটা শীট সাবধানে পড়ুন! আরো আগ্রহের বিষয় হল শর্তাধীন ডিবাগিং ব্যবহার। প্রোগ্রাম ফাইলের শুরুর কাছাকাছি বিবৃতি // #DEBUG সংজ্ঞায়িত করুন এবং কোড জুড়ে ছিটিয়ে দেওয়া হল #ifdef DEBUG স্টেটমেন্ট। যতক্ষণ না DEBUG সংজ্ঞায়িত করা হয় (দুটি স্ল্যাশ লাইনটিকে একটি মন্তব্য করে এবং এটি সংজ্ঞায়িত করা থেকে বিরত রাখে), #ifdef থেকে #endif স্টেটমেন্টের মধ্যে কোড সংকলিত হবে না। কিন্তু যদি জিনিসগুলি আপনার প্রত্যাশা অনুযায়ী কাজ না করে তবে কোডটি পুনরায় কম্পাইল করুন এবং #define DEBUG এর সাথে কোডটি পুনরায় লোড করুন। আপনি এলইডি -তে আরও অনেক বেশি ঝাপসা পাবেন যা আপনি আপনার প্রোগ্রামের বাস্তবায়ন অনুসরণ করতে ডিকোড করতে পারেন এবং ঠিক কোথায় জিনিসগুলি ভুল হচ্ছে তা খুঁজে পেতে আপনাকে সহায়তা করতে পারে। প্রকৃতপক্ষে, আমি সুপারিশ করছি আপনি শুধু চেষ্টা করে দেখুন কি হয়। আপনি যা দেখবেন তা হল যে LED 2 (PD5 তে) প্রোগ্রামের মাধ্যমে এক্সিকিউশন অগ্রগতি হিসাবে জ্বলজ্বল করবে। পোর্ট এক্সপেন্ডার এলইডি -তে প্রদর্শিত হওয়ার আগে সুইচ থেকে পড়া মান LED 1 (PD6) তে জ্বলজ্বল করবে। আপনি এই LEDs ব্যবহার করে প্রোগ্রামটি চালানোর জন্য ট্র্যাক করতে সক্ষম হওয়া উচিত। আপনি শুধুমাত্র ATtiny2313 তে আগ্রহী হলে এই বিভাগটি এড়িয়ে যান। এখনও আমার সাথে? ভাল. TWI_I2C ফোল্ডারে যান, আপনার কাজের ডিরেক্টরিটি IO_Port এ পরিবর্তন করুন এবং ATmega168 এ TWI_I2C_Port.c কম্পাইল এবং লোড করুন। ATtiny2313 থেকে SDA এবং SC লাইন সংযোগ বিচ্ছিন্ন করুন এবং তাদের 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 বাস ব্যবহার করতে শিখেছি, আসুন RAM এবং EEPROM উভয়ই I2C স্মৃতিগুলি ব্যবহার করি। মূল পার্থক্য হল একক I2C কমান্ড দিয়ে স্মৃতি থেকে একাধিক বাইট পড়া বা লেখা যায়। এই পরীক্ষাগুলির জন্য প্রস্তুত হওয়ার জন্য, আমাদের হার্ডওয়্যারকে সামান্য পরিবর্তন করতে হবে এবং ব্রেডবোর্ডে কয়েকটি নতুন সার্কিট তৈরি করতে হবে। পোর্ট এক্সপেন্ডার সার্কিট রাখুন যেহেতু আমরা এটিকে কিছু মেমরি মান প্রদর্শন করতে ব্যবহার করব। PCA8574A থেকে DIP সুইচগুলি সরান এবং সেই পিনগুলিতে ব্লিংক লাইট লাগান। যদি আপনার কাছে পর্যাপ্ত ঝলকানি না থাকে তবে P7 থেকে P7 কে P0 থেকে P3 তে সরান। (প্রদর্শিত মানগুলি যথেষ্ট ছোট।) এখন পরিকল্পিত I2C Ram.pdf দেখুন এবং ব্রেডবোর্ডে PCF8570 সংযুক্ত করুন। ছবিটিও দেখুন। Vcc- এ 7 পিন বাঁধতে ভুলবেন না। PCA8574A থেকে SDA এবং SCL এর জন্য তারগুলি চালান। কোন অতিরিক্ত পুল-আপ প্রতিরোধক প্রয়োজন হয় যদি আপনি EEPROM- এ আগ্রহী হন, তাহলে 24C16 এর জন্য I2C EEPROM.pdf ব্যবহার করে সেই সার্কিটটি তৈরি করুন, কিন্তু সতর্ক করুন যে উদাহরণটি ATmega168 ব্যবহার করে। এই সার্কিট সত্যিই সহজ। উপরে আলোচনা হিসাবে, ঠিকানা বিট উপেক্ষা করা উচিত। শুধু শক্তি এবং স্থল সংযুক্ত করুন। এসডিএ এবং এসসিএলকে সংযুক্ত করবেন না যেহেতু আমরা রামের সাথে পরীক্ষা শেষ করি নি আমরা PCA8574A পোর্ট এক্সপেন্ডার এবং PCF8570 রামের সাথে সংযুক্ত ATtiny2313 এর সাথে আমাদের স্মৃতি পরীক্ষা শুরু করব। প্রোগ্রামটি রামকে কিছু নম্বর লিখবে, তারপর সেগুলি আবার পড়ুন এবং পোর্ট এক্সপেন্ডারে তাদের প্রদর্শন করুন। USI_I2C_RAM.c কম্পাইল এবং ডাউনলোড করতে মেক ফাইলটি ব্যবহার করুন। মনে রাখবেন যে I2C ড্রাইভার ফাইলগুলি আমরা পূর্বে ব্যবহৃত ফাইলগুলির অনুরূপ। পাওয়ার হুক আপ এবং আপনি LED 1 (PD6) একটি একক ঝলক দেখতে হবে। ডেটা মেমরির প্রথম 4 বাইটে লেখা হবে। বোতাম টিপুন এবং দুটি বাইট ফিরে পড়া এবং প্রদর্শিত হবে। আপনি পোর্ট এক্সপেন্ডার (P0), একটি দুই সেকেন্ড বিরতিতে একটি LED আলো দেখতে হবে, তারপর দুটি LEDs আলো (P0 এবং P1)। অন্য দুই সেকেন্ড বিরতি এবং LEDs বন্ধ করা উচিত। ক্রমটি শুরু করতে আবার বোতাম টিপুন। ডিবাগিং উপরে বর্ণিত পদ্ধতির অনুরূপ। আসুন কোডটি দেখুন। USI_I2C_RAM.c খুলুন। এটি আগের কোডের মতো দেখতে হওয়া উচিত। প্রধান পার্থক্য হল স্মৃতি পড়া এবং লেখার বিবরণ। যেভাবে কলটি লেখার আগে মেসেজ বাফার লোড করা হয় তা দেখুন। প্রথম বাইট হল স্লেভ অ্যাড্রেস যথাযথভাবে রিড/রাইট বিট সেট। কিন্তু পরের বাইট হল মেমরির ঠিকানা যেখানে ডেটা লেখা শুরু করতে হবে। তারপরে আসল ডেটা বাইট আসে যা ক্রমানুসারে মেমরিতে লোড করা হবে যা আমাদের নির্দিষ্ট ঠিকানা থেকে শুরু হবে। আমরা মেসেজের সাইজ 6 হিসাবে উল্লেখ করি। তাই আমরা ঠিকানা 00 এ লিখতে শুরু করি এবং মেমরি লোকেশনে 00, 03 তে 01, 03, 02 এবং 06 এর মান লিখি। বার্তা বাফার প্রথম বাইটে দাস ঠিকানা এবং দ্বিতীয় বাইটে শুরুর ঠিকানা পায়। তারপর ফাংশনটি মেসেজ সাইজের সাথে সেট করে বাইটের সংখ্যার সাথে যোগ করুন 2। ফেরত দেওয়া ডেটা মেসেজ বাফারে দ্বিতীয় স্থানে শুরু হবে। একবার ডেটা পড়া হয়ে গেলে, এটি পোর্ট এক্সপেন্ডারে প্রদর্শনের জন্য উল্টানো হয় এবং মানগুলির মধ্যে বিরতি দিয়ে একে একে এক বাইট লেখা হয়। অবশেষে, পোর্ট এক্সপেন্ডার LEDs বন্ধ করা হয়। পোর্ট এক্সপেন্ডারের লেখাগুলি আগের উদাহরণগুলিতে যা করা হয়েছিল তার অনুরূপ। মজা করার জন্য, আপনি উপরের মত #ডিফাইন ডিবাগ স্টেটমেন্টটি অসম্পূর্ণ করতে পারেন এবং প্রচুর জ্বলজ্বলে LEDs দেখতে পারেন। TWI I2C এর অধীনে আপনার কাজের ডিরেক্টরি EEPROM এ পরিবর্তন করুন। TWI_I2C_EEPROM.c কম্পাইল এবং ডাউনলোড করতে মেক ফাইলটি ব্যবহার করুন। মনে রাখবেন যে I2C ড্রাইভার ফাইলগুলি আমরা PCA8574A- এর জন্য আগে ব্যবহার করেছি তার অনুরূপ। প্রোগ্রামটি পরীক্ষা করার জন্য, ATtiny2313 সংযোগ বিচ্ছিন্ন করুন এবং ATmega168 সংযুক্ত করুন। I2C বাসটি রামের সাথে যুক্ত করুন এবং শক্তি বাড়ান। ফলাফলগুলি আলাদা কারণ আমরা এখন আরও ডেটা লিখছি এবং পড়ছি। PD7 তে LED 1 আরম্ভের সময় জ্বলজ্বলে হওয়া উচিত। বোতাম টিপুন এবং ডেটা মেমরি থেকে ফিরে পড়বে এবং প্রদর্শিত হবে। PCA8574 এর LEDs নিম্নলিখিত ক্রমটি ঝলকানো উচিত: P1, P0 & P2, (সব বন্ধ), P0 এবং P1, P1 এবং P2। অবশেষে পোর্ট LEDs সব বন্ধ করা উচিত। এটি পুনরাবৃত্তি করতে আবার বোতাম টিপুন ওহ, কিন্তু অপেক্ষা করুন, আপনি বলছেন। এই প্রোগ্রামটি কি EEPROM এর জন্য নয়? যেহেতু আমরা একই I2C ঠিকানায় একটি মেমরি ডিভাইস অ্যাক্সেস করছি, একই প্রোগ্রাম রাম এবং EEPROM উভয়ের জন্য কাজ করে। পাওয়ার ডাউন এবং এসডিএ এবং এসসিএলকে রাম থেকে ইইপিআরওমে সরান এবং প্রোগ্রামটি আবার চালান। এটি ঠিক একইভাবে কাজ করা উচিত। মনে রাখবেন যে EEPROM এবং রাম একই সময়ে I2C বাসের সাথে সংযুক্ত হতে পারে না কারণ তারা একই ঠিকানা শেয়ার করে। (আপনার মধ্যে যারা বুদ্ধিমান তারা রামের উপর প্রোগ্রামযোগ্য অ্যাড্রেস বিট পরিবর্তন করার কথা বিবেচনা করতে পারে, কিন্তু এটি এখনও কাজ করবে না। 24C16 ঠিকানার পুরো ব্লক ব্যবহার করে যা রামের জন্য প্রোগ্রাম করা যায়।) ঠিক আছে, আসুন এই শেষ প্রোগ্রামটি দেখি । TWI_I2C_EEPROM.c খুলুন। লক্ষ্য করার প্রথম জিনিস হল যে আমি সম্পূর্ণ 24C16 EEPROM কে কিভাবে সমাধান করতে হবে তা নির্দেশ করেছি। এটি 8 টি ভিন্ন I2C স্লেভ ঠিকানায় 256 বাইট অংশে অ্যাক্সেস করা যেতে পারে। দেখুন কিভাবে MEMORY_ADDR 50 হেক্সাডেসিমালে শুরু ঠিকানা হিসেবে সংজ্ঞায়িত করা হয়েছে; সেই কারণেই রাম কাজ করেছিল। আপনি যদি 24C16 এর অন্যান্য ব্লকগুলি অ্যাক্সেস করতে চান, তবে অন্যান্য ঠিকানাগুলি ব্যবহার করুন যেমনটি আমি নির্দেশ করেছি। আমি স্মৃতিতে লিখতে কিভাবে সেট আপ করেছি তা দেখুন। প্রথমে রিড/রাইট বিট সেট সহ স্লেভ অ্যাড্রেস বাফারে রাখা হয়, তারপর 00 এর শুরু ঠিকানা, তারপর 16 বাইট ডেটা। TWI_Start_Read_Write ফাংশনটি ডাকা হয় (আগের মত) বার্তা আকার 18 এর সাথে সেট করার জন্য। প্রতি তৃতীয় বাইট পোর্ট এক্সপেন্ডার এলইডিতে প্রদর্শিত হয়। অবশেষে, LEDs বন্ধ করা হয় পরবর্তী বোতাম টিপে অপেক্ষা করার জন্য। আপনি হয়তো ভাবছেন কেন আমি 16 বাইট লিখতে বেছে নিলাম। আপনি যদি ডাটা শীটটি সাবধানে পড়েন, আপনি দেখতে পাবেন যে 24C16 একটি লেখার চক্র করে যখনই এটি 16 বাইট পায় এমনকি যদি আরও বাইট পাঠানো হয়। তাই এটি ব্যবহার করার জন্য একটি সুন্দর নম্বর বলে মনে হয়েছিল। যদি আপনি এটি বৃদ্ধি করতে চান, তাহলে আপনাকে MESSAGEBUF_SIZE এর আকার পরিবর্তন করতে হবে। আপনাকে TWI_Master.h তে TWI_BUFFER_SIZE মান পরিবর্তন করতে হবে। এর কারণ হল চালক বার্তা বাফার থেকে ডেটা অনুলিপি করে সার্ভিস রুটিন দ্বারা ব্যবহারের জন্য। অভিনন্দন! আপনি এখন আপনার নিজস্ব প্রকল্পে I2C বাস ব্যবহার করতে প্রস্তুত!

ধাপ 7: ওয়েব সম্পদ

পরীক্ষার জন্য ব্যবহৃত অংশগুলির জন্য ডেটশীটের লিঙ্কগুলি এখানে। যদি আপনি অন্য কিছু না পান তবে আপনার অবশ্যই এগুলি পাওয়া উচিত। (তারা তাদের URL গুলিতে বর্গাকার বন্ধনী ব্যবহার করতে পছন্দ করে, তাই আমি সেগুলো সঠিকভাবে এখানে অন্তর্ভুক্ত করতে পারছি না। দু Sorryখিত।] I2C এলাকায় যেতে, পণ্য তালিকা থেকে ইন্টারফেস নির্বাচন করুন। আপনি তাদের I2C সাইটে যেতে পারবেন এবং তাদের দেওয়া সমস্ত ডেটশীট এবং অ্যাপস নোটগুলিতে অ্যাক্সেস। কোডটিও ধরুন আরো অনেক I2C স্টাফের জন্য এখানে দেখুন।

ধাপ 8: Geeks জন্য নোট

সত্যিকারের গেকের জন্য যারা বিস্তারিত জানতে চায়, এখানে কিছু বিষয় মনে রাখতে হবে যদি আপনি Atmel অ্যাপস নোট এবং ড্রাইভার কোড দেখেন:- একটি I2C ডিভাইসকে সম্বোধন এবং কমান্ড করার পদ্ধতিটি বৈশিষ্ট্যের অংশ নয়! স্লেভ অ্যাড্রেস ছাড়া আর রিট/রিট বিট, কমান্ড, মোড ইত্যাদি নির্দিষ্ট নয় এবং নির্দিষ্ট ডিভাইসের জন্য নির্দিষ্ট। এটিকে খুব স্পষ্ট করার জন্য, মনে রাখবেন যে Atmel উদাহরণে ব্যবহৃত স্কিমটি শুধুমাত্র সেই উদাহরণের জন্য প্রযোজ্য, এবং বেশ অ-মানসম্মত। + ইউএসআই এর সাথে, ক্লকিং সফটওয়্যার দ্বারা প্রদান করা হয়; TWI এর সাথে এটি একটি বিট রেট জেনারেটর দ্বারা সরবরাহ করা হয়। + ইউএসআই পদ্ধতি বাধা ব্যবহার করে না; TWI করে। এটি মেগা পরিবার (TWI ব্যবহার করে) অন্যান্য অনেক কাজ করতে পারে এবং I2C স্থানান্তর দ্বারা হগ করা উচিত নয়, যেহেতু এটি একটি নির্দিষ্ট পরিমাণ জ্ঞান করে। ইউএসআই এর জন্য একটি বাধা চালিত সংস্করণ অবশ্যই সম্ভব, এটি কেবল এই নির্দেশনায় প্রয়োগ করা হয়নি। + ইউএসআই হার্ডওয়্যার I2C এর জন্য অপ্টিমাইজ করা হয়নি এবং শুধুমাত্র 8 বিট স্থানান্তর পরিচালনা করতে পারে। এর মানে হল যে নবম বিট (NACK বা ACK) পাঠানোর জন্য দুটি স্থানান্তর প্রয়োজন। TWI হার্ডওয়্যার এটি স্বয়ংক্রিয়ভাবে পরিচালনা করে। এটি ইউএসআই ড্রাইভার বাস্তবায়নকে একটু বেশি জটিল করে তোলে। + TWI এর জন্য ত্রুটি সনাক্তকরণ হার্ডওয়্যারে পরিচালিত হয়। ইউএসআই সফটওয়্যারে হ্যান্ডলিং প্রয়োজন যা জিনিসগুলিকে কিছুটা জটিল করে তোলে। + TWI হার্ডওয়্যার সরাসরি বন্দরের কনফিগারেশন নিয়ন্ত্রণ করে। ইউএসআই হার্ডওয়্যারের জন্য প্রয়োজন যে পোর্ট ব্যবহার করার আগে পোর্ট বিট কনফিগার করা উচিত। আপনি USI- এর জন্য Master_Initialize রুটিনে এটি দেখতে পাবেন।-Atmel দাবি করে I2C বাস পুল-আপের জন্য AVR পোর্ট পুল-আপ ব্যবহার করা সম্ভব। আমি সেই পদ্ধতির কাজ করার উপায় খুঁজে পাইনি। দুটি বাহ্যিক প্রতিরোধক ব্যবহার করা একটি খুব সাধারণ স্কিমের মতো মনে হয়, তাই আমি এতে বেশি সময় ব্যয় করি নি।

প্রস্তাবিত: