الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

با سلام و عرض ادب خدمت هموطنان عزیز
در این سایت قصد داریم موضوعاتی که در حیطه الکترونیک ،مکانیک و برنامه نویسی ربات ها دارای جذابیت خاصی می باشد رو آموزش بدیم. امیدواریم که با نظرات شما عزیزان شاهد آموزشهای جامعی در این زمینه باشیم.
با تشکر

نویسندگان
پیوندهای روزانه
طبقه بندی موضوعی
آخرین نظرات

چهارشنبه, ۲ دی ۱۳۹۴، ۰۵:۴۴ ب.ظ

۰

پس از مدتها انتظار،مبحث برنامه نویسی رو آغاز میکنیم.

 

پس با ما در ادامه مطلب همراه باشید ...

به نام خدا

 

سلام

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

 

امروز داشتم به این قضیه فکر میکردم که چه حسیه که منو وادار میکنه تا بیام تو وبلاگ و این همه تایپ کنم و خودمو به آب و آتیش بزنم ؟!

 

خلاصه یه دستیه از غیب که منو میکشه تو این وادی !!!

دعا کنید که یه وقت اون دسته ما رو ول نکنه که خدای ناکرده دل و دماغ پست زدن رو از ما بگیره !

 

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

میدونم که بچه های این وبلاگ همه خودمونین و منم برای همینه که اینقدر راحت حرف دل میزنم !!!

 

خبر جدید رو هم که حتما دیدید !

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

پس بی زحمت برید عضو بشید و هرسوالی که به ذهنتون رسید رو اونجا مطرح کنید.

 

اما بریم سراغ کار خودمون !

رجیسترهای ورودی و خروجی یا همون GPIO رو بررسی کردیم و توضیحات مربوطه رو هم دادیم.

بعد اون روز تا حالا دیگه باید یادتون رفته باشه،پس بهتره که یه نگاهی دوباره بهش بندازید !

من دیگه توضیح نمیدمشون  !

 

پس اینجا توضیح بی توضیح ....

 

رجیسترهامون 8 بیتی بودند و هر بیت میتونست 0 باشه یا 1 .

اعداد باینری رو هم که همه میشناسیم و حساب،کتاب کردنشون رو هم بلدیم.

همچنین اعداد هگزا دسیمال رو !

 

اگه اینا رو نمیدونید چی هستن،حتما از کتابها یا جزوات درس مدار منطقی بخونیدشون !

منم توضیح نمیدم ! (آقا زور که نیست ؟! نمیخوام توضیح بدم ! laugh)

 

تصمیم داریم که یه رجیستر رو مقدار دهی کنیم.

مثلا فرض کنید میخوایم یک رجیستر با نام X که 8 بیتی هم هست رو،مثل شکل زیر مقدار دهی کنیم :

 

X :

0 1 1 1 0 1 0 1

 

 

خب؛رجیستر رو داریم مقداری هم که میخوایم بریزیم توش رو هم داریم،دعوا سر چیه؟ سر اینکه با چه فرمتهایی میشه مقدار دهی کرد،ببینید :

 

مقدار دهی باینری :

X=0b01110101;

 

مقدار دهی هگزادسیمال :

X=0x75;

 

در ضمن اون 0b و 0x هم جزو عدد نیستند،بلکه میخوان بگند که فرمت عدد چیه !


مثال :

فرض کنید میخوایم رجیستر ADMUX رو مقدار دهی کنیم :

(این رجیستر رو در بخش "مبدل آنالوگ به دیجیتال ADC در AVR ؟ [12]" بررسی کردیم،کاری هم باهاش نداریم فقط میخوام مثال بزنم !)

 

 

ADMUX :

0 1 1 1 0 1 0 1

 

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

 

مقدار دهی باینری :

ADMUX=0b01110101;

 

مقدار دهی هگزادسیمال :

ADMUX=0x75;

 

مقدار دهی با استفاده از عملگرهای بیتی :

ADMUX=((1<<MUX0)|(1<<MUX2)|(1<<MUX4)|(1<<ADLAR)|(1<<REFS0))

 

این آخریه بیشتر تکنیکه و از اینجور تکنیکها بازهم داریم !


خب،این تا اینجا ...

 

اما اصل بحث ما سر کارکردن با پورت های وروردی و خروجی بود !

پس بریم سراغ برنامه نویسی به زبان سی،البته تحت کامپایلر محبوب کدویژن :

 

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

پس اگه هنوز آمادگی ندارید،توصیه میکنم که خوندن ادامه این بخش رو به یه زمان دیگه موکول کنید تا گیج نزنید وسط بحث !!!
باز هم تقاضا میکنم از دوستان،که بلند پروازی رو کنار بگذارند و پست های قبلی رو مطالعه کنند و یاد بگیرند و بعد شروع به برنامه نویسی کنند !
از ما گفتن بود ...frown

 

قصد داریم که با کمترین دانش و اطلاعات یه LED رو توسط میکروکنترلر ATmega32 کنترل کنیم.
برای اینکه مطلب واضحتر باشه و بهتر بتونیم روی بحث پورت ها کنترل داشته باشیم،اسم پروژه رو میذارم "چشمک زن تک LED" ! 

 

دعوت میکنم که یه بار دیگه به اندام زیبای میکروکنترلر ATmega32 نطر بندازید ! :

 

 

برای روشن کردن LED لازمه که یه ولتاژ حدود 3 ولت بیفته دو سر LED مون !

اول از همه بگم که پایه شماره 10 یعنی VCC رو به +5 ولت و پایه شماره 11 یا 31 رو به زمین(0 ولت) وصل میکنیم.

 

میکروکنترلر با اعمال ولتاژ به پایه های مذکور راه میوفته (روشن میشه !).

 

پس اگه به یکی از پایه های میکرو بگیم که از خودت ولتاژ (5 ولت) بده !

 

که بهتره به جهت محدود کردن جریان و ولتاژ خروجی میکرو،از یه مقاومت هم استفاده کنیم !

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

اما 2 تا نکته :

اول اینکه تو شماتیک هامون منبع تغذیه متصل به میکروکنترلر و همچنین زمین رو نمیکشیم و بصورت پیش فرض،وصل شده در نظرشون میگیریم.

دوم هم اینکه از پایه PORTC.0 استفاده کردیم که این یه چیز دلبخواهیه و هر پایه ای که دوست داشتید رو میتونید انتخاب کنید.

 

حالا قراره یخورده با رجیسترها و پورتها وَر بریم و عملیات دلخواهمون رو انجام بدیم  :

 

1.پایه PORTC.0 باید بصورت خروجی تعریف بشه !

پس : مقدارِ بیتِ متناظر با این پایه در رجیستر DDRC باید 1 تعریف بشه ! (اینا رو که یادتونه ؟!!! )

 

2.برای روشن شدن LED و در واقع High شدن سطح ولتاژ روی پایه C0،باید مقدار بیت متناظر با این پایه در رجیستر PORTC برابر 1 تعریف بشه !

 

پس اول پایه C0 رو خروجی تعریف میکنیم و بعد دستور میدیم که ولتاژ بیاد روش !

 

لازم بذکره که فرکانس کاری میکرو رو در مبحث امروز بر روی 8 مگاهرتز تنظیم کرده ایم !

پس بسم الله ...

#include <mega32.h>
#include <delay.h>


void main(void){

DDRC=0x01;

while(1){

PORTC=0x01;
delay_ms(250);
PORTC=0x00;
delay_ms(250);
}
}

 

خب اینم از برنامه !

اما تشریح مختصر و مفید برنامه :

#include <mega32.h>

این کد مخصوص فراخوانی فایل سرایند ATmega32 هست و اطلاعات سخت افزاری میکرو داخل این فایل وجود داره.

 

#include <delay.h>

اینجا اومدیم و کتابخانه ای با نام delay رو فراخوانی کردیم که وظیفه اش ایجاد تاخیر زمانیه !

بزارید برای اولین و آخرین بار این کتابخونه رو یه توضیح در حد کاربرد بدم؛توضیح اینکه دو تا تابع داخل این کتابخونه هست :

  delay_us(time); و delay_ms(time);

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

 

DDRC=0x01; // ya : 0b00000001

اینو هم که توضیحشو دادیم؛پایه C0 رو خروجی تعریف کردیم.

 

while(1){}

این هم که معرف دوستان هست و بهش میگند حلقه بینهایت !

برای اینکه عملیات چشمک زدن بی نهایت بار تکرار بشه.

PORTC=0x01; // ya : 0b00000001

اینم توضیح دادیم؛داریم ولتاژ رو میندازیم رو پایه C0 .

 

delay_ms(250);

با این دستور هم میگیم که 250 میلی ثانیه صبر کن !

 

PORTC=0x00; // ya : 0b00000000

با این دستور هم میگیم که ولتاژ رو از روی پایه C0 بردار !

 

delay_ms(250);

با این دستور هم میگیم که 250 میلی ثانیه دیگه صبر کن !

 

این عمل متناوبا تکرار میشه و همون خاموش،روشن شدن LED رو در بر داره !

 

دقت داشته باشید که پروژه چشمک زن این جلسه با اون چشمک زنی که در بخش تایمر/کانتر ها مثال میزدم فرق داره !

اینجا فقط میخواستم یه مثال ساده و پیش پا افتاده براتون طرح کنم و مجبور شدم که اسم چشمک زن رو بیارم !

 

پروژه رو کامپایل کنید و بریزید رو میکرو و مدار رو روی برد بورد ببندید و نتایج رو با چشم خودتون ببینید تا بیشتر سر کیف بیاین !

 

حالا برای تمرین بیشتر،پایه میکروکنترلر رو تغییر بدید و به جای C0 مثلا ببریدش روی A5 !

یا حتی چندتا LED بزارید به جای یه LED !

 

سعی کنید از دوووگوله مغزتون بیشتر استفاده کنید !!! Laughing

 

خب.

کاری که تا حالا کردیم،این بود که اومدیم از یکی از پین های میکرو ولتاژ گرفتیم(همون خروجی ...).

اما اگه خواستیم یکی از پین هامون رو به صورت ورودی تعیین کنیم چی ؟

 

1.مقدار بیت متناظر با پین مورد نظر رو در رجیستر DDRC برابر با 0 قرار میدیم.

2.اگر مقدار بیت مورد نظر در رجیستر PINC برابر 1 شد،یعنی ورودی +5 ولت داریم و اگر مقدار بیت 0 شد،یعنی ورودی نداریم !

 

مثلا : (همون مثال بالایی برای پایه C0 )
توجه : اینجا دیگه LED نداریما ! یعنی هیچی نداریم !!!

یه میکرو داریم که پایه C0 اونو به عنوان ورودی تعریف میکنیم و چک میکنیم که اگر مقدار این پایه برابر 1 منطقی شد،کاری رو برامون انجام بده !

#include <mega32.h>

void main(void){
DDRC=0x00;
if (PINC==0x01){
  // Codes
}
}

الان اوضاع چجوریاست ؟

 

DDRC=0x00;

همه پایه ها رو بصورت ورودی تعریف کردیم !(قبلا هم گفتم که در حالت پیشفرض تمامی پایه های میکروکنترلر روی حالت ورودی تنظیم شده اند.)

if (PINC==0x01){
  // Codes
}

یه شرط هم گذاشتم،که اگه مقدار پین C0 ولتاز +5 ولت بهش وارد شد (مقدارش یک منطقی شد) فلان کار (//Codes ) رو انجام بده !

در مورد حالت ورودی،مثالی ساده تر از این نمیشه زد !

حالت ورودی هم،استفاده های خاص خودشو داره و باید درگیر بشید با میکرو تا بتونید کامل یادش بگیرید.


منبع : www.noise.blog.ir

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی