پروژه رقص نور با میکروکنترلر AVR ATmega32
پروژه رقص نور با میکروکنترلر avr
در مطلب پروژه رقص نور با میکروکنترلر avr قراره چند نوع الگوریتم برای راه اندازی LED های متصل شده به یک پورت کامل رو باهم بررسی کنیم و کد براشون بنویسیم.
پروژه رقص نور با میکروکنترلر AVR ATmega32
مثل توضیحاتی که در جلسات یک تا سه از آموزش AVR داده شد ، باید یک پروژه جدید بازکنید و در بخش کدویزارد طبق شماتیک پورت A رو خروجی نعریف کنید و مقدار اولیه صفر به پایه های این پورت بدید.
فرکانس کاری یک مگاهرتز یا حتی 16 مگاهرتز تفاوتی در عملکرد کلی این پروژه ندارد. فقط در هنگام استفاده عملی و یا شبیه سازی باید فرکانس تنظیم شده در برنامه مطابق فرکانس تنظیم شده فیوزبیت های میکرو باشد.
در اولین پروژه رقص نور با میکروکنترلر avr قصد داریم تمامی LED ها با هم یک ثانیه روشن و سپس یک ثانیه خاموش بشن.
در نتیجه باید همه ی پایه ها مقدار یک بگیرن و بعد از یک ثانیه مقدار صفر به اونها داده بشه.کد این پروژه به شکل زیر در می آد:(من از مقدار هگز استفاده کردم ، با مقدار باینری یا دسیمال هم میتونید این برنامه رو خودتون بنویسید.
در نتیجه کد حلقه ی بی نهایت به شکل زیر در می آد :
1 2 3 4 5 6 7 |
while(1) { PORTA = 0xFF; // turn on all LEDs of PORTA delay_ms(1000); // delay of one second PORTA = 0x00; // turn off all LEDs of PORTA delay_ms(1000); // delay of one second } |
و کل کد به شکل زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <mega32.h> #include <delay.h> void main(void) { DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); while(1) { PORTA = 0xFF; // turn on all LEDs of PORTA delay_ms(1000); // delay of one second PORTA = 0x00; // turn off all LEDs of PORTA delay_ms(1000); // delay of one second } } |
پروژه دوم رقص نور در کد ویژن :
در این پروژه قصد داریم که LED ها یکی یکی روشن و خاموش بشن و این عمل تکرار بشه.( رقص نور آبشاری )
چون از یک سخت افزار استفاده میکنیم پس تنظیم رجیستری پایه ها نیاز نیست که دوباره در کدویزارد یا دستی طبق آموزش رجیسترهای ورودی و خروجی میکروکنترلر AVR صورت بگیره پس فقط در حلقه while تغییرات رو اعمال میکنیم.
کد های اضافه و کامنت هارو پاک میکنم تا کد واضح تر باشه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <mega32.h> #include <delay.h> void main(void) { DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); while (1) { PORTA=0x01; //0000 0001 delay_ms(200); PORTA=0x02; //0000 0010 delay_ms(200); PORTA=0x04; //0000 0100 delay_ms(200); PORTA=0x08; //0000 1000 delay_ms(200); PORTA=0x10; //0001 0000 delay_ms(200); PORTA=0x20; //0010 0000 delay_ms(200); PORTA=0x40; //0100 0000 delay_ms(200); PORTA=0x80; //1000 0000 delay_ms(200); } } |
شما میتوانید بجای ATMEGA32 از ATMEGA16 هم استفاده کنید. تفاوتی در کد ها بجز در خط اول برنامه وجود ندارد!
پروژه سوم رقص نور در کد ویژن :
در این پروژه از سخت افزار پروژه های قبل استفاده میکنیم و تمایم داریم که 4 LED یکی در میون روشن و خاموش بشن و این عمل هر یک ثانیه تکرار بشه:
تفاوتی در بخش رجیستری با پروژه های قبل نداره به همین خاطر برای کوتاه شدن مطلب فقط کد حلقه while رو مینویسم :
1 2 3 4 5 6 7 |
while(1) { PORTA=0b10101010; delay_ms(500); PORTA=0b01010101; delay_ms(500) ; } |
پروژه چهارم رقص نور با atmega32
هدف ما در این پروژه انجام همون پروژه اول هستش با این تفاوت که این بار میخوایم که از حلقه for استفاده کنیم.
حلقه For در C در این مطلب توضیح داده شده ، اگر آشنا نیستید حتما مطالعه کنید.
دستور pow در کدویژن:
در این پروژه از تابع pow هم استفاده میکنیم. این تابع رو میشه با صدا زدن کتابخونه ی math.h استفاده کرد.
این تابع 2 بخش ورودی داره ، رقم اول پایه و رقم دوم مقدار توان عدد هستش.مثلا عدد 2 بتوان 3 به این شکل در میاد و مقدار به دست اومده رو در متغیر a میریزه:
1 |
a=pow(2,3); |
کد پروژه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <mega32.h> #include <delay.h> #include <math.h> void main(void) { int i,a=0; DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); while(1) { for(i=0;(i<=7);i++) { a=pow(2,i); PORTA=a; delay_ms(200); } } } |
چون سخت افزار در این پروژه ها تغییر نکردن منم یک فایل شبیه سازی به همراه کد پروژه آخر رو برای شما آپلود میکنم و خودتون مطابق نیاز میتونید کدهارو تغییر بدید.
پروژه چهارم به همراه فایل پروتئوس
روش های زیادی ممکنه به ذهن هرکسی برسه تا این LED هارو به رقص بیاره! خلاقیت به خرج بدید و امتحان کنید 😉
این آموزش بخشی از آموزش جلسه سوم آموزش AVR کدویژن بود که برای طولانی نشدن مطلب قبلی در یک مطلب جداگانه برای شما عزیزان آماده شد.
موفق باشید.