سلام و درودی دوباره خدمت دوست داران AVR. در این قسمت از آموزش نحوه راه اندازی at24c512 که یک eeprom خارجی است را همراه با برنامه شرح خواهیم داد. قبل از اینکه وارد جزییات بشیم، باید گفت که خیلی مواقع احتیاج به یک حافظه eeprom خارجی ضروری میشود و در میکروکنترلرهای AVR به رغم وجود eeprom داخلی، گاهی اوقات باید از حافظه خارجی استفاده کرد. آیسی فوق ذکر یک eeprom خارجی با حجم 512 کیلوبیت یا 64 کیلوبایت است. این آیسی نه تنها با AVR بلکه با میکروکنترلرهای سری STM32 نیز راه اندازی خواهد شد.
مشخصات آی سی at24c512
دو حرف اول یعنی “at” بیانگر ساخته شده توسط شرکت atmel است. دو حرف بعدی “24C” نشان دهنده پروتکل استاندارد I2C برای برقراری ارتباط با آی سی است. و در نهایت عدد “512” ظرفیت حافظه را بر حسب کیلو بیت نشان میدهد. نمای آی سی را در شکل زیر مشاهده میکنید.
آی سی فوق، شامل 8 پایه است که به عبارتاند از:
- پایه 4 و 8 به ترتیب GND و VCC میباشند. تغذیه مورد نیاز بین 1.7 تا 5.5 ولت است.
- پایههای SCL و SDA مربوط به پروتکل I2C بوده و باید به میکروکنترلر جهت بر قراری ارتباط متصل شوند.
- پایههای A0، A1 و A2 آدرس فیزیکی آی سی را مشخص میکنند. یعنی میتوان 8 عدد از این آی سی را به صورت موازی کنار هم قرار داد که هر کدام آدرس مجزایی دارند. این کار زمانی استفاده میشود که به حجم بیشتری از حافظه احتیاج داشته باشیم.
- و در نهایت پایه WP یا Write Protect به عنوان محافظت در برابر نوشتن روی حافظه است. اگر این پایه 1 شود، هیچ گونه اطلاعاتی نمیتوان بر روی حافظه نوشت.
راه اندازی at24c512 در کدویژن توسط تابع
برای راه اندازی at24c512 بنده کتابخانهای برای کدویژن نوشتهام که میتوانید از این لینک دانلود کنید. پس از دانلود آن را از حالت فشرده خارج کرده و 2 فایل نهایی را در مسیرهای زیر قرار دهید که بتوان آنها را در کدویژن وارد کرد.
در نهایت برای استفاده از کتابخانه، آن را به صورت زیر در برنامه وارد کنید:
توابع کتابخانه at24c512
کتابخانه فوق شامل 2 تابع به نامهای at24c512_write و at24c512_read است که اولی برای نوشتن و دومی برای خواندن اطلاعات از روی حافظه به کار میرود.
نکته: در توابع این کتابخانه از توابع مربوط به کار با I2C استفاده شده که میتوانید از آموزش راه اندازی I2C نحوه چگونگی کار با آنها را یاد بگیرید.
تابع at24c512_write
این تابع دارای 4 آرگومان ورودی است که به عبارت اند از:
- آرگومان اول آدرس فیزیکی آی سی است. گفتیم که آدرس فیزیکی با توجه به وضعیت پایههای A0 تا A2 تعیین میشود. لذا این پارامتر میتواند عددی بین 0 تا 7 بگیرد.
- آرگومان دوم آدرس شروع حافظه است که میخواهیم اطلاعات را در آن بنویسیم. چون آی سی فوق 64 کیلوبایت ظرفیت دارد، به همین خاطر آدرس حافظه میتواند از 0 تا 65535 مقداردهی شود.
- آرگومان سوم آرایهای از اطلاعات است که میخواهیم روی حافظه نوشته شود. این آرایه حتما باید از نوع کاراکتر یا 1 بایتی باشد.
- آرگومان چهارم تعداد بایتهایی است که از آرایه فوق باید بر روی حافظه ریخته شود. این مقدار بنابر محدودیت آی سی نباید از 128 بیشتر شود.
تابع at24c512_read
این تابع آرگومانهای مشابه با تابع at24c512_write دارد. شرح آرگومانها به صورت زیر است:
- آرگومان اول آدرس فیزیکی آی سی است که میخواهیم اطلاعات را از آن بخوانیم. مقدار این آرگومان از 0 تا 7 باید باشد.
- آرگومان دوم آدرس شروع حافظه است که میخواهیم اطلاعات از آنجا خوانده شود. مقدار این آرگومان 0 تا 65535 است.
- آرگومان سوم آرایهای است که میخواهیم اطلاعات خوانده شده از حافظه بر روی آن قرار گیرد.
- آرگومان چهارم تعداد بایتهایی است که میخواهیم از حافظه بخوانیم.
مثال: نوشتن و خواندن اطلاعات بر روی آی سی at24c512
برنامهای مینویسیم که 10 بایت داده را از آدرس 0 حافظه نوشته و در نهایت بعد از وقفهای کوتاه، آنها را بخواند و به صورت تک تک بر روی پورت B نشان دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <mega8.h> #include <delay.h> #include <at24c512.h> #include <twi.h> unsigned char write_buff[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; unsigned char read_buff[10]; unsigned char i; void main(void) { twi_master_init(100); DDRB = 0xFF; at24c512_write(0x00, 0x0000, write_buff, 10); delay_ms(100); at24c512_read(0x00, 0x0000, read_buff, 10); for(i=0;i<10;i++) { PORTB = read_buff[i]; delay_ms(500); } while(1); } |
توضیح برنامه
در اول برنامه کتابخانههای مورد نیاز به همراه کتابخانه at24c512.h و twi.h به برنامه وارد شدهاند.
آرایه write_buff به طول 10 بایت بوده و شامل اعداد 1 تا 10 است. میخواهیم این آرایه را بر روی حافظه بنویسیم.
آرایه read_buff به طول 10 بایت است و اطلاعات خوانده شده از حافظه روی این آرایه قرار میگیرد.
متغیر i که برای شمارش داخل حلقه for استفاده میشود.
در داخل تابع main از تابع twi_master_init برای پیکربندی I2C استفاده شده است. عدد 100 داخل این تابع، یعنی فرکانس کاری I2C بر روی 100 کیلوهرتز قرار دارد. سپس پورت B به صورت خروجی تعریف میشود.
در ادامه تابع at24c512_write به صورت زیر فراخوانی خواهد شد.
1 2 |
at24c512_write(0x00, 0x0000, write_buff, 10); |
با توجه به صفر بودن پایههای A0 و A1 در شکل بالا، پارامتر اول را 0 قرار میدهیم. پارامتر دوم آدرس حافظه است که میتواند بین 0 تا 65536 باشد. میخواهیم اطلاعات مورد نظر را در اول حافظه بنویسیم؛ لذا این پارامتر هم 0 قرار میدهیم. پارامتر سوم آرایه write_buff بوده و پارامتر چهارم عدد 10 است که مشخص میکند تعداد 10 بایت از آرایه write_buff باید روی حافظه نوشته شود.
بعد از وقفه 100 میلی ثانیه با دستور زیر اطلاعات را از حافظه میخوانیم.
1 2 |
at24c512_read(0x00, 0x0000, read_buff, 10); |
توضیح پارامترهای فوق مشابه تابع قبلی است؛ با این تفاوت که اطلاعات خوانده شده در آرایه read_buff ریخته خواهد شد. در نهایت توسط یک حلقه for تک تک عناصر read_buff به فواصل 500 میلی ثانیه بر روی پورت B نشان داده میشوند.
کلام آخر
در این آموزش سعی بر راه اندازی at24c512 در نرم افزار کدویژن بود که به واسطه توابع انجام شد. در صورتی که میخواهید چگونگی کارکرد توابع را درک کنید، احتیاج به خواندن دیتاشیت آی سی است. توابع کار با I2C توسط خود کدویژن وجود دارند که در داخل سایت آموزش آن قرار گرفته است.
اگر سوال یا مشکلی در اجرای برنامه وجود داشت، آخر همین پست کامنت کنید.
11 پاسخ
سلام برا at24c08میشه یه کتابخونه بهم بدی این کتابخخونه اصلا کار نمیکنه تو واقعیت
دقیقا بفرمایید چه خطایی دریافت کردید؟ مشکلی مشاهده نشده
سلام مهندس
کتابخانه در عمل کار نمیکنه
شما بصورت عملی جواب گرفتین؟
بله مشکلی ندارد
سلام،من یه مشکلی دارم و اینه هست که من اطلاعاتی رو روی حافظه داخل حلقه while اصلی مینویسم و بعد در قسمت بالا حلقه while (قبل ورود برنامه به while)میام همون مقادیر رو میخونم و داخل یه متغیر میریزم،مشکل اینه که موقع خوندن از حافظه،فقط اونجایی رو میخونه که آخرین بار توش نوشته،یعنی مثلا من ده تا خونه رو میخوام توش بنویسم،ولی موقع خوندن آخرین خونه ای که توش نوشته یعنی خونه دهم رو میخونه،الان مثلا بخوام یه پسورد چهار رقمی رو داخل یه آرایه ذخیره کنم،تمام عناصر آرایه برابر با عدد آخرین خونه ای که تو حافظه نوشتم میشه،مثلا یک دو و سه چهار رو تو خونه های یک تا چهار مینویسم،بعد بالای حلقه اصلی میخوام بخونمشون بریزم تو یک آرایه،همه خونه های آرایه برابر چهار میشه!
سوال شما خیلی واضح نیست اما فکر کنم مشکل شما از نوع متغیری باشه که تعریف کردید
سلام آرگومان دوم تابع خواندن مربوط به شروع نقطه ای از حافظه که می خوایم بخونیم کارنمی کنه! و همیشه از خونه صفر می خونه
سلام اگه بخوایم تو کدویژن یه فایل متنی درست کنیم و محتویات read_buff رو داخل اون بریزیم باید چکار کنیم. قصد ندارم روی حافظه mmc ببرم می خوام فایلو از طریق usart بفرسم.
سلام. ممنون از سایت پربارتون
من این برنامه را جواب گرفتم. ولی یه مشکلی هست موقعی که سایز آرایه ام طولانی میشه، مثلا 100 عنصر میشه، شش تا داده اولی و شش تا داده آخری، اشتباه خونده میشن.
مشکل از کجاست؟
در تکمیل سوال قبل ، اینکه سای آرایه ام از 128 که بیشتر میشه، داده ها خراب میشن.
دلیل را هم از روی فایل کتابخانه متوجه شدم، آرایه تعریف شده در کتابخانه 130 عنصری هست که عنصر اول و دوم آن برای آدرس، و بقیه برای دیتا، در نظر گرفته میشن.
مهندس جان سلام
از زحمات جناب عالی بی نهایت سپاس گزارم.
من از این کتابخونه استفاده کردم وکارم راه افتاد.