فایل 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 سال سابقه کار در حوزه الکترونیک و همینطور برنامه‌نویسی میکروکنترلر به صورت پیشرفته دارم. سعی میکنم هر روز چیزهای جدید یاد بگیرم و خوشحال میشم با شما به اشتراک بگذارم.

4 پاسخ

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

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