آموزش AVR با کدویژن قسمت 4 دستورات کنترلی


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

دستورات کنترلی چیست؟

دستورات کنترلی به طور کلی کد هایی هستند که به کمک آنها می توان مقدار متغییر یا مقدار یک پایه و … بررسی کرد

چهار دستور شرطی  مهم زبان C

if   ,   while  , for  , switch

دستور if:

به صورت زیر نوشته می شود:

if (شرط) {

مجموعه دستورات;

}

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

if(i==5){

PORTA.0=1;

PORTC.0=0;

}

کد بالا یررسی می کند که اگر مقدار متغییر i برابر 5 باشد پورت صفر A را روشن و پورت 0 C را خاموش میکند مثال دیگر:

if (PIND.1==1PORTA.0=1;

حالت های دیگر دستور if:

if (شرط) {

مجموعه دستورات1;

} else {

مجموعه دستورات2;

}

در کد بالا اگر شرط درست باشد مجموعه دستورات 1 اجر می شود و اگر شرط غلط باشد مجموعه دستورات 2 اجرا خواهد شد.

if انشعابی بدون else پایانی:

if (شرط1) {

مجموعه دستورات1;

} else if ( شرط 2) {

مجموعه دستورات2;

}

else if ( شرط 3) {

مجموعه دستورات3;

}

…..

در کد بالا اگر شرط1 درست باشد مجموعه دستورات 1 اجر می شود اگر شرط2 درست باشد مجموعه دستورات 2 اجر می شود اگر شرط3 درست باشد مجموعه دستورات 3 اجر می شود و الی آخر

if انشعابی با else پایانی:

if (شرط1) {

مجموعه دستورات1;

} else if ( شرط 2) {

مجموعه دستورات2;

}

else if ( شرط 3) {

مجموعه دستورات3;

}

…..

esle{

مجموعه دستورات else

}

در کد بالا اگر شرط1 درست باشد مجموعه دستورات 1 اجر می شود اگر شرط2 درست باشد مجموعه دستورات 2 اجر می شود اگر شرط3 درست باشد مجموعه دستورات 3 اجر می شود و الی آخر و اگر هیچ شرطی درست نباشد مجموعه دستورات else اجرا خواهد شد.

 دستور while:

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

while (شرط) {
مجموعه دستورات;
}

یا

while (شرط)
یک دستور;

همانطور که مشاهده کردید در کد های بالا اول شرط بررسی می شود سپس در صورت درست بودن شرط دستور یا دستورات اجرا می شود پس اگر شرط درست نباشد هیچ دستوری اجرا نمی شود.دستور while حالت دیگری هم دارد که یک بار مجموعه دستورات را اجرا سپس شرط را بررسی کرده و اگر شرط درست باشد حلقه تکرار می شود این حالت بصورت زیر نوشته می شود:

do{
مجموعه دستورات;
} while ( شرط );

یا

do
یک دستور;
while ( شرط );

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

در قسمت های قبلی هم دید که اگر به جای شرط عدد یک قرار دهیم حلقه while به تعداد بی نهایت بار تکرار خواهد شد چون عدد یک به معنای درست بودن شرط می باشد.

برای خارج شدن از حلقه چه بی نهایت باشد چه محدود می توان از دستور break بصورت زیر استفاده کرد:

break;

اگر بخواهیم در یک حلقه در بین مجموعه دستورات ، برخی دستورات اجرا نشده و حلقه از اول شروع شود از دستور continue استفاده می شود.

while (1) {
دستور 1;
دستور 2;
دستور 3;
continue;
دستور4;
….
}

در مثال بالا دستورات 1 تا 3 اجرا شده و حلقه دوباره از اول اجرا می شود یعنی در کد بالا دستور 4 و دستورات بعد آن هیچ وقت اجرا نخواهد شد.

دستور for:

دستور For یک دستور کنترلی شمارنده است و در عمل کمی شبیه به دستور قبلی یعنی while می باشد این دستور به صورت زیر نوشته می شود:

for(گام شمارش;شرط شمارش;مقدار اولیه شمارش){
مجموعه دستورات;
}

توضیح:هنگام اجرای دستور بالا مقدار اولیه شمارش در متغییر مورد نظر قرار گرفته سپس شرط حلقه بررسی می شود و اگر درست باشد مجموعه دستورات حلقه اجرا می شود با هر بار اجرا شدن حلقه با توجه به گام حلقه مقدار متغییر تغییر یافته و همین طور ادامه می یابد مثال:

for( i=1 ; i<=10 ; i++){
مجموعه دستورات;
}

در مثال بالا مقدار متغییر i برابر 1 میشود سپس شرط بررسی می شود که آیا مقدار i کمتر و مساوی 10 باشد سپس مجموعه دستورات اجرا می شود بعد از هر بار اجرا به مقدار i با توجه به گام حلقه (++i) یک واحد افزوده می شود پس مجموعه دستورات حلقه فقط 10 بار تکرار خواهد شد مثال دیگر:

for( i=1 ; i<=10 ; i=i+3){
i–;
PORTA.0=1;
delay_ms(500);
PORTA.0=0;
delay_ms(500);
}

در دستورات بالا پورت A.0 چند بار روشن خواهد شد؟

i=1    دستورات یک بار اجرا می شود  > i-1=0

i+3=3   دستورات یک بار اجرا می شود  > i-1=2

i+3=5   دستورات یک بار اجرا می شود  > i-1=4

i+3=7   دستورات یک بار اجرا می شود  > i-1=6

i+3=9   دستورات یک بار اجرا می شود  > i-1=8

i+3=11   شرط برقرار نبوده و حلقه پایان می یابد

پس در کل دستورات 5 با اجرا شده و پایه مربوطه 5 بار روشن و خاموش می شود.

دستور switch:

switch ( عبارت ) {

case   مقدار اول:
مجموعه دستورات اول ;
break;

case   مقدار دوم:
مجموعه دستورات دوم ;
break;
.
.
.

default:
مجموعه دستورات

}

دستور switch مقدار عبارت را با مقدارهای مقابل case مقایسه کرده و با هر case برابر باشد مجموعه دستورات مربوطه آن را اجرا می کند و اگر مقدار عبارت با هیچ کیسی برابر نباشد مجموعه دستورات default اجرا خواهد شد . قسمت default اختیاری می باشد و میتوان آن قسمت را حذف کرد

مثال:

m=12;

m++;

switch (m){

case 12:
PORTA.5=1;
break;

case 13:
PORTA.6=1;
break;

}

نتیجه عبارت بالا روشن شدن پایه A.6 می باشد زیرا مقدار اولیه m برابر 12 می باشد سپس یک واحد افزوده شده و دستور switch  کیس دوم را انتخاب و اجرا خواهد کرد.

قسمت بعدی آموزش ها شامل چند پروژه آموزشی مربوط به قسمت های 1 تا 4 خواهد بود.


45 پاسخ به “آموزش AVR با کدویژن قسمت 4 دستورات کنترلی”

  1. سلام
    سال نو مبارک
    واقعا اموزشتون عالیه مخصوصا با فیلمها یی که توسایتتون قراردادین وباپروتئوس هم شبیه سازی کردین راحترمتوجه میشم
    امیدوارم هرچه زودتر ادامه بدین بابت همه زحماتتون ممنون وخسته نباشید.

    • سلام سال نو شما هم مبارک
      به علت مشغله کاری زیاد نمیتونم آموزش ها رو سریع ادامه بدم ولی سعی میکنم آموزش ها ادامه داشته باشه و کامل بشه

  2. سلام.
    خیلی عالیه.لطفا در مورد برنامه نویسی LCD و اینکه کاراکترها و متغیرهارو در محیط کد ویشن کجا وارد کنیم و مثال های کاربردی دیگه مثل شمارنده رو هم آموزش بدین

  3. با سلام و تشکر از زحماتتون
    من به دلیل اینکه برای پروژه ام به یادگیری این برنامه نویسی به شدت نیاز دارم خواهش می کنم هر چه سریع تر ادامه قسمت ها رو در سایت قرار بدید . با تشکر فراوان

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

  5. سلام
    واقعا از حوصله ای که به کار بردی برای نوشتن این مطالب باید تشکر کرد .
    اگر کمکی خواستی (در رابطه با AVR)دوست دارم کمکت کنم ، چون من خیلی سختی کشیدم تا تونستم یاد بگیرم .
    ای کاش منهم همچین مطالب که ساده و روان توضیح میدن رو داشتم.

  6. سلام مهندس
    خیلی ممنون از مطالب عالی سایتتون
    من کلی کتاب برای avr به زبان c خریدم اما حوصله م نکشیده بود بخونم.
    در این ۹ تا آموزش سایت شما علاقمند شدم و شروع کردم
    هدفم از یادگیری میکرو ساختن یک بالابر ساده سه طبقه با avr هست

    تقریبا همه چیزی که نیاز بود گفتین. فقط مونده وقفه رو یاد بدین. کلید اضطراری که هر وقت زده بشه کلا موتور بالابر بایسته.
    اگه برنامه شو بنویسین. یا پروژه شو بذارین خیلی عالی میشه
    بازم ممنون

    • سلام ممنون
      در مورد باید بگم که در طراحی مدارتون باید نهایت دقت و ایمنی رو در نظر بگیرید چون avr قابل اعتماد نیست و نویزپذیری زیادی داره
      آموزش وقفه ها هم بزودی منتشر میشه

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

    من یه سوالی داشتم
    میخوام یه پورت رو . مثلا پورت B که پین هاش متصل به هشت تا ورودی (سنسور) هستن و در حالتهای مختلف تعدادی ازشون یک میشه و این پورت مقدارش عدد خاصی میشه. عدد این پورت رو به یه متغیر بریزم
    چجوری بنویسم کدشو؟

      • خیلی ممنون. این کار و نکرده بودم نمیدونستم به این راحتیه
        ضمنا بالا در مورد نویز پذیری avr گفتین و لزوم امنیت مدارم
        تو محیط غیر صنعتی نویز میتونه اشکال ایجاد کنه. و سوال دیگه م اینکه برای مقابله با نویزپذیری این میکروکنترلر چه راه هایی هست. منابعی سراغ دارین مهندس

        • به محیط صنعتی غیر صنعتی زیاد ربطی نداره مثلا اگه سیم حامل جریان بالا نزدیک AVR تون جریانش کم و زیاد بشه میکرو ریست میشه.
          واسه نویزپذیری قسمت قدرت رو جدا کنید و دورتر از میکرو قرار بدید و همچنین از avr های جدید استفاده کنید وبحث های تخصصی دیگه ای که منابعش تو اینترنت هست سرچ کنید.

      • ضمنا نوشتین i مساوی پین B یعنی به بیتشو برمیداره؟ بذارم مساوی با پورت B اون وقت میشه یه بایت؟

        • وقتی مینویسین i=PINB مقدار کل پورت که میشه یک بایت براتون برمیگردونه.
          در ضمن دو خط برنامه بنویسید میتونید سریع تست کنید 🙂 🙂

          • خخخخخخ بازم خیلی مرسی
            راستی آرم خیلی فرق داره با avr ؟ کاش بعد ازین آموزش آرم با نرم افزارهای خودشو هم بذارین خخ

          • ARM و AVR که معلومه خیلی فرق داره ولی چون زبان سی رو یاد گرفتید راحت می تونید ARM رو شروع کنید

  8. سلام
    دو تا سوال داشتم :
    چطور میتونم در زبان C به یک بیت از یک متغیر دسترسی پیدا کنم و اونرو صفر یا یک کنم ؟
    و دیگر اینکه چطور به بایت با ارزش تر یا کم ارزش تر یک متغیر ۱۶ بیتی دست پیدا کنیم و بتوانیم آنرا مقدار دهی کنیم ؟

    • برای یک کردن یک بیت بصورت زیر:
      فرض کنیم مقدار r بصورت مقابل باشد r=0b0010000
      با این عمل r |= 0b100 یا r = r | 0b100
      که در این حالت خروجی برابر خواهد بود ۰b0010100
      صفر کردن نیز r &= 0b10000
      حال یه متغییر ۱۶ بیتی داریم r = 0xf123
      برای برگرداندن بیت های پرارزش m = r >> 8 که m برابر به مقدار ۰xf1 خواهد بود
      برای برگرداندن بیت های کم ارزش n = r & 0xff که N برابر به مقدار ۰x23 خواهد بود

      • سلام
        ممنون از پاسختون
        قسمت دوم رو فهمیدم .
        قسمت اول رو اگه میشه بیشتر توضیح بدین
        من میخوام یک بیت از یک متغیر ۸ بیتی رو برابر با یک متغیر دیگه که یک واحد از یک آرایه است قرار بدم .
        مثلا بیت سوم متغیر CNT برابر بشه با جزء دوم آرایه ROOT
        من چون قبلا با پیک بیسیک کار می کردم و تازه اومدم با C کار میکنم مشکل زیاد دارم .
        تو پیک بیسیک اینطوری مینوشتم :
        [CNT.3 = ROOT[2

  9. من میخوام یک بیت از یک متغیر ۸ بیتی رو برابر با یک متغیر دیگه که یک واحد از یک آرایه است قرار بدم .
    مثلا بیت سوم متغیر CNT برابر بشه با جزء دوم آرایه ROOT
    من چون قبلا با پیک بیسیک کار می کردم و تازه اومدم با C کار میکنم مشکل زیاد دارم .
    تو پیک بیسیک اینطوری مینوشتم :
    [CNT.3 = ROOT[2
    می خواستم بدونم معادل این دستور در C به چه شکل است .

  10. سلام ممنونم از سایت خوبتون
    روی بریدبورد آی سی مگا ۸ و دوتا پوشباتون یا تک سوئیچ و یک led نصب کردم
    همچنین یک ترانزیستور با رله ۱۲ ولت به هم درایو شدن (ترانزیستور و led به ترتیب به پورت d7 و d6 میکرو وصل هستن)
    چه کدی بنویسم تا با فشردن سوئیچ ۱ پورتd7 یک منطقی شود و پورت d6 به صورت چشمک در بیاید.( میشه گفت led تقریبا حکم چراغ سیگنال یا راهنما را ایفا میکند.)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *