تبلیغات
برنامه نویسی و الکترونیک - ساخت یک LED فلاشر با میکروکنترلر AVR ATMega16A
 
منوی اصلی


--------------------------

--------------------------

--------------------------

--------------------------


سفارش پروژه

E-Mail :
Mahmood_Mehri@Hotmail.com

سایت برنامه نویس :  Mahmood_M


موضوعات

دانلود نرم افزار
 
تخصصی برنامه نویسی
  تخصصی برق ( الکترونیک )
  کامپوننت ها و ابزارها
  نرم افزارهای متفرقه
برنامه نویسی
  مباحث عمومی
  آموزش Delphi

  آموزش زبان C++ / C
 
آموزش Matlab

  آموزش زبان Assembly
  آموزش DataBase

الکترونیک
  مباحث عمومی
  مباحث عمومی الکترونیک
  معرفی قطعات الکترونیکی
  کار با مولتی متر
  مدارات الکترونیک
  میکروکنترلر
  میکروکنترلرهای AVR
  پروژه ها
مباحث متفرقه
  آموزشهای متفرقه
  معرفی سایت
  معرفی کتاب
  پاسخ به سئوالات
  مطالب عمومی


لینك دوستان
:: جک :: اس ام اس :: عکس
:: الکترونیک 89 گیلان
:: سورسهای نرم افزاری
:: اینترنت بدون تحریم
:: علمی.کتاب.مجله.نرم افزار.مقاله
:: مبارزات آزاد
:: برنامه نویسی از اهل زمین
:: :: جزیره ی دانلود ::
:: :: کامپیوتر و IT ::
:: بزرگترین پایگاه مدل لباس اینترنتی
:: مرکز دانلود ایرانیان
:: پایگاه علمی مهندسی تراشه
:: تمامی راهکارهای کامپیوتری
:: برنامه نویسی و طراحی وب
:: خرید ساعت دیواری
:: :: فناوری روز ::
:: :: همه چیز واسه موبایل ::
:: آموزش تخصصی کامپیوتر
:: * پیاز داغ اینترنت ! *
:: جدیدترین موزیکها و نرم افزارها
:: دانلود سورس ویژوال بیسیک
:: امپراطور دانلود و آموزش
:: موبایل و کامپیوتر
:: جدیدترین آهنگهای هفته
:: درباره ی دلفی !
:: برنامه نویس
:: پروژه های رایگان و آموزش ++C
:: ابراهیم آنلاین

 : " ساخت یک LED فلاشر با میکروکنترلر AVR ATMega16A " :
 
با سلام ...
در این پست قصد داریم یک پروژه ی تقریبا ساده و پایه ای رو با میکروکنترلر AVR انجام بدیم ، در این پروژه  از میکروی ATMega16 و همچنین زبان برنامه نویسی C و کامپایلر CodeVision AVR استفاده می کنیم ...
قبل از شروع کار بهتره کمی در مورد میکروی ATMega16 و پایه هاش بحث کنیم ! ، در تصویر زیر پایه های یک میکروی ATMega16 رو مشاهده می کنید :
---------------------------------------------------

---------------------------------------------------
میکروهای AVR چهار پورت ( درگاه ورودی و خروجی ) دارن که در تصویر بالا مشاهده میکنید ، Port های A و B و C و D ، همونطور که مشاهده میکنید ، هر پورت 8 پایه داره ( از 0 تا 7 )
اما نحوه ی تنظیم پورت ها در هنگام نوشتن برنامه ...
در میکروهای AVR برای هر پورت 3 رجیستر وجود داره :
  • DDRX : برای مشخص کردن اینکه پورت X ورودی هست یا خروجی
  • PINX : اگر پورت به عنوان ورودی معرفی شده باشه ، از این رجیستر برای دادن ورودی استفاده مکنیم
  • PORTX : اگر پورت به عنوان خروجی معرفی شده باشه ، برای ارسال خروجی از این رجیستر استفاده میکنیم
به جای X نام پورت قرار میگیره ...
رجیستر ها درواقع واسطه هایی هستن برای رسوندن دستور شما به هسته ی میکروکنترلر ، شما دستوراتتون رو در رجیسترها می نویسید و اونها دستورات رو به هسته ی میکرو منتقل میکنن ، در ادامه با اجرای عملی پروژه مفهوم رجیسترها رو بهتر درک می کنید ...

دو پایه ی مهم دیگه برای شروع کار ، VCC و GND هستند ، VCC به قطب مثبت منبع تغذیه وصل میشه و GND هم به قطب منفی ...

سایر پایه ها فعلا به کار ما نمیان !! ، و بحث در مورد اونها فقط سئوالات بیشتری رو در ذهنتون ایجاد میکنه و فایده ای نمی تونه داشته باشه ...

لوازم مورد نیاز برای آزمایش :
  • Breadboard
  • مقداری سیم ( ترجیحا سیم Breadboard )
  • میکروکنترلر AVR مدل ATMega16
  • یک Zif Socket چهل پین
  • 8 عدد LED
  • 8 عدد مقاومت ( مثلا 220 یا 270 اهم )
  • منبع تغذیه ( 4 تا 6 ولت )
  • دو عدد کلید فشاری
در این مدار ، از پورت B ب عنوان خروجی و از پایه ی شماره ی 0 ( صفر ) پورت C برای ورودی استفاده میکنیم ، نحوه ی عمل مدار هم به اینصورته که با شروع به کار میکرو ، LED ها یکی یکی شروع به روشن شدن می کنند ، از پایین به بالا ، یا از راست به چپ !! ، یعنی از پایه ی شماره ی 7 ( هشتمین پایه ) پورت B تا پایه ی صفر ( اولین پایه ) ، با فشردن کلید دوم ، مقدار ورودی توسط کلید در پایه ی شماره ی 0 ( صفر ) پورت C وارد میشه و در این لحظه جهت روشن شدن LED ها تغییر میکنه ، با ادامه ی پروژه همراه بشید تا موضوع رو بهتر درک کنید ...

...

به خاطر زیاد نشدن حجم صفحه اصلی وبلاگ ، برای مشاهده ی ادامه ی پست ، به " ادمه ی مطلب " مراجعه کنید !!


  ادامه ...

در مرحله ی اول ، منبع تغذیه رو همراه با یک کلید بر روی Breadboard قرار میدیم ، به علاوه ، Zif Socket رو هم بر روی Board قرار می دیم و قطبهای مثبت و منفی رو آماده می کنیم .
زمان قرار دادن Zif Socket بر روی Breadboard ، به شماره ی ردیفهای Breadboard دقت کنید ، سعی کنید ، پایه های زیف سوکت روی اعداد رندی قرار بگیرن ، با توجه به اینکه زیف سوکت ما 20 پین در هر طرف داره ، مثلا می تونید پایه هاش رو از ردیف شماره ی 21 تا 40 در وسط برد قرار بدید ، اینکار باعث میشه که پایه های میکروکنترلر رو بعد از نصب بر روی زیف سوکت ، راحت تر پیدا کنید .
همونطور که گفته شد ، قصد داریم از پورت B به عنوان خروجی استفاده کنیم ، اگر از یک Breadboard استفاده میکنید ، فضای کافی در کنار Zif Socket برای قرار دادن مقاومت ها به همراه LED ها وجو نخواهد داشت ، پس با استفاده از چند قطعه سیم پایه های پورت B رو به 8 ردیف آزاد Breadboard متصل میکنیم .
حتما می دونید که دو ردیف کناری در Breadboard ، در وسط برد اتصالشون قطع میشه ، برای برقرار کردن اتصال بین پایه های منفی LED ها و قطب منفی باید یک سیم برای ارتباط در وسط برد قرار بدید ، تصویر زیر این مرحله رو به خوبی نمایش میده :
---------------------------------------------------

---------------------------------------------------
در مرحله ی دوم باید مقاومت ها و LED رو متصل کنیم ، قطب مثبت LED ها رو همراه با مقاومت به پایه های میکرو وصل کنید و قطب منفی LED ها رو هم به قطب منفی منبع تغذیه :
---------------------------------------------------

---------------------------------------------------
مرحله ی بعد اتصال میکروکنترلر به منبع تغذیه هست ، برای این کار باید پایه ی VCC میکرو رو به قطب مثبت و پایه ی GND میکرو رو به قطب منفی متصل کنید ، مانند تصویر زیر :
---------------------------------------------------

---------------------------------------------------
مرحله ی آخر در بستن مدار ، متصل کردن کلید به پایه ی صفر پورت C هست ، برای این کار یک سیم از پایه ی صفر پورت C به یک پایه ی کلید متصل کنید و پایه ی دیگر کلید رو به قطب منفی متصل کنید ، توجه کنید که پایه ی صفر پورت C بعد از فشردن کلید باید به قطب منفی متصل بشه و مقدار عددی پورت رو صفر کنه ( در ادامه توئضیح داده خواهد شد ! ) ، برای شناسایی بهتر ! اتصال پایه ی صفر به کلید و کلید به قطب منفی با سیم سبز رنگ در تصویر زیر مشخص شده :
---------------------------------------------------

---------------------------------------------------
خوب ، بستن مدار به پایان رسید ! ، به قسمت مهمتر یعنی برنامه نویسی رسیدیم ...

برنامه ی پیچیده ای نیست ، اول کد رو قرار میدیم و بعد توضیحات :

#include <mega16.h>
#include <delay.h>

#define LP PORTB
#define SP PINC.0

unsigned char LData;

void RightToLeft(void)
{
  if (LData == 128 )
  {
   LP = 0b11111111;
   LData = 0b00000001;
  }
  else
  {
   LP = LData;
   LData = LData << 1;
  }
}

void LeftToRight(void)
{
  if (LData == 0 )
  {
   LP = 0b11111111;
   LData = 0b10000000;
  }
  else
  {
   LP = LData;
   LData = LData >> 1;
  }
}

void main(void)
{
 LP = 0xFF;
 DDRB = 0xFF;
 
 PINC = 0b00000001;
 DDRC = 0x00;
 
 LData = 0b00000001;
 
 #asm("cli")
 
 while(1)
 {
  delay_ms(10);
  if ( SP )
   LeftToRight(); 
  else
   RightToLeft();
 }
}

ما فرض رو بر این گذاشتیم که خواننده ی این پست آشنایی اولیه ای با AVR و زبان C داره ، پس در مورد دستور زبان C بحثی نمی کنیم ...
دو خط اول برای تعریف دو فایل Header مورد نیاز هست ، در دو خط بعدی ، ما دو ثابت به نامهای LP و SP و با مقدارهای PORTB و PINC.0 تعریف کردیم ، با تعریف این ثابتها در هنگام کدنویسی به جای نوشتن عبارت PORTB و PINC.0 معادلشون که تعریف شدند رو می نویسیم ، این روش کار رو در برخی مواقع خیلی ساده و سریع میکنه ، فرض کنید قصد داریم به جای PORTB از PORTD استفاده کنیم ، در این صورت باید کل کد رو بگردیم و هرجا PORTB دیدیدم با PORTD تعویض کنیم ولی با تعریف یک ثابت و استفاده از اون فقط کافیه که در خط مربوط به تعریف ثابت ، PORTB رو با PORTD عوض کنیم ...

در خط بعد یک متغیر از نوع unsigned char و با نام LData تعریف کردیم ، این متغیر وظیفه ی نگهداری اطلاعات پورت خروجی ، یعنی پورت B رو بر عهده داره ...

در ادامه میرسیم به دو تابع به نامهای RightToLeft و LeftToRight ، این دو تابع جهت روشنایی LED ها رو مشخص می کنند ، در ادامه توضیح داده خواهند شد !

اما بدنه ی اصلی کد ما که تابع main هست ...
همونطور که اشاره شد ، میکروی AVR برای هر پورت 3 رجیستر داره ، گفتیم اگر بخوایم یک پورت رو به عنوان خروجی یا ورودی تعیی نکنیم باید رجیستر DDR رو مقدار دهی کنیم ، در خط اول LP یا همون PORTB رو برابر با مقدار 0xFF قرار دادیم که عددی در مبنای 16 هستش ، معادل این عدد در مبنای دو به صورت 0b11111111 هست ، به تعداد یکهای عدد باینری دقت کنید ، اطلاعات هر پورت شامل یک عدد باینری 8 رقمی هست ، به طوری که هر رقموضعیت یکی از پایه های پورت مورد نظر رو نشون میده ، به ترتیب از سمت راست به چپ اعداد وضعیت پایه ی 0 ، پای 1 ، ... ، پایه 7 رو نمایش میدن ، به عنوان مثال ، عدد 0b10010010 نشون میده که پایه های شماره ی 1 و 4 و 7 فعال هستند و جریان در اونها برقراره .
توجه کنید که برای نمایش اعداد باینری ابتدای عدد از " 0b " و برای اعداد مبنای 16 از " 0x " استفاده میکنیم ...
خوب ، برای تعیین یک PORT به عنوان خروجی باید رجیستر DDR رو برابر با 0xFF و برای تعیین پورت به عنوان ورودی هم باید DDR رو برابر با 0x00 قرار بدیم ، قبل از تعیین ورودی یا خروجی بودن پورت می تونیم به رجیستر PORT مقدار اولیه بدیم که در ابتدای تابع main این کار انجام شده .
چون از همه ی پایه های PORTB باید استفاده کنیم ، مقدار اولیه برابر با 0xFF یا 0b11111111 بود ولی چون فقط از پایه ی صفر پورت C باید استفاده کنیم مقدار اولیه هم به همین پورت داده شد ( 0b00000001 )
اگر یادتون باشه گفتیم که بعد از تعیین رجیستر DDR ، اگر پورت به عنوان خروجی تعیین بشه باید با رجیستر PORT با اون ارتباط داشت و اگر به عنوان ورودی تعیین بشه باید به وسیله ی رجیستر PIN با اون ارتباط برقرار کرد ...

در خط بعد متغیر LData رو برابر با مقدار 0b00000001 قرار دادیم ، گفتیم که این متغیر اطلاعات پایه های پورت B رو نگهداری می کنه ، مقدار 0b00000001 یعنی اینکه پایه ی شماره ی 0 فعال بشه و اگر این متغیر رو با همین مقدار در PORTB قرار بدیم ، LED ای که به پایه ی صفر متصل هست ، روشن میشه .

خط بعد یک دستور Assembly هستش که فعلا اشاره ای بهش نمیکنیم ، فقط در همین حد بگم که دستور اسمبلی " cli " باعث غیر فعال شدن وقفه ها میشه ، بهتره وارد این بحث نشیم ، چون از حوصله ی این پست خارجه !

بعد از دستور اسمبلی میرسیم به حلقه ی While ، این حلقه بی نهایت اجرا خواهد شد ، در هر بار اجرا یک شرط چک میشه ، در این شرط مقدار SP که همون پایه ی صفر پورت C بود ( PINC.0 ) بررسی میشه ، اگر مقدارش یک بود ( اگر کلید فشرده نشده بود ) ، یعنی شرط برقراره و تابع LeftToRight اجرا خواهد شد ولی اگر مقدارش 0 باشه ، یعنی کلید فشرده شده و تابع RightToLeft اجرا خواهد شد ...

اما توابع LeftToRight و RightToLeft :
در این توابع مقدار LData رو تغییر داده و به PORTB اختصاص میدیم در تابع LeftToRight مقدار LData به این صورت تغییر میکنه :

LData = LData >> 1

عملگر " << " مقدار LData رو یک واحد به سمت راست شیفت میده ، یعنی به صورت زیر :

1. LData = 0b10000000
2. LData = 0b01000000
3. LData = 0b00100000
...
8. LData = 0b00000001

توجه کنید که در مرحله ی هشتم ، مقدار LData برابر با 0b00000000 یا 0 هست ، که در این لحظه باید مسیر دوباره تکرار بشه ، یعنی LData = 0b10000000
در تابع RightToLeft درست برعکس LeftToRight عمل میشه ، با این تفاوت که آخرین مقدار LData برابر با 128 میشه ، کمی روی این قسمت فکر کنید !

یک نکته ی دیگه که باید توجه بشه اینه که بعد از آخرین شیفت ، عدد یک به سمت مخالف میره ! ، یعنی چی ؟! ( کمی فکر کنید !! )

یک نکته : به نام توابع RightToLeft یا LeftToRight زیاد توجه نکنید !! ، اینکه LED ها از چپ به راست روشن بشن یا برعکس بستگی داره که از زاویه ای بهشون نگاه کنید !!

مرحله ی آخر Program کردن میکرو و قرار دادن اون روی Zif Socket هست ، بهتره یک Programmer و نرم افزار مخصوصش رو تهیه کنید و همراه داشته باشید ، اگر Programmer دارید ولی نرم افزاری برای Program کردن میکرو ندارید ، میتونید از خود CodeVision AVR استفاده کنید :

از منوی Settings گزینه ی Programmer رو انتخاب کنید ، در پنجره ای که باز میشه Programmer مورد نظرتون و شماره ی پورتی که به اون متصل هست رو مشخص کنید و OK ؤو بزنید ، بعد از بستن پنجره روی آیکن Programmer ( شبیه Chip مشکی ) بر روی نوار ابزار کلیک کنید تا صفحه ی مربوط به Program کردن میکرو باز بشه ، در این صفحه با کلیک بر روی Program All ، میتونید میکرو رو Program کنید .
البته پیشنهاد میکنم یک پروگرامر و به همراه نرم افزار جداگانه تهیه کنید ، اگر نرم افزار جدایی دارید ، باید فایل Hex درون پوشه ی پروژه و پوشه ی Exe رو در برنامه لود کنید و داخل میکرو بریزید ...

در پایان مدار نهایی همراه با میکروکنترلر به شکل زیر خواهد بود ، در هنگام نصب میکرو به مکان پایه ها دقت کنید ! :
---------------------------------------------------

---------------------------------------------------

یک دور پروژه رو از روی نمونه انجام بدید تا مطالب عنوان شده رو بهتر درک کنید ...

توجه ، برای این مدار شماتیک رسم نکردیم ولی احساس میکنم تصاویر و توضیحات کاملا گویا باشه و نیازی به شماتیک برای بستن مدار نباشه ...

به هر حال ، این پست می تونه نقطه ی شروعی باشه برای دوستانی که قصد ورود به دنیای میکروکنترلرها رو دارند ، امیدوارم مفید بوده باشه ، موفق باشید ...

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

مطالب اخیر

معرفی کانال و گروه های تلگرام
استفاده از Component Template ها در دلفی
مقاله : نحوه ی استفاده از پنل پیامک در نرم افزار
E-Book :: راه اندازی موتورهای DC و پله ای با استفاده از میکرو کنترلر AVR
آشنایی با عملگرهای بیتی ( Bitwise Operators )
تست دیود و ترانزیستور با مولتی متر
دلفی :: ارسال آرایه به حافظه ی Clipboard
یک سایت فوق العاده برای علاقه مندان به علم فیزیک
مداری برای نمایش عبور جریان برق از بدن !!
سال نو مبارک ...
آدرس وبلاگ !
ساخت یک LED فلاشر با میکروکنترلر AVR ATMega16A
آشنایی با کاربرد " رله " ( Relay ) در مدار
کار با ماتریسها در Matlab
SQL :: آشنایی با دستور شرطی WHERE


صفحات وبلاگ :