آموزش مقدماتی AVR – بخش هفتم | حافظه EEPROM

حافظه EEPROM در ATmega16

حتما تا به حال زیاد با اصطلاحات ROM (رام)، EPROM و البته EEPROM روبه‌رو شده‌اید. و احتمالا برایتان سوال شده که مفهوم این‌ها چیست و تفاوت اصلی آن‌ها چه چیزی است؟ در بخش هفتم از آموزش‌های مقدماتی AVR قصد داریم که به بررسی همین موضوع بپردازیم. و سعی کرده‌ایم که به صورت کاربردی و عملی در مورد حافظه EEPROM صحبت کنیم. با ما همراه باشید.

حافظه EEPROM چیست؟

حافظه EEPROM مخفف عبارت Electrically Erasable Programmable Read Only Memory و به معنای حافظه فقط خواندنی قابل پاک شدن با برق می‌باشد. حافظه‌های ROM معمولی، اولین نسل از حافظه‌های فقط خواندنی بودند که اطلاعات داخل آن‌ها با قطع برق از بین نمی‌رفت و تنها یکبار پروگرام می‌شدند و دیگر نمی‌توانستیم مقدار آن را تغییر دهیم. نسل بعد از آن EPROM بود که علاوه بر خصوصیات یک رام (ROM) می‌توانستیم توسط اشعه‌ی فرا بنفش مقادیر آن را پاک کنیم. و در آخر حافظه EEPROM که علاوه بر نگه‌داری مقادیر در صورت قطع منبع تغذیه، می‌توان مقادیر آن را توسط الکتریسته پاک کرد و دوباره پروگرام نمود.

آیسی EEPROM بصورت جداگانه

شکل فوق یک آی‌سی EEPROM است که می‌توان به صورت جداگانه از آن در مدارات استفاده کرد. باید گفت که این نمونه آیسی‌ها با توجه به مدلشان ظرفیت به مراتب بیشتری از EEPROM داخلی میکروکنترلر دارند و بیشتر در جاهایی استفاده می‌شوند که دیتای حجیمی قرار است ذخیره شود.

حافظه EEPROM در ATmega16

اکثر میکروکنترلرهای AVR به صورت داخلی، یک حافظه EEPROM دارند که مقدارشان در هر مدل متفاوت است. در ATmega16 مقدار 512 بایت برای این منظور تعبیه شده است. همانطور که در بالا گفتیم، اگر مقداری در این حافظه ذخیره شود با خاموش شدن میکروکنترلر این مقادیر پاک نشده و می‌توان از آنها نگه‌داری کرد.

برنامه‌ای ساده جهت استفاده از EEPROM

به عنوان مثال برنامه‌ای می‌نویسیم که مقادیر 0 تا 255 را به صورت دودویی بر روی پورت B میکروکنترلر به ترتیب نمایش دهد.

فرض کنید میکرو تا عدد 5 را شمارش کرده باشد و ناگهان منبع تغذیه قطع شود. اگر میکرو دوباره روشن شود، نتیجه مشخص است: شمارش از 0 شروع خواهد شد. حال اگر بخواهیم شمارش از همان عدد قبل شروع شود باید مقدار i درون حافظه EEPROM ذخیره شود. تنها کافی است هنگام تعریف متغیر i کلمه eeprom را به آن اضافه کنیم. با نوشتن کلمه eeprom رنگ آن صورتی می‌شود.

برنامه بالا 4 تفاوت کاملا مشهود با برنامه قبل دارد:

  1. تعریف متغیر با کلمه eeprom آغاز شده است. در این صورت چون i از نوع int است، 2 بایت از فضای eeprom اشغال می‌شود.
  2. در حالت اولیه تمام بیت‌های حافظه eeprom برابر 1 است. این یعنی با تعریف i مقدار پیش‌فرض آن 0xFFFF بوده و لازم است در ابتدای main توسط یک if چک کنیم که اگر مقدار i برابر 0xFFFF بود، آن را برابر 0 کند. این if فقط بار اول که میکرو روشن می‌‎شود اجرا خواهد شد (چرا؟ جوابش را خودتان بدهید?).
  3. چون میخواهیم در دفعات بعدی که میکرو روشن می‌شود، از همان مقدار قبل شمارش کنیم، پس نباید در داخل for قسمت مقداردهی اولیه را بنویسیم. به همین خاطر فقط یک سمی کولن می‌گذاریم.
  4. اگر for تمام شود، چون مقدار اولیه وجود ندارد، در انتهای کار مقدار i را صفر می‌کنیم.
مرحله اول شبیه‌سازی و اجرای اول ?

در فایل تصویری زیر مشاهده می‌کنید که پس از شمارش تا عدد 5، یک‌باره شبیه‌ساز را خاموش میکنیم.

اجرای اول برنامه EEPROM در پروتئوس

مرحله دوم شبیه‌سازی و اجرای دوم ?

فایل تصویری زیر اجرای دوباره شبیه‌سازی را نشان می‌دهد و همانطور که می‌بینید شمارش از عدد 5 آغاز می‌گردد.

اجرای دوم برنامه EEPROM در پروتئوس

پروگرام کردن عملی EEPROM

اگر در برنامه هنگام تعریف یک متغیر در eeprom، مقدار اولیه‌ای به آن بدهید (مثلا 66)، به غیر از فایل hex. فایل دیگری با پسوند eep. باید بر روی میکروکنترلر پروگرام شود. این فایل در همان مسیر Debug/Exe قرار می‌گیرد. شکل زیر مراحل انجام کار را نشان می‌دهد.

پروگرام کردن عملی EEPROM

همانطور که می‌بینید، با زدن Load Flash و Load Eprom به ترتیب فایل‌های hex. و epp. را وارد می‌کنیم. همچنین به غیر از موارد قبل (آموزش قسمت ششم AVR) باید دو مورد Program EEPROM و Verify EEPROM هم تیک زده شود. در نهایت با زدن Auto تمام این پنج مورد به ترتیب انجام می‌شوند.

نکته: یکی از فیوزبیت‌های مرتبط با EEPROM فیوزبیت EESAVE است. اگر این فیوزبیت پروگرام شود یعنی برابر 0 گردد، با Erase کردن میکروکنترلر، حافظه EEPROM پاک نمی‌شود و اگر پروگرام نشود (یعنی 1 بودن)، هر بار که میکرو Erase می‌شود، مقادیر EEPROM هم پاک خواهد شد.

خب همراهان عزیز این بخش هم تمام شد و سعی کردیم هر نکته‌ای در مورد کار با حافظه EEPROM بود گفته شود. اگر سؤال یا مشکلی دارید زیر همین پست کامنت خودتون رو برای ما ارسال کنید. برای مشاهده آموزش بعدی مبحث وقفه ها کلیک نمایید.

محمد نصر

محمد نصر

محمد نصر هستم. 9 سال سابقه کار در حوزه الکترونیک و همینطور برنامه‌نویسی میکروکنترلر به صورت پیشرفته دارم. سعی میکنم هر روز چیزهای جدید یاد بگیرم و خوشحال میشم با شما به اشتراک بگذارم.

24 پاسخ

    1. مچکر. سعی خودمون رو میکنیم که مطالب کامل و شفاق باشن.

  1. سلام
    یک سوال در زمینه eeprom دارم
    وقتی از تابعهای c استفاده می کنیم (مثلا strlen)، این توابع متغییر eeprom رو نمی پذیزند. چگونه باید متغییر eeprom رو به ram انتقال بدیم؟

    1. سلام. eeprom مثل حافظه رم سرعت بالایی نداره. لذا شما باید یک متغیر از همان نوع در حافظه رم ایجاد کنید و مقدار متغیر eeprom را داخل متغییر رم ریخته و روی اون عملیلات انجام بدید. سپس پس از تموم شدن کارتون، دوباره مقدار رو از رم به eeprom منتقل کنید. اگر آرایه ای در eeprom با طول 10 ایجاد کرده‌اید، در رم هم باید دقیقا همان آرایه با طول 10 ایجاد کنید.
      نتیجه‌گیری: مستقیما عملیات رو روی مقادیر eeprom انجام ندید و از رم استفاده کنید.

  2. بسیار عالی بود مهندس . به امید خدا همیشه پیروز و تندرست باشید.

    1. خواهش میکنم. بقیه آموزش ها رو هم دنبال کنید. به زودی قسمت حرفه‌ای AVR هم روی سایت قرار میگیره.

  3. واقعا عالیه دمتون گرم انشالله همیشه موفق و موید باشید.

    1. بسیار عالی بی نظیر بود این آموزش در سطح ایران، خسته نباشید واقعا ، امیدوارم بیشتر در مورد eeprom مطلب بزارید.❤❤❤❤

  4. سلام ممنون ولی این آموزش مال کد ویژن هست لطفا آموزش های اتمل استودیو رو هم بذارین

    1. بله حتما. آموزش کار با EEPROM در Atmel Studio در آینده قراره میگیره. ممنون بابت بازخورد خوبتون

  5. سلام عرض ادب یه منبع تغذیه داریم بنام شرکتی korad برای کار موبایل منتها ای سی حافظه سوخته بود تعویض کردیم منتها الان روی صفحه نمایش 9هزارم بدون اینکه چیزی وصل باشه نشون میده…این ای سی ایپرام رو چطور میتونم پروگرام کنم که اون ایراد مرتفع بشه

  6. سلام برای تعریف یک متغیر بیتی در eeprom خود میکرو در کدویژن خطای eeprom memory atribute not allowed in this context می دهد ممنون میشم راهنمایی کنید

    1. سلام. امکان تعریف متغیر بیتی در eeprom نیست. از بابت استفاده کنید.

  7. سلام خداقوت
    ابتدا تشکر میکنم از مطالب خوبتون
    یک سوال هست من یک شمارنده دارم با سه متغیر می خوام سه متغیر همزمان داخل eeprom باشه
    امکانش هست؟

  8. سلام
    باتشکر از توضیحات شامل و کامل شما
    تمامی توضیحاتی که در زمینه ها و موضوعات مختلف میکرو گذاشته اید نشان از تسلط و تجربه شما دارد بسیار مهم و کاربردی
    خدا خیرت بده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  مزایای عضویت در رزدینو :

✔️ دسترسی به فایل های دانلودی

✔️ دریافت پشتیبانی برای محصولات

✔️ مشاهده تمام مطالب کاملا رایگان

✔️ دسترسی آسان به آپدیت محصولات

✔️ بهره مندی از تخفیف های ویژه کاربران