فایل hex چیست | خواندن فایل هگز از میکرو | آموزش حرفه‌ای AVR – بخش اول

آموزش حرفه‌ای AVR - بخش اول

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

هشدار: میکروکنترلر مبنا در این آموزش و آموزش‌های آینده، atmega8 است.

فایل hex چیست

بدون هیچ حرف زیاد و گزاف گویی، فایل hex در واقع خروجی کامپایلر است که باید بر روی میکروکنترلر پروگرام شود. فایل hex نتیجه تبدیل کد C به اسمبلی و در نهایت اسمبلی به hex است.

یک نمونه فایل hex
یک نمونه فایل hex که در واقع یک چشمک زن است.

در شکل فوق، محتویات یک فایل hex نشان داده شده است. تمامی این اطلاعات بصورت کدهای ASCII بوده و هر کاراکتر (به غیر از : اول هر خط) شامل اعداد 0 تا 9 و یا حروف A تا F است. در دل این کاراکترها، برنامه میکروکنترلر جای داده شده که در ادامه همین پست، نحوه استخراج مقادیر به همراه اطلاعات مفید دیگری، بیان خواهد شد.

نکته کاربردی: برای اینکه مقدار فضای اشغال شده از حافظه فلش را به دست آورید، اندازه فایل هگز را در عدد 0.355 ضرب کنید. یعنی اگر فایل hex برابر 6500 بایت باشد، فضای اشغالی در میکرو برابر 2307 = 0.355 * 6500 بایت خواهد شد.

خواندن فایل هگز از میکرو

در دوره مقدماتی و بخش ششم در مورد پروگرام کردن Atmega16 با نرم افزار Progisp صحبت کردیم. حال با استفاده از همین نرم افزار می‌خواهیم فایل hex یک میکروکنترلر atmega8 را بخوانیم. میکروکنترلر را به پروگرامر متصل کرده و اطمینان حاصل کنید که ارتباط بر قرار است.

مرحله اول خواندن حافظه فلش

با زدن گزینه Read Flash در تصویر فوق، اگر ارتباط با میکرو بر قرار باشد، پروگرامر شروع به خواندن محتویات فلش می‌کند.

مرحله دوم خواندن حافظه فلش

بعد از مدت زمانی، نوار آبی رنگ تصویر بالا پر شده و این یعنی فلش خوانده شده است. حال به تب Buffer بروید و برنامه روی فلش را مشاهده کنید.

مرحله سوم خواندن حافظه فلش

در تصویر فوق، مقادیر باینری موجود در کادر آبی، همان برنامه میکروکنترلر است (یک چشمک زن ساده). برای سیو کردن برنامه، از گزینه File بر روی Save Flash کلیک کنید.

مرحله چهارم خواندن حافظه فلش

با زدن گزینه Save Flash پنجره زیر باز می‌شود که 2 مورد نیاز است. اولی اسم فایل و دومی پسوند فایل است که باید بر روی hex قرار گیرد.

مرحله پنجم خواندن حافظه فلش و ذخیره فایل hex

در نهایت با زدن Save برنامه بصورت فایل hex ذخیره می‌شود.
نکته: اگر میکروکنترلر از قبل قفل شده باشد، هنگام خواندن حافظه فلش، مقادیری تصادفی و اشتباه توسط پروگرامر خوانده خواهد شد و نمی‌توان از برنامه میکرو استفاده کرد. برای اطلاعات بیشتر مطلب لاک بیت ها و فیوز بیت های atmega8 را مطالعه کنید.

ساختار فایل hex

تا اینجا فهمیدیم که فایل hex چیست. حال اگر یک فایل hex را با نرم افزار notepad باز کنید، با ساختاری همانند شکل زیر رو به رو خواهید شد.

ساختار کلی فایل hex

فایل هگز از ردیف‌هایی به اسم رکورد تشکل شده است. هر رکورد با علامت دو نقطه (:) شروع می‌شود و با علامت‌های r\n\ (که همان دستورهای رفتن به خط بعدی است) به پایان می‌رسد. سپس رکورد بعدی شروع می‌شود و تا پایان به همین ترتیب ادامه دارد. تمامی این کاراکترها به صورت ASCII بوده و هر رکورد ساختاری مانند شکل زیر دارد.

ساختار کلی یک رکورد

هر رکورد از 5 قسمت تشکیل شده است که عبارت‌اند از:

  1. قسمت اول یا قرمز: تعداد بایت‌های داده بوده که در داخل رکورد (قسمت آبی) گنجانده شده است.
  2. قسمت دوم یا نارنجی: آدرس شروع حافظه است. یعنی دیتای استخراجی از رکورد باید در این آدرس نوشته شود.
  3. قسمت سوم یا سبز: نوع رکورد را مشخص می‌کند که می‌تواند 00 یا 01 باشد. اگر 00 باشد، یعنی نوع رکورد به صورت داده و اگر 11 باشد یعنی رکورد پایانی یا آخر فایل hex است. با توجه به کار ما، اکثر رکوردها از نوع داده می‌باشند.
  4. قسمت چهارم یا آبی: داده است و هر دو کاراکتری یک بایت داده را تشکیل می‌دهند.
  5. قسمت پنجم یا صورتی: به این دو کاراکتر یا 1 بایت، Checksum گفته شده و توسط کامپایلر تولید می‌شود. وظیفه Checksum کنترل صحیح بودن کاراکترهای رکورد در برابر نویز پذیری هنگام انتقال فایل است.

در پروگرامرها باید رکوردها از طرف کامپیوتر فرستاده شوند و توسط میکروکنترلر موجود در پروگرامر، صحت آنها بررسی شود. سپس با توجه به دستوراتی که در جلسات آینده خواهیم گفت، دیتای موجود در این رکوردها تک به تک بر روی میکرو پروگرام گردد.

نحوه محاسبه Checksum

فرض کنید یک رکورد به صورت زیر داریم.

0300300002337A1E:

تعداد بایت‌های داده 0x03 است (قرمر رنگ) و آدرس حافظه که بایت‌های این رکورد باید در آنجا ریخته شوند، 0x0030 می‌باشد (نارنجی رنگ). نوع رکورد به صورت دیتا بوده (سبز رنگ) و خود دیتا برابر 3 بایت 02337A (آبی رنگ) می‌باشد. بایت آخر (صورتی رنگ) یعنی 0x1E همان Checksum است که به صورت زیر محاسبه می‌شود.

7A + 33 + 02 + 00 + 30 + 00 + 03 = E2

برای محاسبه Checksum، تک به تک بایت‌ها با یکدیگر جمع شده و حاصل نهایی به صورت مکمل 2 در می‌آید. مکمل 2 یعنی عدد مورد نظر از لحاظ بیتی بر عکس شده و با 1 جمع شود. بنابراین در مقدار بالا، حاصل جمع یعنی 0xE2 پس از معکوس شدن 0 ها و 1 ها به 0x1D تبدیل و در نهایت با 1 جمع می‌شود.

E2 => 1D + 1 => 1E

نکته: اگر پس از جمع مقادیر یک رکورد و حساب کردن مکمل 2 آن، Checksum محاسبه شده با Checksum داخل رکورد یکی نباشد، بنابراین رکورد فرستاده شده دچار نویز یا اغتشاش در مسیر شده است.

به عنوان یک مطلب ایده‌آل، پیشنهاد می‌شود این صفحه در مورد ساختار فایل hex را مطالعه کنید.

سخن آخر

در پروگرامرها با فایل hex سر و کار زیاد است. لذا از آنجا که در 2 مطلب آینده به مفاهیم خود برنامه ریزی یا self programming خواهیم پرداخت، دانستن ساختار فایل hex ضروریست. در انتها اگر سوال یا مشکلی دارید، کامنت کنید؛ خیلی زود پاسخگو خواهیم بود.

محمد نصر

محمد نصر

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

25 پاسخ

  1. سلام اقای اقای نصر.در تغیر برنامه کالر ای به مشگل خوردم.امکان داره کمکم کنید؟

  2. سلام لطف راهنمایی بفرمایید ای سی atmega8 قفل شده را چطور باز کنیم
    (جهت خواندن پروگرام داخلی ) ممنون

  3. سلام
    از معدود سایتهایی هستین که خیلی روان و راحت و ساده بیان کردین. آموزش صفر مطلق تا صد واقعی AVR رو دارین؟

    1. سلام. آموزش های 0 تا 100 ویدئویی در آینده بر روی سایت قرار میگیره.

  4. سلام آقای نصر چطور میتونم با شما تماس بگیرم لطفا شماره واتس اپ بدید ممنونم

  5. با تقدیم سلام مطلب بسیار بسیار عالی بیان شد ولذت بردم.فوق العاده عالی الهی خیر ببینید.

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

    1. سلام. برنامه قابلیت قفل ندارد. اگه فایل هگز رو استخراج کنید و روی یدونه میکروکنترلر دیگه پروگرام کنید، حافظه میکروکنترلر رو باید با لاک بیت قفل کنید نه برنامه رو

  7. سلام من ی فایل هگز که از یک برنامه تولید شده رو در اختیار دارم و میخوام روی atmega 8 پروگرامش کنم و فایل های کدویژن و برنامه اصلی رو ندارم ، چطور میشه فایل هگز رو پروگرام کرد روی این ایسی؟

  8. سلام
    ممنون از توضیحات عالی شما

    بنده در مورد میکروکنترلر و سایر موارد اطلاعاتی ندارم.
    ولی خیلی خیلی خیلی به دنبال یاد گرفتن ساختار هگز هستم.
    در واقع قصد دارم آنچه که توسط نرم افزارهای هگزادیتور ظاهر میشه -مثلا وقتی یک برنامه با یک هگزادیتور باز میشه- را درک کنم. یعنی آنچه که پس از باز شدن یک فایل توسط هگزادیتور ظاهر میشه را درک کنم.
    فکر کنم فقط شما بتونید این سوال رو جواب بدین.

  9. سلام ممنون از مطلب خوب شما سه روزه دنبال ریدکردن از atmega32هستم هیج چیزی پیدا نکرد بسیار مختصر و مفید

  10. بهترین مطلب در بین تمام سایت ها بود کاش زودتر پیدا کرده بودم

  11. سلام آقای مهندس وقت بخیر
    ببخشید ما چند تا فایل هگز داریم می خوایم این فایل ها تبدیب بشه به فایل اصلی اش!
    سوالی که دارم اینه که ایا این امکان وجود داره ؟
    یعنی یه جورایی تبدیل بشه بعه فایل مادر که نهایتا تبدیل شده به فایل هگز و رسیده دست ما
    من اون فایل اصلی هاش رو لازم دارم ….
    ممنون میشم کمک کنید
    منتظر پاسخ شما هستم

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

  12. با سلام و احترام
    با داشتن فایل هگز یک برنامه میتوان نوع میکرو کنترلر آن راپیدا کرد؟ و روی آن میکرو برنامه ریزی کرد؟

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

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