تحلیل رفتار Bascom هنگام کار با EEPROM

مقدمه:

بدون شک کامپایلر بسکام برای دوستداران زبان بیسیک محبوبیت بسیار زیادی داشته و برای نوشتن سریع کدها و برنامه‌های مختلف برای میکروکنترلر AVR فارغ از درگیر شدن با جزئیات رجیسترها بهترین گزینه به شمار می‌رود (البته نسخه قانونی آن). با این حال داشتن دانش قبلی در خصوص رجیسترها و نحوه عملکرد میکروکنترلر AVR از ضروریات است، لیکن Bascom زمان را می‌خرد؛ که مهمترین دارایی ماست.

تنها مشکل بسکام معماری بسته آن است که مشخص نیست دستورهای ساده را چگونه به کد تبدیل می‌کند. به طور مثال اخیراً برای یک پروژه نیاز به کار با مقدار زیادی دیتای EEPROM  داشتیم، بسکام کار را براحتی با تعریف متغیر از نوع ERAM ساده می‌کند اما نکته مهم این بود که آیا طبق گفته برخی مقالات آموزشی باید بعد از دستورات نوشتن و خواندن بصورت دستی از تاخیر waitms 10 استفاده کنیم؟ آیا بسکام مراقب زمان لازم برای نوشتن در EEPRM هست یا نه؟ به طور مثال اگر نیاز به نوشتن 512 بایت EEPROM باشد و هرکدام نیاز به 10 میلی ثانیه تاخیر داشته باشد باید حدود 5 ثانیه برنامه را منتظر بگذاریم؟

 

مهندسی معکوس (تبدیل HEX به ASM با  AVR Disassembler)

در چنین شرایطی تنها راه ممکن اینست که یک برنامه خیلی ساده در حد نوشتن یک عدد در متغیر Eram نوشته و آنرا به Hex تبدیل کنیم. سپس کد Hex را به کمک برنامه DISAVR که یک برنامه کوچک خط فرمان برای تبدیل فایل Hex به ASM است به کد اسمبلی تبدیل و آن را تحلیل کنیم. بدین منظور کد زیر را نوشتیم:

سپس کد hex را با نام ep.hex تولید کرده و به کمک برنامه دیس اسمبلر که می توانید آن را از آدرس زیر دریافت کنید:

https://www.avrfreaks.net/forum/disavr-win32-101-beta-released

یا از این لینک بگیرید:

disavr

و با تایپ دستور

disavr ep.hex > ep.asm

کد اسمبلی زیر را در خروجی تحویل گرفتیم:

 

همانطوریکه در برنامه اسمبلی در خط

avr0042: sbic EECR, 1 ; 0042 99E1

مشاهده می کنید بیت شماره یک یعنی بیت EEWE از رجیستر EECR بررسی شده و فقط در صورت 0 بودن دستورات بعدی را که عملیات خواندن یا نوشتن در EEPROM است انجام  می‌دهد. بنابراین کد تولید شده توسط BASCOM در خصوص کار با متغیرهای EEPROM کاملا اصولی بوده و هیچ نیازی به استفاده از توابع ایجاد تاخیر مثل waitms 10 بعد از دستورات مقداردهی متغیرهای نوع EEPROM نمی‌باشد.

 

نتیجه گیری

در این مقاله آموختیم که چگونه خروجی بسته بسکام را به کد اسمبلی تبدیل کرده و آن را تحلیل کنیم. همچنین یادگرفتیم که براحتی و با اطمینان خاطر از متغیرهای Eram در برنامه استفاده کنیم. البته همیشه سعی کنید در ابتدای برنامه یک کپی از متغیرهای Eram در SRAM ذخیره کنید و برای جلوگیری از سربار اضافه و نیز خراب شدن EEPROM در متن برنامه با رم کار کنید. همچنین هرگز در حلقه‌های تکرار به دفعات در متغیرهای Eram ننویسید تا EEPROM را خراب نکنید چرا که EEPROM محدودیت تعداد دفعات نوشتن دارد.

بازدیدها: 290

6 دیدگاه دربارهٔ «تحلیل رفتار Bascom هنگام کار با EEPROM»

  1. سلام مهندس ممنون خیلی جالب بود
    من بخاطر بی اعتمادی به ایپرام میکرو ای وی ار متاسفانه مجبورم از ایپرام خارجی استفاده کنم چون ایپرام داخلی میکرو بعد از مدتی باعث فرار دیتا ها میشه روی فیوز بیت ها هم کار کردم ولی راه حل مناسبی پیدا نکردم

    پاسخ
    • سلام، خواهش می‌کنم. ما از EEPROM داخلی در تمام محصولات تجاریمون (Novinkit.com) استفاده می‌کنیم و تابحال مشکلی با پاک شدن دیتا نداشتیم. توجه داشته باشید که EEPROM داخلی به تغذیه حساس هست، بنابراین حتما فیوزبیت BODEN فعال و BODLEVEL روی ولتاژی مثل 2.7 تنظیم بشه که در صورت کم شدن ولتاژ، میکرو خاموش بشه. در غیر این صورت اگر موقع خاموش شدن میکرو در ولتاژهای پایین (مثلا هنگام تخلیه خازن تغذیه) میکرو در حال کار با EEPROM باشه ممکنه دیتا آسیب ببینه. همچنین در ورودی تغذیه میکرو حتما فیلتر پایین‌گذر شامل سلف 10 میکروهانری و خازن 100 نانو (مشابه فیلتر ADC) استفاده بشه تا نویزهای خارجی از راه تغذیه وارد میکرو نشن.

  2. بدی کار بسکام اینجاست که موقع رایت ایپیرام وقفه سراسری غیرفعال میشه
    و عملا زیر برنامه های دارای وقفه که زیر 5 میلی ثانیه رفرش داشته باشند نمیشه استفاده کرد چون عملا اجرا نمیشن و از دست میرن
    راهکاری برای این مشکل ارایه کنید

    پاسخ
    • سلام بیت EERIE در رجیستر EECR مسئول وقفه آمادگی EEPROM هست، شاید بسکام از وقفه آمادگی EEPROM استفاده می‌کند و آن را فعال می‎‌کند و به همین خاطر وقفه قبلی غیر فعال می‎‌شود. اگر بدون وقفه هم بتوان با EEPROM کار کرد می‌توانید برای نوشتن در EEPROM یک تابع کوچک اسمبلی ایجاد کنید و آن را فراخوانی کنید و با روش pooling در یک حلقه، وضعیت EEWE را چک کنید و سپس در EEPROM بنویسید و در این حلقه وقفه قبلی می‌تواند به کار خودش ادامه دهد. نمونه کد اسمبلی در دیتاشیت هر نوع میکروکنترلر AVR زیر بخش مموری و EEPROM موجود است.

  3. با سلام
    لطفا در مورد برنامه disavr توضيح بفرماييد.
    دانلودش كردم . فايل EXE رو نميشناسه در كامپيوتر من لطفا راهنمايي بفرماييد سپاس

    پاسخ
    • سلام احتمالا روی فایل exe کلیک کردید. اینکار اشتباهه
      باید پوشه دانلودی رو داخل root مثلا درایو C قرار بدید بعدش از منوی استارت CMD رو سرچ و باز کنید (خط فرمان) و دستور
      disavr ep.hex > ep.asm
      رو بزنید با فرض اینکه اسم فایل شما ep باشه

      راه دوم ایجاد یک فایل متنی با پسوند run.bat در کنار فایل exe و تایپ دستور disavr ep.hex > ep.asm داخل اون هست.
      بعدش فایل هگز رو به ep.hex تغییر نام داده و کنار exe و run.bat قرار بدید و در نهایت روی فایل bat کلیک کنید تا دستور داخلش اجرا بشه و فایل ep.asm در همون جا ایجاد بشه.

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