اموزش برنامه نویسی میکروکنترلرهای avr (جلسه نهم)
در مطالب قبل شما با نحوه برنامه نویسی میکروکنترلر AVR و برنامه کدویژن اشنا شدید. برای درک بهتر شما از برنامه نویسی میکروکنترلر و نحوه ریختن برنامه روی میکرو و … تصمیم گرفتم در این پست یک پروژه ساده با عنوان led چشمک زن قرار بدهم.
اهدف پروژه led چشمک زن :
- اشنایی با پین های میکروکنترلر ATmega16
- اشنایی با پروگرام کردن میکرو با نرم افزار AVR Studio
- کتابخانه ها و نحوه استفاده از انها
- اشنایی با برخی از دستورات در کدویژن
- و …
توضیح : در این پروژه ساده, دو led از طریق دو مقاومت به پایه های PC0 و PC1 (پین های 22 و 23) میکرو وصل شده اند. در صورتی که با پین های مگا 16 اشنا نیستید, حتما پست “اشنایی با پین های میکروکنترلر ATmega16/32” را مطالعه کنید. در ابتدا led متصل به پین PC0 روشن شده و پس از یک ثانیه این led خاموش, و led متصل به PC1 روشن می شود. پس از یک ثانیه led متصل به PC1 خاموش و led متصل به PC0 روشن می شود و این روند ادامه دارد… که به این پروژه ساده LED چشمک زن می گویند (البته اینجا دو ال ای دی استفاده شده) .
شماتیک به صورت زیر می باشد :
توجه : در شماتیک بالا بدلیل اینکه در برنامه پروتئوس پایه های تغذیه برای این میکرو وجود ندارد وصل نشده, ولی در عمل پایه های تغذیه میکرو(پایه 10 و 11) را به 5 ولت وصل کنید
قبل از توضیح برنامه بهتره که با کتابخانه در کدویژن اشنا بشید:
کتابخانه ها در کدویژن به زبان ساده, یکسری برنامه های از پیش نوشته شده هستند که به منظور راحتی ما برای کار با قطعات و ماژول های مختلف استفاده می شوند. هر کتابخانه در نرم افزار کدویژن دارای یک سری توابع هست که ما پس از معرفی کتابخانه مورد نظر در ابتدای برنامه, میتوانیم از توابع این کتابخانه در برنامه خود استفاده کنیم . نحوه معرفی کتابخانه در کدویژن به صورت زیر می باشد :
1 |
#include <نام کتابخانه.h> |
به عنوان مثال یکی از پر استفاده ترین کتابخانه های کدویژن کتابخانه delay است که برای ایجاد تاخیر به مقدار مورد نظرمان استفاده می شود, معرفی این کتابخانه در ابتدای برنامه به صورت زیر است:
1 |
#include <delay.h> |
که پس معرفی این کتابخانه, می توانیم از توابع ان در برنامه خود استفاده کنیم به عنوان مثال یکی از توابع این کتابخانه به صورت زیر می باشد :
1 |
delay_ms(1000); |
که این تابع از کتابخانه delay تاخیری به مدت 1000 میلی ثانیه یا معادل یک ثانیه ایجاد می کند که از این تابع در برنامه led چشمک زن استفاده شده است با تغییر مقدار عدد داخل پرانتز می توانیم مقدار تاخیر مورد نظر را ایجاد کنیم .
برنامه :
در پست های قبل با محیط نرم افزار CodeVisionAVR اشنا شدید و نحوه ایجاد یک پروژه را یاد گرفتید و با قسمت های مختلف برنامه کدویژن اشنا شدید. در ادامه برنامه نوشته شده برای این پروژه خط به خط توضیح داده می شود :
ابتدا یک پروژه ایجاد کنید و میکرو را ATmega16 انتخاب کنید. فرکانس را روی یک مگاهرتز تنظیم کنید و در قسمت port پین های 0 و 1 از پورت C را خروجی تنظیم کنید. در برنامه زیر کدهای اضافی ایجاد شده و توضیحات حذف شده است (می تونید حذف نکنید من برای ساده تر شدن برنامه حذف کردم)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <mega16.h> /* معرفي کتابخانه مگا16 */ #include <delay.h> /* delay معرفي کتابخانه */ void main(void) { DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (1<<DDC0); /* C خروجي کردن پين هاي 0 و 1 از پورت */ PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); /*مقاومت بالاکش نداشته باشد C هيچ کدام از پين هاي پورت */ while (1) /* حلقه تکرار بينهايت */ { PORTC.0=1; /* يک شود C پين 0 از پورت */ PORTC.1=0; /* صفر شود C پين 1 از پورت */ delay_ms(1000); /* تاخير زماني به مدت يک ثانيه */ PORTC.0=0; /* صفر شود C پين 0 از پورت */ PORTC.1=1; /* يک شود C پين 1 از پورت */ delay_ms(1000); /* تاخير زماني به مدت يک ثانيه */ } } |
توجه :
- تمام کدها بجز کدهای داخل حلقه while توسط خود کدویژن ایجاد شده است
- در زبان c پس از هر دستور باید از علامت سیمی کالن (;) استفاده کرد, در صورت فراموشی کدویژن خطا (error) می گیرد
- عباراتی که داخل /*توضیحات*/ نوشته می شود, توضیحات برنامه هستند و تاثیری روی برنامه ندارند
- توجه کنید که از هر میکرویی که استفاده می کنید در ابتدای برنامه باید کتابخانه ان را فراخوانی کنید
- تابع DDRC برای تعیین خروجی یا ورودی بودن پین های پورت C استفاده می شود هر کدام از پین های 0 تا 7 در صورتی که صفر باشد به معنی ورودی و در صورت یک کردن به معنی خروجی بودن ان پین می باشد(برای بقیه پورت ها هم بجای C اخر تابع, پورت مورد نظر را می گذاریم)
- تابع PORTC برای مشخص کردن این است که پین های پورت مورد نظر مقاومت بالا کش داشته باشند یا نه
پروگرام کردن میکروکنترلر (ریختن برنامه روی میکرو) :
مرحله اخر این پروژه پروگرام کردن میکرو می باشد, توسط خود کدویژن هم می شود میکرو را پروگرام کرد ولی بهتره که پس از ایجاد فایل هگز توسط کدویژن این فایل را توسط برنامه دیگری به نام AVR Studio روی میکروکنترلر پروگرام کنید. AVR Studio یک کامپایلر بسیار حرفه ای برای برنامه نویسی و پروگرام کردن میکرو می باشد که ما فقط برای پروگرام کردن فایل هگز روی میکرو از ان استفاده می کنیم . در ادامه نحوه ریختن برنامه روی میکرو با این نرم افزار توضیح داده می شود .
1- ابتدا این برنامه را تهیه و نصب کنید.
2- پس از باز کردن برنامه با پنجره روبرو مواجه می شوید که روی Cancel کلیک کنید و بر روی قسمت مشخص شده در تصویر دوم کلیک کنید
3- در پنجره باز شده نوع پروگرامر خود و برای انتخاب شماره ی COM در device manager کامپیوتر خود در قسمت Ports ببینید پروگرامر شما به کدام شماره ی COM متصل است و در نهایت روی Connect کلیک کنید
4- پنجره زیر باز می شود, در قسمت Main نوع میکرو را انتخاب کنید
5- در قسمت Program ابتدا با کلیک بر روی Erase Device حافظه فلش میکروکنترلر را پاک کنید. در بخش Flash فایل هگز را انتخاب کنید و بر روی Program کلیک کنید تا برنامه روی میکرو ریخته شود
6- در قسمت Fuses فرکانس مورد نظر (برای این پروژه یک مگاهرتز) را از بخش SUT_CKSEL انتخاب کنید و درصورتی که JTAGEN تیک داشت بردارید و در نهایت بر روی Program کلیک کنید تا فیوز بیت های میکرو هم تنظیم شود
اگر تمام مراحل را به درستی انجام داده اید میکرو به درستی پروگرام شده و می توانید ان را در مدار قرار دهید
کلیپ تست عملی :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
اموزش برنامه نویسی میکروکنترلرهای avr :
- جلسه 1 : برنامه نویسی میکروکنترلر و اردوینو: انواع متغیر در زبان C
- جلسه 2 : برنامه نویسی میکروکنترلر و اردوینو: عملگرها بخش ۱
- جلسه 3 : برنامه نویسی میکروکنترلر و اردوینو: عملگرها بخش ۲
- جلسه 4 : برنامه نویسی میکروکنترلر و اردوینو: عملگرها بخش ۳
- جلسه 5 : برنامه نویسی میکروکنترلر و اردوینو: حلقه های تکرار
- جلسه 6 : برنامه نویسی میکروکنترلر و اردوینو: جملات شرطی
- جلسه 7 : اشنایی با محیط نرم افزار CodeVisionAVR
- جلسه 8 : اشنایی با پین های میکروکنترلر ATmega16/32
کسی میتونه این سوال رو حل کنه؟
برنامه ای بنویسید که یک LED متصل به پایه ی دلخواه میکروکنترلر را ده بار خاموش و روشن کند پ سپس برنامه پایان یابد(در محیط کد ویژن)؟
درود بر شرفت مهندس از اینکه این همه وقت گذاشتی.
سلام مهندس جان خوب هستی میتونید طب مالیه چشمک زدن این ال ای دی ها رو به این صورت که میگم برام برنامه ریزی کنید
Led1: *-*———————————-
Led2: —–*-*—————————–
اگر هر خط تیره مثلا معادل یک دهم ثانیه خاموشی باشه و هر * معادل یک دهم ثانیه روشن بودن .
هر ال ای دی پس از دو بار چشمک سریع (double flash) مدت ۲.۵ ثانیه خاموش میمونه و حلقه ادامه داره
ولی شروع چشمک زدن Led2 , (مدت مثلا ۲دهم ثانیه) پس از خاموشی Led1 شروع میشه.
سلام ازچه تابع استفاده کنم تاخیر زمانی به مدت دوساعت بشه ممنون
سلام خسته نباشید
با چه برنامه ای میتونم شبیه ساز رو ببینم
و چجوری میتونیم بفهمیم خروجی از کدوم پایه ها هستن؟
سلام, برنامه پروتئوس. سوال دومتون را متوجه نشدم, شماتیک پروژه قرار داده شده و مشخصه که led ها به کدوم پایه ها متصل شده اند
با سلام و تشکر از مطالب مفیدتون
دو تا سوال داشتم
با ریختن بوت لودر اردوینو در میکروی اتمگا16 پایه های میکرو عوض میشه و برنامه هایی که قبلا با کدویژن نوشتیم نیاز به تغیر داره یا نه؟؟
سوال دومم اینه که این کار قابل برگشته ؟؟ یعنی میشه دوباره به همون میکروی تنظیم کارخونه برگردوند؟چگونه
سلام, معمولا برای ساخت برد اردوینو از میکروکنترلر ATmega328 یا ATmega2560 یا دیگر میکروکنترلرهایی که بردهای اردوینو را با انها می سازند, استفاده می شود و توصیه می کنم که از این میکروها استفاده کنی نه mega16 یا… و بله برنامه نوشته شده با کدویژن برای اردوینو باید تغییر کند. از اونجایی که بوت لودر روی حافظه فلش میکرو ریخته میشه پس میشه دوباره اونو از روی میکرو حذف کرد که می تونید در موردش سرچ کنید
سلام میخواستم یک کمکی کنید برام من امتحان دارم میکرو کامپیوتر که یک پروژه است یک ledیک ثانیه روشن ویک ثانیه خاموش با تایمر برنامه نویسی تورو خدا هرکی بلده به این شماره پیام بده تو واتساپ09337626559
سلام کد این برنامه به زبان اسمبلی موجوده؟
سلام, برنامه به زبان C و کامپایلر کدویژن نوشته شده
سلام ببخشید میشه خیلی ساده و روان جوری که متوجه شم کاربرد تایمرها و وقفه در میکرو کنترلر رو بهم توضیح بدید من خودم دانشجو رشته الکترونیک هستم اما هیچ دقیق و خوب این موضوع رو نفهمیدم که چه موقع خوبه از تایمرها و وقفه ها استفاده کنم ممنون
سلام, مطالب زیادی در مورد تایمر/کانتر و وقفه در اینترنت هست که می تونید مطالعه کنید, ولی معمولا از تایمر برای تولید شکل موج در خروجی میکرو یا شمارش یک پالس استفاده میشه و وقفه هم کاربرد ان به این صورت است که در زمانی که اتفاق بیفتد روال عادی اجرای برنامه متوقف میشه و زیر برنامه ای که برای وقفه نوشتیم اجرا میشه و بعد از اتمام اون دوباره ادامه برنامه اجرا می شود که با استفاده از وقفه کدنویسی ما بسیار کمتر می شود. مثلا فرض کنید ما یک پروژه طراحی کرده ایم که کارهای مختلفی مانند کنترل دمای محیط, کنترل روشنایی و … انجام می دهد, در این پروژه در صورتی که دمای محیط به 30 درجه رسید باید سریعا یک فن روشن شود. در این شرایط می تونیم از وقفه استفاده کنیم تا زمانی که دما به 30 درجه رسید اجرای برنامه متوقف شود و سریعا یک فن روشن شود و پس از روشن شدن فن دوباره ادامه برنامه اجرا شود
برنامه ای بنویسید که یک LED متصل به پایه ی دلخواه میکروکنترلر را ده بار خاموش و روشن کند پ سپس برنامه پایان یابد(در محیط کد ویژن)؟
اینو میشه حل کنید
سلام.
یه سوالی داشتم در مورد تاخیر.
من چنتا ال ای دی دارم میی خوام که متفاوت از هم روشن بشن. ولی مشکل اینجاس که وقتی ال ای دی اول روشن می شه تا بر نامه برسه به روشن کردن ال ای دی 4 تاخیرا باعث می شه که فواصل زمانی بهم بخوره.
چاره چیه؟ (:unknw:)
سلام, سوالتون رو درست متوجه نشدم منظورتون از تاخیر چیه
خوب وقتی تاخیر در برنامه بزارین تا زمان تاخیر سپری نشه کار دیگه ای انجام نمیشه
اینجاست ک تایمرها به کار میان
شما باید برای هر تاخیر از تایمر میکرو استفاده کنید
اینجوری میکرو به بقیه دستورات عمل میکنه و تایمر هم مسول تاخیر زمانی میشه