(آموزش WinAVR جلسه اول)
مقدمه:
در سری مقالات آموزش AVR از کامپایلر BASCOM شروع کردیم و پس از چند جلسه آموزش بیسیک و اسمبلی، اسمبلر و کامپایلر AVR Studio را معرفی نمودیم. در نهایت با کامپایلر CodeVision به عنوان کامپایلری استاندارد و البته تجاری برای برنامه نویسی میکرو به زبان C آشنا شدیم. در ادامه این سلسله مقالات به معرفی کامپایلر GNU و رایگان WinAVR می پردازیم که زبان آن C بوده و از هسته GCC استفاده می نماید. این کامپایلر بر روی سیستم عامل های ویندوز و لینوکس قابل اجرا بوده و به همین دلیل سورس ها و پروژه های رایگان زیادی در رابطه با آن وجود دارد. یکی از کتابخانه های قدرتمند موجود avrlib می باشد که حاوی هدرفایل های ارتباط با ادوات جانبی متداول از قبیل LCD و MMC و… است. در این 10 مقاله پایانی به طور مفصل با این کامپایلر و تا حدودی زبان C آشنا می شویم.
دانلود، نصب و راه اندازی WinAVR
برای دانلود WinAVR می توانید به آدرس صفحه خانگی این کامپایلر که در زیر به آن اشاره شده است مراجعه و آن را بارگیری نمایید:http://winavr.sourceforge.net
همچنین می توانید با سرچ عبارت WinAVR در اینترنت آدرس جدید دانلود آن را پیدا کنید. پس از دانلود و نصب برنامه به منوی استارت مراجعه کرده و بر روی All Programs کلیک کنید. مطابق شکل زیر پوشه برنامه مذکور حاوی چندین فایل مختلف می باشد. نظر به اینکه وین ای وی آر یک کامپایلر خط فرمان می باشد در این نسخه تحت ویندوز، ادیتور رایگان Programmers Notepad برای محیط کد نویسی آن پیکره بندی شده است. با کلیک بر روی آن تصویر صفحه بعد ظاهر می شود.
کدنویسی در این محیط انجام می شود. البته بهتر است از نوار ابزار بالا از قسمت Plain Text بر روی گزینه C / C++ کلیک شود تا کدهای نوشته شده حالت رنگی و فرمت بندی شده به خود بگیرند. این ادیتور برای مشاهده سورسهای زبان های مختلف گزینه خوبی به شمار می رود و یک ویرایشگر همه منظوره می باشد.
برنامه بعدی که در پوشه WinAVR قرار گرفته است MFile نام دارد که فایل پیکره بندی کامپایلر را تولید می کند. همانطوریکه می دانید برنامه های خط فرمان مانند اسمبلر اتمل برای پیکر بندی، پارامترهایی را به صورت کاراکتر و عدد دریافت می کنند. مثلاً در اسمبلر اتمل بایستی کاراکترهای f و I را که هر یک تنظیم خاصی برای اسمبلر هستند به صورت مقابل وارد کنیم: avrasm -fI Prog1.asm
کامپایلر GCC نیز از این قاعده مستثنی نبوده و البته پارامترهای آن بسیار زیاد می باشد؛ پارامترهایی از قبیل نوع میکرو، نوع پروگرمر، فرکانس کاری، نام فایل سورس اصلی، نام هدر فایلها و … . برنامه MFile به ما کمک می کند تا با استفاده از تنظیمات گرافیکی فایلی به نام Makefile حاوی تمام تنظیمات لازم برای کامپایلر تولید کنیم. پنجره این برنامه مطابق با شکل صفحه بعد می باشد.
در این برنامه پس از تعیین نوع میکرو و نام فایل اصلی که به صورت پیش فرض main می باشد، در صورتی که برنامه ما شامل هیچ فایل و کتابخانه اضافه در اطراف سورس نباشد از منوی فایل بر روی Save As… کلیک کرده و فایل ایجاد شده را بدون تغییر نام در پوشه ای که قصد نوشتن برنامه را داریم ذخیره می نماییم. فایل C ایجاد شده توسط Programmers Notepad نیز بایستی در همان پوشه ذخیره گردد.
پس از آشنایی با محیط این کامپایلر رایگان نوبت به ایجاد یک پروژه ساده می رسد تا با نحوه عملکرد این محیط آشنا شویم و به آموزش ساختار زبان C بپردازیم. در قسمت بعد در ابتدا یک برنامه ساده چشمکزن با LED و میکروی ATmega8 می نویسیم و به تدریج با مفاهیم فایل های کتابخانه ای و نوشتن Header فایلها و توابع آشنا می شویم. لازم به ذکر است برای پروگرم کردن میکرو از Bascom استفاده می کنیم و برای این منظور کامپایلر بسکام را باز کرده، روی File > New کلیک می کنیم تا یک فایل خالی باز شود، سپس F4 را فشار می دهیم تا اجازه ورود به محیط پروگرمر STK را کسب کنیم. مطابق شکل صفحه بعد روی شکل پوشه Open واقع در نوار ابزار پنجره پروگرمر کلیک می کنیم تا پنجره انتخاب فایل هگز ظاهر شود. نظر به اینکه این پنجره به صورت پیش فرض به دنبال فایل باینری میگردد و فایل های با پسوند Hex را نشان نمی دهد بایستی از قسمت پایین Files of type گزینه Intel HEX را انتخاب نماییم. با استفاده از این روش به راحتی می توانیم توسط کامپایلر بسکام هر نوع فایل Hex را در میکرو پروگرم نماییم. دلیل استفاده از این روش عدم عملکرد مناسب پروگرمر داخلی WinAVR می باشد که معمولاً قادر به شناسایی پورت LPT نیست.
پس از انتخاب فایل هگز بایستی از منوی Chip یک بار بر رویIdentify کلیک کنیم تا دکمه های این برنامه فعال شوند.
تا اینجا تمام کارهای لازم برای کدنویسی و پروگرم کردن میکرو را انجام داده و زمینه را برای شروع پروژه آماده کرده ایم. در بخش بعدی کدنویسی را آغاز می کنیم.
برنامه نویسی اولین پروژه با WinAVR:
اولین پروژه ما یک چشمکزن ساده با ATmega8 می باشد که دیود LED قرار گرفته بر روی پورت B.0 را با فرکانس یک هرتز روشن و خاموش می نماید. در این پروژه از اسیلاتور داخلی 1 مگاهرتز میکرو (گزینه پیش فرض تنظیمات کارخانه) استفاده شده است. برای شروع کد نویسی در ابتدا پوشه ای به نام LED در درایو C ایجاد می کنیم. سپس از منوی استارت بر روی All Programs و WinAVR کلیک کرده، سپس برنامه MFile را بر می گزینیم. مطابق با شکل پایین ابتدا نوع میکرو را انتخاب می کنیم. سپس همانند شکل بعدی از منوی Makefile بر روی آخرین گزینه یعنی Enable Editing of Makefile کلیک می کنیم تا قادر به ویرایش محتوای فایل شویم. در مرحله بعد مانند شکل سوم این صفحه مقدار F_CPU را از 8000000 به 1000000 تغییر می دهیم تا فرکانس کاری CPU را تنظیم کنیم. (همانند دستور Crystal = 1000000 در بیسکام).
پس از انجام تنظیمات از منوی File > Save As… فایل ایجاد شده را بدون تغییر نام در پوشه LED واقع در درایو C ذخیره می کنیم و پنجره برنامه را می بندیم. سپس برنامه Programmers Notepad را باز کرده و از نوار ابزار بالا C / C++ را انتخاب کرده و کد زیر را در محیط مذکور می نویسیم و در نهایت آن را با نام main.c در پوشه LED ذخیره می کنیم.
برای کامپایل برنامه از منوی Tools بر روی Make All و یا Make Clean کلیک کنید. پس از انجام عملیات در صورتی که مرتکب خطایی نشده باشید در قسمت پایین پنجره عبارت Process Exit Code: 0 نمایش داده می شود. در این حالت اگر به پوشه LED مراجعه کنیم فایل Hex را مشاهده خواهیم کرد که می توانیم آن را در میکرو بارگزاری نماییم.
در این قسمت نوبت به پروگرم کردن و تست پروژه به صورت فیزیکی می رسد. پس از پروگرم کردن میکرو مداری مطابق با شکل زیر بر روی برد بورد بسته و پس از وصل تغذیه مشاهده می کنیم که دیود نورانی LED به تناوب چشمک می زند:
تحلیل برنامه چشمکزن به زبان C
پس از تست پروژه یاد شده نوبت به تحلیل برنامه و چگونگی ساختار زبان C می رسد. لازمه برنامه نویسی با Win AVR آشنایی مقدماتی با زبان C می باشد. همانطوریکه می دانید در زبان C از یک سری ساختارهای خاصی برای برنامه نویسی استفاده می شود؛ به طور مثال برای ایجاد حلقه از دستور While و برای انتساب از دستور = بهره گرفته می شود. واقعیت اینست که برنامه نویسان اسمبلی در محیط C احساس راحتی بیشتری می کنند و فرصت کمتری را برای نوشتن کد های تکراری صرف می کنند. به طور مثال در زبان اسمبلی برای ایجاد تاخیر بایستی ده ها خط کد نوشته و به تناوب چندین رجیستر را پر و خالی کنیم تا مدتی تاخیر ایجاد شود. ولی در زبان C با استفاده از تابع _delay_ms() به راحتی می توانیم مقدار زمان تاخیر خود را بدون توجه به تغییر فرکانس CPU ایجاد کنیم.
توابعی که در بالا نام برده شد توسط همین کامپایلر و ادیتور تهیه شده اند و در آینده با نحوه ایجاد آنها آشنا خواهیم شد. توابع می توانند در داخل سورس پروژه قرار بگیرند و یا در فایلهای دیگری به نام هدر فایل. ما در این پروژه از دو هدر فایل استفاده کرده ایم. هدر فایل اول به نام io.h شامل نام پورت ها می باشد. با include کردن این هدر فایل می توانیم از نام های PORTB و DDRB و… به جای آدرس پورت ها استفاده نماییم. Header file بعدی بنام delay.h شامل دستوراتی برای ایجاد تاخیر در برنامه می باشد که هر دو هدرفایل فوق به عنوان بخشی از کتابخانه استاندارد WinAVR محسوب می شوند.
نکته دیگر در برنامه های C اینست که هر برنامه از توابع تشکیل شده است. ما می توانیم بخش های مختلف برنامه را به صورت تابع به دنبال هم بنویسیم و با فراخوانی هر یک عمل مورد نظر را انجام دهیم. مثلاً در این برنامه با فراخوانی _delay_ms(500) تابع ایجاد تاخیر را با مقدار آرگومان 500 فراخوانی کرده ایم. برای فراخوانی توابع بایستی نام تابع را بنویسیم. تنها تابعی که پس از شروع برنامه به طور خودکار اجرا می گردد تابع main نام دارد. به همین روی ما موظفیم تابعی با همین نام نوشته و کد خود را داخل آن قرار دهیم. این تابع نیازی به فراخوانی نداشته و حتی بهتر است که هرگز آنرا به صورت دستی فراخوانی نکنیم. این تابع در صورتی که با موفقیت اجرا شود (که البته همیشه هم همینطور است) بایستی مقدار 0 را بر گرداند. به همین روی بایستی در انتهای این تابع عبارت return 0; را بنویسیم. این تابع در شرایط عادی هیچ مقداری را به عنوان آرگومان ورودی نمی گیرد پس از جلوی آن عبارت void به معنای هیچ را می نویسیم. نکته دیگر در خصوص حیطه عمکرد توابع و ساختارها می باشد. محدوده قلمرو هر تابع با } شروع و به } ختم می شود. نکته مهم آخر استفاده از ; در پایان هر دستور می باشد. کامپایلر C به گونه ای طراحی شده که دستور ها را با علامت ; از یکدیگر جدا می کند. در کامپایلر بیسیک دستورها با کاراکتر انتهای خط از یکدیگر جدا می شوند و به همین دلیل در هنگام کامپایل سورسهای بیسیک که توسط سیستم های مختلف از قبیل مک و لینوکس تولید شده باشند مشکل ایجاد می شود چرا که ویندوز از دو کاراکتر CR-LF برای انتهای خط استفاده می کند ولی در سیستم های دیگر از یکی از این کاراکترها استفاده می شود. زبان C به دلیل اینکه یک زبان بین المللی می باشد و سورسهای آن ممکن است توسط هر سیستمی ایجاد شود از کاراکتر آشکار ; برای جداسازی دستورات از یکدیگر استفاده می کند که بایستی مدنظر قرار داده شود.
یکی از ساختارهای به کار برده شده در این برنامه حلقه شرطی While می باشد. این حلقه تا زمانی که دستور مقابل آن درست باشد و مقدار 1 را برگرداند دستورات محدوده قلمرو خود را تکرار می کند. نظر به اینکه ما در این برنامه به یک حلقه بینهایت احتیاج داریم در جلوی این دستور عدد 1 را می نویسیم تا این حلقه برای همیشه اجرا گردد.
سایر دستورات نیز دستورات انتساب هستند که پین شماره صفر پورت B را روشن رو خاموش می کنند و نیز پین مربوطه را در حالت خرو جی قرار می دهند.
در این قسمت با ساختارهای توابع آشنا شدیم. در بخش بعدی تصمیم داریم کل برنامه ای را که نوشته ایم به صورت یک کتابخانه و هدر فایل عمومی تبدیل کرده و به نام blink.h (چشمکزن) به صورت عمومی منتشر کنیم. در بخش بعدی با نحوه نوشتن توابع به صورت Header file و نحوه استفاده از آنها آشنا خواهیم شد.
طریقه نوشتن Header file
برای نوشتن هدر فایل یک فایل خالی به صورت C / C++ باز می کنیم:File > New > C / C++
سپس دستورات زیر را در آن می نویسیم تا قالب اصلی هدر فایل ایجاد شود. این دستورات به ما کمک می کند که کتابخانه مربوطه بیش از یک بار تعریف نشود. در پروژه های بزرگ که هرکدام از بخش ها توسط یک برنامه نویس مجزا نوشته می شود ممکن است چندین نفر به طور همزمان یک هدر فایل را include کنند که در این صورت خطاهایی در موقع کامپایل اتفاق می افتد. دستورات زیر در ابتدا چک می کنند که اگر فایل جاری تعریف نشده است آن را تعریف کنند و در غیر این صورت با فایل مربوطه به عنوان یک فایل خالی رفتار شود.
پس از نوشتن دستورات مقابل، فایل مربوطه را در پوشه LED به نام blink.h ذخیره می کنیم. ضمناً عبارت نوشته شده در کد مربوطه بایستی همان نام فایل ولی با حروف بزرگ باشد و به جای نقطه از آندرلاین استفاده شود: BLINK_H
پس از نوشتن قالب هدر فایل، کد برنامه مورد نظر را در داخل این قالب می نویسیم. همانطوریکه می بینید تابعی به نام LED_blink نوشته ایم که هیچ مقداری را نمی گیرد و هیچ مقداری را نیز بر نمی گرداند (پس نیازی به نوشتن return 0 در انتهای آن نیست)
در قسمت بعدی به برنامه main باز می گردیم و خط “include “blink.h# را در ابتدای آن اضافه می کنیم. می بینیم که برنامه ما به شکل بسیار ساده و قابل فهم زیر تبدیل شده است و تنها لازم است که تابع ()LED_blink را فراخوانی کنیم تا برنامه اجرا شود. به همین ترتیب می توانیم کتابخانه های مختلفی را برای خود بنویسیم و بارها و بارها در پروژه های مختلف از آنها استفاده نماییم. توجه داشته باشید که در این برنامه به دلیل اینکه کتابخانه مذکور در داخل پوشه پروژه جاری قرار داشت از ترکیب “blink.h” به جای استفاده کردیم. در واقع ترکیب دوم فقط برای کتابخانه های استاندارد که در پوشه include داخل کامپایلر قرار دارند استفاده می شود و ترکیب اول برای کتابخانه های محلی که در پوشه پروژه قرار دارند.
در جلسه بعدی با کتابخانه بزرگ و رایگان avrlib نوشته Pascal Stang آشنا می شویم که شامل صد ها هدرفایل در زمینه ارتباط با LCD های کاراکتری و گرافیکی، کارتهای حافظه MMC و SD، ارتباط با پورت سریال، راه اندازی مبدل آنالوگ به دیجیتال، TCP/IP، FAT، ماژول GPS و… می باشد. در جلسه بعد با کتابخانه آماده lcd.h که برای راه اندازی LCD کاراکتری طراحی شده کار می کنیم. لازم به ذکر است که کتابخانه های رایگان بسیار زیادی از افراد مختلف برای دانلود رایگان بر روی اینترنت قرار داده شده است که به راحتی می توانید از آنها استفاده نمایید.
بازدیدها: 751