به نام خدا!

سلام دوستان امیدوارم حالتون خوب باشه!

خوب در این بحث میخوام برنامه نویسی مبتدی رو توضیح بدم تا خوب یاد بگیرید!

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


دانلود کتاب های مبتدی


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

خوب این کد رو توسط برنامه کدویژن بنویسین اگر نمیدونید پورت و DDRA چی هست میتونید به مطالب قبلی مراجعه کنید!

یه توضیح هم الان بدم بهتره....!

متن سبزه که نوشته #include برای فراخوانی کتابخانه است که ما در اینجا کتابخانه میکرو کنترلر atmega32 رو فرخوانی کردیم!

در خط بعد تابع اصلی نوشته میشه که معمولا ثابت هست توی خط بعد هم که نوشته DDRA.0=1 به این معنیه که پین اول یا پایه اول پورت A رو خروجی قرار بده و اگه مساوی با صفر باشه ورودی میشه که بحثش جداست.! خط بعدی که پورت هست هم برای فعال کردن پایه هست یعنی اینکه با این کد ولتاژ توی پایه میره در اینجا هم 1 به معنی فعال و 0 به معنی غیر فعال هست!

#include <mega32.h>

void main(void){

DDRA.0=1;

PORTA.0=1;

}

بعد برید توی برنامه پرتئوس اونجا یه LEd و Atmega32 بسازید و یک سیم از LED به پایه اول پورت A وصل کنید! منبع تغذیه هم یادتون نره!

حالا موفقیت خودتون رو ببینید....!

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

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


#include <mega32.h>
#include <delay.h>//کتابخانه تاخیر
//تابع اصلی را اضافه میکنیم
void main (void){
DDRA.0=1; // را خروجی تعریف کردیم A.0 پورت
while(1){ // حلقه بینهایت
        PORTA.0=1; //روشن
          delay_ms(1000); // تاخیر به مدت 1000 میلی ثانیه یا 1 ثانیه
          PORTA.0=0; //خاموش
          delay_ms(1000); // تاخیر
           //تکرار حلقه
          }
}

در خط اول فایل هدر میکروکنترلر مورد نظر را اضافه می کنیم

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

در خط بعدی تابع اصلی را اضافه میکنیم سپس در خط بعدی پایه اول (بیت صفرم ) پورت A را خروجی تعریف کرده ایم

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

while(1){

}

حلقه است که همیشه درست است و تا زمانی که از دستور break استفاده نشود این حلقه تکرار خواهد شد

در خط بعدی پایه A.0 را روشن میکنیم در خط بعدی از تابع delay_ms استفاده کرده ایم این تابع برنامه را به مدت عددی که داخل آن نوشته شده است (میلی ثانیه) نگه می دارد مثلا برای ایجاد تاخیر 2 ثانیه ای باید مقدار 2000 را در این تابع بنویسیم این تابع یکی از توابع فابل کتابخانه ای delay.h است که در اول برنامه اضافه کردیم این فایل کتابخانه ای تابع دیگری نیز دارد که به مقدار میکرو ثانیه تاخیر ایجاد می کند...!


حالا فرض کنید میخوایم به جای یک ال ای دی دو تا LED استفاده کنیم! اصلا برای محکم کاری هشت تا LED استفاده میکنیم!

حالا توی پرتئوس هشت تا LED درست کنید و همه رو به پورت A یعنی از PA0 تا PA7 وصل کنید!

حالا دوباره به کدویژن برید میخوایم یه کاری کنیم 8 تا ال ای دی همزمان روشن باشه چکار میکنیم...!

باید بیایم بگیم

DDRA.0=1;

DDRA.1=1;

DDRA.2=1;

DDRA.3=1;

DDRA.4=1;

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

PORTA.0=1;

PORTA.1=1;

PORTA.2=1;

// و غیره
delay_ms(1000);

PORTA.0=0;

PORTA.1=0;

PORTA.2=0;

// و غیره

delay_ms(1000);

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

ما با یک کد میگیم همه پایه های پورت A رو خروجی کن همچنین با یک کد میگیم همه ی پایه ها رو روشن کن بعد با یک کد میگیم همه رو خاموش کن!

چجوری؟ اینجوری!

به جای اینکه دونه،دونه بگیم این رو خروجی کن و این رو خروجی کن و... توی یه کد میگیم 

DDRA=0b11111111;

با اینکار تمام پورت ها رو که هشت تا هستن 1 قرار دادیم که خروجی باشن شما میتونین هر کدوم رو صفر کنید تا ورودی شن!

حالا برای پورت هم میتونیم بنویسیم!

PORTA=0b11111111;

delay_ms(1000);

PORTA=0b0000000;

delay_ms(1000);

اینجوری همه چراغ ها همزمان روشن میشه همزمان خاموش میشه!

شمام دارید به چیزی که من فکر میکنم فکر میکنید! یعنی میخواید که مثلا چراغ ها یکی در میون روشن شن و دوباره اون یکی ها که خاموشن، روشن شن یا برای بار اول فقط 4 تا اولی روشن شن و برای بار دوم 4 تا دومی ها روشن شن برای همین باید اینکار رو بکنید!

PORTA=0b11110000;

delay_ms(1000);

PORTA=0b11110000;

delay_ms(1000);

اینجوری در هر ٍانیه چهار تا اولی و در ثانیه بعد چهارتا دومی روشن میشن و 4 تا اولی خاموش میشن همینجوری ادامه داره

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

PORTA=0b10101010;

delay_ms(1000);

PORTA=0b01010101;

delay_ms(1000);

PORTA=0b11110000;

delay_ms(1000);

PORTA=0b11110000;

delay_ms(1000);

در کد بالا در ثانیه اول یکی در میان روشن میشن مثلا لامپ های 1-3-5-7 شن میشن بعدش اینا خاموش میشن لامپ های 2-4-6-8 روشن میشن بعدش 4 تا اولی و بعدش 4 تا آخری روشن میشن...!

اگه بخوایم اینجوری ادامه بدیم خیلی طولانی میشه برای همین باید ارایه بنویسیم!

کد زیر یک کد کامل ال ای دی هست

#include <mega32.h>

#include <delay.h>

void main(void) {

 unsigned char led[]={0b10101010,0b01010101,0b11110000,0b00001111,0b11111111};

  int a;

DDRA=0xFF;

while (1) {

   for (a=0 ; a<=3 ; a=a+1)

    {  

     PORTA = led[a];

     delay_ms (100);

    };

    }

}

در کد بالا اگه با مشکل مواجه شدین و LED ها پیدا نشدن زمان رو از 100 به 1000 تغییر بدین!

خوب طبق کد بالا DDRA=0xFF همون کد DDRA=0b11111111 خودمون هست که با هگزا نوشم! خیلی سریعتر و راحت تر!

در کد بالا بعد از اینکه کتابخونه رو نوشتیم و تابع اصلی رو نوشتیم آرایه ای به نام led تعریف کردیم! بعد همه پورت A رو خروجی تعریف کردیم و در حلقه While یک شرط for گذاشتیم که اینو تا وقتی شرط درسته انجام میده! یعنی میگه ما یه متغییر a داریم که صفر هست بعد میگیم کوچیک تر یا مساوی عدد 3 هست بعد میگیم اگه اینطور بود و عدد کوچیک تر مساوی 3 بود یک واحد به ان اضافه کن!
حالا فرض میکنم عدد a صفر هست در اول میاد توی for میگه اگه a مساوی صفر هست پس پورت هم اینجوریه!
PORTA = led[0];
برید بالا آرایه رو نگاه کنید اسمش led هست 0b اول میشه 0 دومیش میشه 1 سومیش میشه 2 چهارمیش میشه 3 حالا چون ما صفر هست اولی رو میاره یعنی این شکلی میشه
PORTA=0b10101010;
بعدش توی for میره به 0 یه واحد اضافه میکنه میشه 1 بعد پورت هم میره روی بعدی و به همین ترتیب ادامه پیدا میکنه!
امیدوارم فهمیده باشید و این آموزش براتون مفید باشه!
یه نکته نزدیک بود یادم بره!
اگر یادتون باشه
گفتم که میتونید یه جایی اینکه هر پایه رو به صورت جدا خروجی کنید همه رو با هم با این کد خروجی کنید
DDRA=0b11111111;
این کد یک عدد باینری هست و برای ساده نویسی و زیبایی همچنین برای برنامه نویسی بهتر میتونید از کد زیر استفاده کنید!

DDRD=0xff; 
این عدد یک عدد هگز است که اگر به باینری تبدیلش کنیم همون میشه!
اگر هم میخواستید همه رو روشن کنید میتونین از همین کد برای پورت استفاده کنید! یعنی بدین صورت!
PORTD=0xFF;
برای خاموش کردن همه یا ورودی کردن همه میتونین صفر بزارین مثلا
PORTD=0x00;
یا
DDRD=0x00;
فرقی نداره مهم عددی هگزا دسیمال هست
راستی برای تبدیل اعداد باینری و هگزا و دهدهی یا همون دسیمال یه برنامه سفارش دادم که خیلی راحت اعداد رو تبدیل کنه!
منتظر باشید امروز فردا تموم میشه...!
نظریادتون نره دیگه خسته شدم از بس نوشتم!
فعلا یا علی...