حتما تا به حال زیاد با اصطلاحات ROM (رام)، EPROM و البته EEPROM روبهرو شدهاید. و احتمالا برایتان سوال شده که مفهوم اینها چیست و تفاوت اصلی آنها چه چیزی است؟ در بخش هفتم از آموزشهای مقدماتی AVR قصد داریم که به بررسی همین موضوع بپردازیم. و سعی کردهایم که به صورت کاربردی و عملی در مورد حافظه EEPROM صحبت کنیم. با ما همراه باشید.
حافظه EEPROM چیست؟
حافظه EEPROM مخفف عبارت Electrically Erasable Programmable Read Only Memory و به معنای حافظه فقط خواندنی قابل پاک شدن با برق میباشد. حافظههای ROM معمولی، اولین نسل از حافظههای فقط خواندنی بودند که اطلاعات داخل آنها با قطع برق از بین نمیرفت و تنها یکبار پروگرام میشدند و دیگر نمیتوانستیم مقدار آن را تغییر دهیم. نسل بعد از آن EPROM بود که علاوه بر خصوصیات یک رام (ROM) میتوانستیم توسط اشعهی فرا بنفش مقادیر آن را پاک کنیم. و در آخر حافظه EEPROM که علاوه بر نگهداری مقادیر در صورت قطع منبع تغذیه، میتوان مقادیر آن را توسط الکتریسته پاک کرد و دوباره پروگرام نمود.
شکل فوق یک آیسی EEPROM است که میتوان به صورت جداگانه از آن در مدارات استفاده کرد. باید گفت که این نمونه آیسیها با توجه به مدلشان ظرفیت به مراتب بیشتری از EEPROM داخلی میکروکنترلر دارند و بیشتر در جاهایی استفاده میشوند که دیتای حجیمی قرار است ذخیره شود.
حافظه EEPROM در ATmega16
اکثر میکروکنترلرهای AVR به صورت داخلی، یک حافظه EEPROM دارند که مقدارشان در هر مدل متفاوت است. در ATmega16 مقدار 512 بایت برای این منظور تعبیه شده است. همانطور که در بالا گفتیم، اگر مقداری در این حافظه ذخیره شود با خاموش شدن میکروکنترلر این مقادیر پاک نشده و میتوان از آنها نگهداری کرد.
برنامهای ساده جهت استفاده از EEPROM
به عنوان مثال برنامهای مینویسیم که مقادیر 0 تا 255 را به صورت دودویی بر روی پورت B میکروکنترلر به ترتیب نمایش دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <mega16.h> #include <delay.h> unsigned int i; void main(void){ DDRB = 0xFF; PORTB = 0x00; while(1){ for(i=0;i<=255;i++){ PORTB = i; delay_ms(1000); } } } |
فرض کنید میکرو تا عدد 5 را شمارش کرده باشد و ناگهان منبع تغذیه قطع شود. اگر میکرو دوباره روشن شود، نتیجه مشخص است: شمارش از 0 شروع خواهد شد. حال اگر بخواهیم شمارش از همان عدد قبل شروع شود باید مقدار i درون حافظه EEPROM ذخیره شود. تنها کافی است هنگام تعریف متغیر i کلمه eeprom را به آن اضافه کنیم. با نوشتن کلمه eeprom رنگ آن صورتی میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <mega16.h> #include <delay.h> eeprom unsigned int i; void main(void){ if(i==0xFFFF) i = 0x0000; DDRB = 0xFF; while(1){ for(;i<=255;i++){ PORTB = i; delay_ms(1000); } i = 0; } } |
برنامه بالا 4 تفاوت کاملا مشهود با برنامه قبل دارد:
- تعریف متغیر با کلمه eeprom آغاز شده است. در این صورت چون i از نوع int است، 2 بایت از فضای eeprom اشغال میشود.
- در حالت اولیه تمام بیتهای حافظه eeprom برابر 1 است. این یعنی با تعریف i مقدار پیشفرض آن 0xFFFF بوده و لازم است در ابتدای main توسط یک if چک کنیم که اگر مقدار i برابر 0xFFFF بود، آن را برابر 0 کند. این if فقط بار اول که میکرو روشن میشود اجرا خواهد شد (چرا؟ جوابش را خودتان بدهید😉).
- چون میخواهیم در دفعات بعدی که میکرو روشن میشود، از همان مقدار قبل شمارش کنیم، پس نباید در داخل for قسمت مقداردهی اولیه را بنویسیم. به همین خاطر فقط یک سمی کولن میگذاریم.
- اگر for تمام شود، چون مقدار اولیه وجود ندارد، در انتهای کار مقدار i را صفر میکنیم.
مرحله اول شبیهسازی و اجرای اول 👇
در فایل تصویری زیر مشاهده میکنید که پس از شمارش تا عدد 5، یکباره شبیهساز را خاموش میکنیم.
مرحله دوم شبیهسازی و اجرای دوم 👇
فایل تصویری زیر اجرای دوباره شبیهسازی را نشان میدهد و همانطور که میبینید شمارش از عدد 5 آغاز میگردد.
پروگرام کردن عملی EEPROM
اگر در برنامه هنگام تعریف یک متغیر در eeprom، مقدار اولیهای به آن بدهید (مثلا 66)، به غیر از فایل hex. فایل دیگری با پسوند eep. باید بر روی میکروکنترلر پروگرام شود. این فایل در همان مسیر Debug/Exe قرار میگیرد. شکل زیر مراحل انجام کار را نشان میدهد.
همانطور که میبینید، با زدن Load Flash و Load Eprom به ترتیب فایلهای hex. و epp. را وارد میکنیم. همچنین به غیر از موارد قبل (آموزش قسمت ششم AVR) باید دو مورد Program EEPROM و Verify EEPROM هم تیک زده شود. در نهایت با زدن Auto تمام این پنج مورد به ترتیب انجام میشوند.
نکته: یکی از فیوزبیتهای مرتبط با EEPROM فیوزبیت EESAVE است. اگر این فیوزبیت پروگرام شود یعنی برابر 0 گردد، با Erase کردن میکروکنترلر، حافظه EEPROM پاک نمیشود و اگر پروگرام نشود (یعنی 1 بودن)، هر بار که میکرو Erase میشود، مقادیر EEPROM هم پاک خواهد شد.
خب همراهان عزیز این بخش هم تمام شد و سعی کردیم هر نکتهای در مورد کار با حافظه EEPROM بود گفته شود. اگر سؤال یا مشکلی دارید زیر همین پست کامنت خودتون رو برای ما ارسال کنید. برای مشاهده آموزش بعدی مبحث وقفه ها کلیک نمایید.
25 پاسخ
بهترین توضیح از تمامی مطالب وب بود
مچکر. سعی خودمون رو میکنیم که مطالب کامل و شفاق باشن.
سلام
یک سوال در زمینه eeprom دارم
وقتی از تابعهای c استفاده می کنیم (مثلا strlen)، این توابع متغییر eeprom رو نمی پذیزند. چگونه باید متغییر eeprom رو به ram انتقال بدیم؟
سلام. eeprom مثل حافظه رم سرعت بالایی نداره. لذا شما باید یک متغیر از همان نوع در حافظه رم ایجاد کنید و مقدار متغیر eeprom را داخل متغییر رم ریخته و روی اون عملیلات انجام بدید. سپس پس از تموم شدن کارتون، دوباره مقدار رو از رم به eeprom منتقل کنید. اگر آرایه ای در eeprom با طول 10 ایجاد کردهاید، در رم هم باید دقیقا همان آرایه با طول 10 ایجاد کنید.
نتیجهگیری: مستقیما عملیات رو روی مقادیر eeprom انجام ندید و از رم استفاده کنید.
بسیار عالی بود مهندس . به امید خدا همیشه پیروز و تندرست باشید.
خواهش میکنم. بقیه آموزش ها رو هم دنبال کنید. به زودی قسمت حرفهای AVR هم روی سایت قرار میگیره.
واقعا عالیه دمتون گرم انشالله همیشه موفق و موید باشید.
خواهش میکنم. از این که حمایت میکنید سپاسگذارم.
بسیار عالی بی نظیر بود این آموزش در سطح ایران، خسته نباشید واقعا ، امیدوارم بیشتر در مورد eeprom مطلب بزارید.❤❤❤❤
سلام ممنون ولی این آموزش مال کد ویژن هست لطفا آموزش های اتمل استودیو رو هم بذارین
بله حتما. آموزش کار با EEPROM در Atmel Studio در آینده قراره میگیره. ممنون بابت بازخورد خوبتون
سلام و سپاس . واضح و کاربردی بود.
موفق باشید از سایر آموزش های مربوط به AVR نیز میتوانید استفاده کنید.
سلام.
خدا خیرت بده کاکو. به درد خورد.
خواهش میکنم🙏
عالی بود ممنون
ممنون مهندس جان، عالی بود
عالی بود ممنون موفق باشی
سلام عرض ادب یه منبع تغذیه داریم بنام شرکتی korad برای کار موبایل منتها ای سی حافظه سوخته بود تعویض کردیم منتها الان روی صفحه نمایش 9هزارم بدون اینکه چیزی وصل باشه نشون میده…این ای سی ایپرام رو چطور میتونم پروگرام کنم که اون ایراد مرتفع بشه
سلام برای تعریف یک متغیر بیتی در eeprom خود میکرو در کدویژن خطای eeprom memory atribute not allowed in this context می دهد ممنون میشم راهنمایی کنید
سلام. امکان تعریف متغیر بیتی در eeprom نیست. از بابت استفاده کنید.
سلام خداقوت
ابتدا تشکر میکنم از مطالب خوبتون
یک سوال هست من یک شمارنده دارم با سه متغیر می خوام سه متغیر همزمان داخل eeprom باشه
امکانش هست؟
بله امکان پذیره اما باید به حجم حافظه EEprom دقت داشته باشید
سلام
باتشکر از توضیحات شامل و کامل شما
تمامی توضیحاتی که در زمینه ها و موضوعات مختلف میکرو گذاشته اید نشان از تسلط و تجربه شما دارد بسیار مهم و کاربردی
خدا خیرت بده
با سلام
ببخشید اگه بخوایم این کدی که تو محیط codevision نوشتید در محیط Atmel Studio بنویسیم چطوری این کار رو انجام بدیم؟؟