جلسه CV,1.2 : آموزش AVR با فلاشر ، پایه خروجی و دستور delay

دوره آموزشی برنامه نویسی میکروکنترلر AVR با کامپایلر CodeVision ، فصل 1 : برنامه نویسی ساده با Codevision ، جلسه 2 : آموزش AVR با فلاشر ، پایه خروجی و دستور delay

هدف از این آموزش شروع کار با نرم افزار کدویژن و نحوه برنامه نویسی میکروکنترلر های AVR است

آموزش AVR : آشنایی مختصر با میکرو کنترلر ATmega8

میکرو کنترلر ATmega8 از دسته میکرو کنترلر های AVR است که دارای 28 پایه بوده و ولتاژ کاری آن 5 ولت می باشد.

پایه های ورودی و خروجی میکروکنترلر ATmega8

اصطلاح I/O مخفف کلمه Input/Output بوده و به معنی ورودی و خروجی است. میکروکنترلر امکانات بسیاری دارد که بررسی همه آن ها ماه ها طول می کشد و برای شروع فقط پایه های I/O که می تواند به عنوان ورودی یا خروجی برای ما استفاده شود مورد بررسی قرار می گیرد.

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

[ads1]

پایه های ورودی/خروجی میکروکنترلر 8 تا 8 تا دسته بندی شده اند و هر 8 پایه یک پورت شناخته می شود. در میکروکنترلر ATmega8 سه پورت وجود دارد که پورت B با 8 پایه ، پورت C با 6 پایه و پورت D با 8 پایه قابل استفاده هستند.

در تصویر زیر کلمه PORT به صورت مخفف نوشته شده است، به صورتی که پایه شماره 2 از پورت B به صورت PB2 نوشته شده.
بغیر از پایه های ورودی/خروجی یا I/O پایه های تغذیه میکروکنترلر هم برای شما لازم است. پایه Vcc ورودی تغذیه 5 ولت و پایه GND ورودی تغذیه منفی است.

طراحی مدار در نرم افزار پروتئوس

در این بخش از آموزش AVR به نرم افزار پروتئوس نیاز داریم تا برنامه نوشته شده را به صورت مجازی اجرا کنیم.

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

ابتدا باید در نرم افزار پروتئوس شماتیک  مدار خود را طراحی کنیم.

قطعات مورد نیاز برای این آموزش را می توانید با جستجوی نام های ATmega8 و LED در پروتئوس بیابید.

پروتئوس به صورت پیش فرض سیم های تغذیه Vcc و GND میکروکنترلر را وصل می کند و نیاز نیست شما این کار را انجام دهید.

طبق شکل زیرمدار شماتیک را طراحی کنید:

شروع کار با Codevision AVR

میکروکنترلر ها در حقیقت کامپیوتر های کوچک و ضعیفی هستند که می توانند برنامه هایی که به آن ها داده می شود را اجرا کنند. یکی از نرم افزار های معروف برای برنامه نویسی میکروکنترلر های AVR نرم افزار Codevision می باشد. در نرم افزار ذکر شده می توانید با زبان برنامه نویسی C برنامه خود را نوشته و به فایل قابل فهم برای میکروکنترلر تبدیل کنید.

نرم افزار را اجرا کنید.

برای ایجاد پروژه جدید از منوی بالایی نرم افزار گزینه File را انتخاب کنید. سپس از داخل گزینه NEW گزینه Project را انتخاب کنید.

سپس برنامه از شما خواهد پرسید که آیا از CodeWizard استفاده می کنید یا نه. گزینه Yes را انتخاب کنید.

پنجره ای باز می شود که سوال می کند از کدام نوع از تراشه استفاده می کنید؟ که ما گزینه ای که شامل ATmega است را  انتخاب می کنیم و بر روی OK کلیک می کنیم.

CodeWizard  چیست ؟

CodeWizard همانطور که از نامش پیداست ( تولید کننده کد) برای راحتی و تسریع در کار برنامه نویسی کدهایی را با توجه به تنظیمات مربوطه تولید می کند که کار برنامه نویس را راحت می کند.

در این قسمت ما تنظیماتی را مشاهده می کنیم : از قبیل انتخاب نوع chip (تراشه) ، تنظیم فرکانس کاری میکرو ، تعیین نوع ورودی یا خروجی پایه ، تنظیمات مربوط به LCD ها و تایمر ها و سایر امکانات میکرو.

[ads1]

که با ایجاد تنظیمات خود در این قسمت کد های مربوط به آن تنظیمات ایجاد می شود.

همانطور که در شکل زیر می بینید پنجره CodeWizard از چند قسمت تشکیل شده است که در شکل این دو قسمت با کادر قرمز رنگ (سمت چپ) و کادر آبی (سمت راست) مشخص شده است. در قسمت سمت چپ بخش های مربوط به تنظیمات  CodeWizard و در قسمت سمت راست تنظیمات مربوط به هر بخش را مشاهده می کنیم.

در این جلسه با توجه به پروژه خود تنها از قسمت Ports و Chip استفاده میکنیم .

در قسمت chip میکروکنترلر مورد نظر را از نوع ATmega8 انتخاب کنیم و کلاک کاری میکرو را هم روی 1Mhz تنظیم کنیم.

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

در قسمت PORTS چون LED  به بیت 0 پورت C وصل است باید این بیت به عنوان خروجی تعیین شود برای این کار با کلیک کردن بر روی قسمت مشخص شده در تصویر زیر می توان ورودی یا خروجی بودن بیت های هر پورت را تعیین کرد:

در بخش تنظیمات پایه های I/O هر پورت دو ستون دیده می شود. در ستون چپ ورودی یا خروجی بودن هر پایه را انتخاب می کنید.

با توجه به اینکه LED ما به پایه (بیت) 0 از پورت C متصل شده است این پایه را به عنوان خروجی تنظیم می کنیم. برای این کار کافیست بر روی عبارت IN کلیک کنید تا تبدیل به OUT شود.

[ads1]

در ستون سمت راست مقدار اولیه پایه را هنگام آغاز به کار میکرو مشخص می کنیم. به صورت پیش فرض خروجی پایه میکروکنترلر 0 یا صفر ولت می باشد.

پس از انجام تنظیمات بالا پروژه خود را ایجاد می کنیم.

برای ایجاد پروژه خود با توجه به شکل از قسمت Program گزینه  Generate,save and Exite را انتخاب می کنیم .

پس از انتخاب گزینه بالا ،برنامه از ما ،آدرس محل ذخیره و نام فایل برای ذخیره را میخواهد.

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

پس از ذخیره کردن پروژه ، کد های تنظیمات توسط CodeWizard تولید می شود که در شکل زیر مشاهده می کنید:

این کد ها غالبا مربوط به تنظیمات اولیه رجیستر های میکروکنترلر و یا فرخوانی کتابخانه هاست که در جلسان بعدی بیشتر با این موارد آشنا خواهید شد.

ما باید کد هایمان را کجا بنویسیم؟

کد های ایجاد شده توسط کدویزارد بسیار پیچیده به نظر می رسند، اما اصلا نگران نباشید.

لازم نیست شما همه کد ها را بلد باشید. محلی که شما برای نوشتن کد هایتان نیاز دارید از قبل مشخص شده.

در اخرین خط های برنامه کد while (1) را پیدا کنید.

هر کدی که داخل محدوده این کد نوشته شده باشد تا زمان خاموش شدن کامل میکروکنترلر به صورت تکراری اجرا خواهند شد.

یعنی اگر شما داخل این کد برنامه یک بار چشمک LED را بنویسید تا زمان خاموش شدن میکروکنترلر کد هایتان را به صورت تکراری اجرا خواهد کرد.

برای مثال پس از یک بار اجرای کد ها و انجام یک چشمک، دوباره به ابتدای برنامه بازگشته و دوباره برنامه چشمک را اجرا خواهد کرد و به همین ترتیب تا زمانی که میکروکنترلر روشن باشد این برنامه را ادامه خواهد داد.

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

[ads1]

کد PORTx

شما توسط این کد می توانید خروجی های میکروکنترلر را کنترل کنید.

برای مثال شما می خواهید پین 0 از پورت C را روشن یا خاموش کنید.

برای روشن شدن یا 1 شدن یا فعال شدن پایه مذکور کافیست کد روبرو را بنویسید:

PORTC.0=1;

هر گاه این کد اجرا شود خروجی پایه C.0 روشن شده و ولتاژ 5 ولت با جریان ضعیف خواهد داشت. و اگر در این پایه LED متصل شده باشد LED را با همان جریان ضعیف روشن خواهد کرد.

حال برای خاموش کردن LED یا خاموش کردن پایه C.0 یا صفر کردن آن پایه از کد زیر استفاده کنید:

PORTC.0=0;

حال قبل از ساختن فلاشر چشمک زن با یک LED ، توسط میکروکنترلر یک LED را روشن می کنیم.

دقت کنید که در انتهای تمامی کد های کدویژن و زبان برنامه نویسی C باید علامت نقطه سمی کالون یا ; قرار بگیرد که به معنی پایان کد نوشته شده است.

روشن کردن LED توسط میکروکنترلر

برای این کار کافی است از کد ای گفته شده در بالا استفاده کنید و کد PORTC.0=1 را در محل مشخص شده از برنامه قرار دهید.

دقت کنید که این کار را بدون خطا و مطابق با تصویر انجام دهید:

برنامه شما با نوشتن همین یک کد به اتمام رسیده و اگر تنظیمات بخش کدویزارد را هم به درستی انجام داده باشید با همین برنامه می توانید LED را روشن کنید.

حال باید کد HEX برنامه خود را تولید کنید.

کد HEX چیست؟

کد HEX یا هگزادسیمال ، کدی است که پردازنده میکروکنترلر می تواند آن را پردازش کند. کد های نوشته شده توسط شما مستقیما برای میکروپروسسور و میکروکنترلر قابل درک نیست و باید به کد های ساده تر یا زبان ماشین تبدیل شود.

برنامه های کامپیالر مانند کدویژن برای همین منظور طراحی شده اند تا کد های نوشته شده و نزدیک به زبان انسان را به کد های قابل فهم برای میکروپروسسور ها تبدیل کنند.

حال کافیس تا با انتخاب گزینه Compile برنامه نوشته شده خود را به کد های HEX تبدیل کنید.

چگونه کد HEX برنامه خود را بدست آوریم؟

برای کامپایل شدن برنامه و ایجاد فایل HEX گزینه مشخص شده در تصویر را انتخاب کنید.

با انتخاب گزینه Build All Project files فایل هگزادسیمال HEX برای شما ساخته می شود.

پس از کامپیال کامل برنامه در این صفحه می توانید وضعیت برنامه را مشاهده کنید و در صورتی که کد ها را اشتباه نوشته باشید تعداد error ها را ببینید.

اگر برنامه شما error داشته باشد فایل HEX ایجاد نمی شود و باید برنامه را اصلاح و دوباره کامپایل کنید.

حال با مراجعه به محلی که برنامه خود را ذخیره کرده اید از داخل فولدر Debug و سپس فولدر Exe فایل HEX را پیدا کنید.

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

چگونه فایل HEX را در پروتئوس اجرا کنیم؟

دوباره به نرم افزار پروتئوس رفته و بر روی میکروکنترلر ATmega8 دابل کلیک انجام دهید.

در این بخش می توانید برخی از تنظیمات میکروکنترلر را تغییر دهید.

با انتخاب گزینه مشخص شده در تصویر می توانید در آدرس محل ذخیره برنامه در فولدر Debug>>EXE فایل هگز را انتخاب کرده و گزینه Ok رانتخاب کنید.

نحوه شبیه سازی و اجرای برنامه در پروتئوس

پس از انتخاب فایل HEX به کمک راهنمای زیر شبیه ساز را اجرا کنید.

پس اجرای شبیه ساز اگر فایل هگز را بدرستی معرفی کرده باشید و برنامه شما مشکلی نداشته باشد LED به صورت زیر روشن می شود:

در صورتی که با error زیر مواجه شدید فایل هگز را بدرستی برای میکروکنترلر تعریف نکرده اید.

نحوه برنامه نویسی فلاشر یا چشمک زن

برا ساختن فلاشر یا چشمک زن ابتدا باید با الگوریتم مناسب برای این کار آشنا شوید.

به صورت عامیانه تر برای چشمک زدن یک چراغ این اتفاقات می افتد:

  1. چراغ روشن می شود
  2. چند لحظه زمان می گذرد
  3. چراغ خاموش می شود
  4. چند لحظه زمان می گذرد
  5. چراغ روشن می شود
  6. چند لحظه زمان می گذرد
  7. چراغ خاموش می شود
  8. چند لحظه زمان می گذرد
  9. چراغ روشن می شود
  10. چند لحظه زمان می گذرد
  11. چراغ خاموش می شود
  12. چند لحظه زمان می گذرد
  13. تکرار این برنامه تا بی نهایت ………..

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

  1. شروع حلقه بینهایت
  2. چراغ روشن می شود
  3. چند لحظه زمان می گذرد
  4. چراغ خاموش می شود
  5. چند لحظه زمان می گذرد
  6. اجرای دوباره حلقه بینهایت

حال که می دانیم چراغ یا LED ما به پایه C.0 میکروکنترلر که پایه شماره 23 در میکروکنترلر ATmega8 است متصل شده به جای نوشتن دستور “چراغ را روشن می کنیم” از دستور “پایه 0 از پورت C = روشن” استفاده می کنیم.

[ads1]

همچنین به جای دستور “چند لحظه زمان می گذرد” از دستور “تاخیر زمانی = 0.5 ثانیه” استفاده می کنیم.

  1. شروع حلقه بینهایت
  2. پایه 0 از پورت C = روشن
  3. تاخیر زمانی = 0.5 ثانیه
  4. پایه 0 از پورت C = خاموش
  5. تاخیر زمانی = 0.5 ثانیه
  6. اجرای دوباره حلقه بینهایت

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

PORTC.0=1;

و همچنین با دستور زیر همان پایه را خاموش می کنید:

PORTC.0=0;

توجه داشته باشید این دستور ها و تمامی دستور هایی که به رجیستر های میکروکنترلر مربوط هستند با حرف بزرگ نوشته می شوند. در حالی که دستور های شرطی و توابع دیگر با حروف کوچک در زبان c نوشته می شوند.

حالا دستور تاخیر زمانی را بررسی می کنیم.

برای ایجاد یک زمان تاخیر یا بدون عملکرد در میکروکنترلر راه های متنوعی وجود دارد که ساده ترین روش در زبان برنامه نویسی کدویژن استفاده از دستور delay می باشد.

دستور delay به صورت پیش فرض در زبان برنامه نویسی c تعریف نشده است اما کتابخانه مربوط به آن در نرم افزار کدویژن وجود دارد. در صورتی که کتابخانه این دستور را فراخوانی نکرده باشید کامپایلر این دستور را به عنوان یک دستور ناشناخته تشخیص داده و ارور خواهد داد و در نتیجه برنامه شما کامپایل نخواهد شد.

[ads1]

برای فرخوانی کتابخانه دستور delay ,به ابتدایی ترین نقطه کد ها رفته و دستور زیر را پیدا کنید:کتابخانه این دستور

#include <mega8.h>

این دستور کتابخانه میکروکنترلر mega8 را فراخوانی می کند. زیر این دستور کتابخانه delay یا تاخیر زمانی را با دستور زیر فراخوانی کنید:

#include <delay.h>

کد های شما در نهایت به شکل زیر خواهد بود:

حالا برای ایجاد یک تاخیر زمانی می توانید از دو دستور زیر استفاده کنید.

توسط این دستور بر حسب میلی ثانیه تاخیر ایجاد می شود. برای مثال تاخیر زمانی برای 500 میلی ثانیه به صورت زیر نوشته می شود:

delay_ms (500);

توسط این دستور بر حسب میکرو ثانیه تاخیر ایجاد می شود. برای مثال تاخیر زمانی برای 500 میکرو ثانیه به صورت زیر نوشته می شود:

delay_us (500);

حال که با برخی از دستور های مورد نیاز آشنا شدید الگوریتم نوشته شده برای چشمک زن را توسط دستور ها می نویسیم.

فرخوانی کتابخانه تاخیر زمانی
شروع حلقه بینهایت
PORTC.0=1;
delay_ms (500);
PORTC.0=0;
delay_ms (500);
اجرای دوباره حلقه بینهایت

دستور حلقه بینهایت چیشت؟

همانطور که در بخش اول آموزش مشاهده کردید دستور حلقه بینهایت یا while 1 از ابتدا توسط کدویزارد نوشته شده بود. اما این دستور چرا تا بینهایت محتوای داخل خود را اجرا می کند؟

برای پاسخ به این سوال ابتدا باید با دستور while بیشتر آشنا شوید. معنای لغوی این دستور “تا زمانیکه” می باشد و شکل کللی نوشتاری این دستوری به این شرح است:

while (شروط دستور)
{
کد های شما در این قسمت نوشته می شود
}

با توجه به معنای لغوی دستور while می توان دریافت که “تا زمانیکه” “شروط دستور” صحیح و برقرار باشد و شرط نقض نشود “کد های شما” اجرا خواهد شد.

حال اگر بجای شروط دستور عدد 1 قرار دهید تا بینهایت شرط شما درست و کد ها اجرا خواهند شد:

while (1)
{
هر کدی در بین دو کروشه نوشته شده باشد تا بینهایت به صورت تکراری اجرا خواهد شد
}

همانطور که میدانید دنیای دیجیتال از 0 و 1 یا true & fulse تشکیل یافته. تا همینجا می توانید حدس بزنید که عبارت true معادل عدد منطقی 1 می باشد. در نتیجه عدد 1 به معنای true بودن یا صحیح بودن است و هر جا شرط شما عدد 1 باشد آن شرط همیشه صحیح است.

[ads1]

به همین ترتیب هرجا به جای شرط عدد 0 نوشته شود هیچ گاه آن شرط صحیح نخواهد بود.

پس دانستیم هرگاه از دستور while 1 استفاده کنیم کد های داخل این دستور تا بینهایت اجرا خواهند شد.

بنابر این کد نهایی ما برای فلاشر ساده با یک LED به صورت زیر خواهد بود:

while (1)
{
// Place your code here
PORTC.0=1;
delay_ms (500);
PORTC.0=0;
delay_ms (500);
}

دستور نهایی را در کدویژن به صورت زیر نوشته و مثل دفعه پیش برنامه را کامپایل کرده و فایل HEX جدید را تولید کنید.

در صورتی که برنامه شما ارور داشته باشد فایل هگز جدید ایجاد نخواهد شد.

در برنامه پروتئوس نیاز به معرفی دوباره فایل هگز نیست و فقط کافیست برنامه شبیه ساز را یک بار متوقف کرده سپس دوباره شبیه ساز را اجرا کنید تا با فایل هگر جدید اجرا شود.

اگر سرعت فلاشر شما خیلی کم بود و خیلی طول کشید تا LED خاموش شود ادامه مطلب را مطالعه بفرمایید.

ممکن است LED شما با سرعت بسیار کمی روشن و خاموش شود. دلیل این اتفاق می تواند نا هماهنگی سرعت کاری تنظیم شده میکروکنترلر در کدویزارد (نرم افزار) و سرعت کار تنظیم شده میکروکنترلر در پروتئوس (سخت افزار) باشد.

سرعت کار میکروکنترلر در کارخانه و به صورت پیش فرض بر روی 1Mhz تنظیم شده است و اگر شما هم در نرم افزار سرعت را روی 1Mhz تنظیم کرده باشید مشکلی در اجرای برنامه نخواهید داشت.

اما برای مثال اگر در نرم افزار کدویزارد سرعت کار میکروکنترلر را بر روی 8Mhz تنظیم کرده باشید برنامه به خیال این که میکرو سریع تر در حال اجرای کد ها می باشد آرام تر فلش خواهد زد تا 500 میلی ثانیه شما درست اجرا شود.

در این حالت باید در نرم افزار پروتئوس هم اقدام به تغییر سرعت کاری پیش فرض میکروکنترلر کنید. برای این کار بر روی میکروکنترلر دابل کلیک انجام داده و یکی از گزینه های زیر را انتخاب و گزینه Ok را انتخاب کنید:

با تغییر سرعت کار میکروکنترلر به وضوح تغییرات سرعت فلاشر خود را مشاهده خواهید کرد. اما برای تغییر سرعت فلاشر بهتر است این کار را از طریق برنامه نویسی و با تغییر مقدار دستور delay انجام دهید.

در همه برنامه ها روش استاندارد این است که سرعت انتخاب شده در میکروکنترلر (سخت افزار) در کدویزارد هم همان مقدار باشد تا برنامه بدرستی در میکروکنترلر اجرا شود.

فرکانس 1Mhz و 8Mhz توسط کریستال تولید می شوند. به این فرکانس ها کلاک سی پی یو هم گفته می شود. با توجه به اینک در داخل میکروکنترلر تنهای کریستال های 1Mhz و 2Mhz و 4Mhz و 8Mhz وجود دارد برای راه اندازی میکرو با فرکانسی غیر از فرکانس های ذکر شده باید از کریستال خارجی استفاده کرد که فعلا توضیح بیشتر این مورد در گنجایش این آموزش ساده نیست.

امیدوارم مطالب برای شما مفید بوده باشه، با ارسال نظرات دستان مارا برای نوشتن دلگرم کنید.


برچسب‌ها:

دیدگاه‌ها

3 پاسخ به “جلسه CV,1.2 : آموزش AVR با فلاشر ، پایه خروجی و دستور delay”

  1. وحید نیم‌رخ
    وحید

    سلام
    امروز با سایتتون آشنا شدم خسته نباشید خدا قوت میگم واقعا دستتون درد نکنه ان شاالله قصد دارم همشو مطالعه کنم دست مریزاد

    1. نوید مهاجری نیم‌رخ
      نوید مهاجری

      سلام. نوش جان.

  2. علی نیم‌رخ
    علی

    دمت گرررررم واقعا عالی بوووود

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

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