آموزش مقدماتی AVR | جلسه هفتم

آموزش مقدماتی AVR | جلسه هفتم

آموزش میکروکنترلر AVR

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

حافظه EEPROM چیست؟

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

آموزش مقدماتی AVR

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

حافظه EEPROM در ATmega16

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

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

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

#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 رنگ آن صورتی می‌شود.

#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 تفاوت کاملا مشهود با برنامه قبل دارد:

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

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

آموزش مقدماتی AVR
مرحله دوم شبیه‌سازی و اجرای دوم

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

آموزش مقدماتی AVR

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

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

آموزش مقدماتی AVR

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

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

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

هیچ نظری وجود ندارد

پاسخی بگذارید

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

شروع به تایپ کنید و Enter را برای جستجو وارد کنید

سبد خرید

هیچ محصولی در سبد خرید نیست.