وقفه ها در آردوینو – آموزش آردوینو جلسه هشتم

فرض کنید کلیدی رو به پایه ی INT0 وصل کردیم  و وقتی که کلید وصل شد میخوایم یک LED رو روشن کنیم ، راه اولی که به ذهن همه میرسه اینه که به شکل مداوم مقدار  کلید رو بخونیم و بعداز زده شدن کلید ، زیربرنامه روشن شدن led رو اجرا کنیم.این کار باعث میشه ما نتونیم کارهای دیگه رو به شکل همزمان اجرا کنیم و درواقع منتظر تغییر وضعیت کلید میمونیم .اما خب یک راه بهتری هم هست اونم استفاده از وقفه ها در آردوینو هستش. توی این روش پردازنده برنامه ی اصلی رو اجرا میکنه و هرموقع کلید زده شد برنامه اصلی رو موقتا متوقف میکنه و میره سراغ زیر برنامه ی روشن شدن led که به این زیربرنامه ، زیربرنامه ی وقفه میگن. توی آردوینو این پایه ها با اسم های INT0 , INT1 , … ,INT5 مشخص شدن که توی بردهای UNO که میکروی ATMEGA328  داره پایه های دیجیتال 3 و 2 این حالت رو دارن.
پایه های اینتراپت در برد های آردوینوِ دیگه هم به شرح زیره:

نوع برد int.0 int.1 int.2 int.3 int.4 int.5
Uno, Nano, Mini , Ethernet 2 3        
Mega, Mega2560, MegaADK 2 3 21 20 19 18
Leonardo ,Micro (32u4 based) 3 2 0 1 7  
Due All pins

توابع وقفه ها در آردوینو

تابع attachInterrupt

برای اختصاص دادن پایه ها به وقفه ها استفاده میشه:

پارامترهای تابع بصورت زیر تعریف میشن:

interrupt:  شماره ی وقفه
مثلا وقتی وقفه رو 1 میزارین و بردتون uno ، پایه ی انتخاب شده برای وقفه ،پایه ی شماره ی 3 بردتونه.

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

mode: حساسیت پایه ی وقفه رو تنظیم میکنه و 4 حالت داره (به این معنی که چه اتفاقیو بعنوان وقفه به میکرو گوش زد کنه؟)

  1. LOW: وقتی که سطحی پایین در پایه ی وقفه ایجاد بشه ، وقفه رو درخواست میده
  2. CHANGE: وقتی که سطح منطقی در پایه ی وقفه تغییر میکنه وقفه رو درخواست میده
  3. RISING : وقتی لبه ی بالارونده در پایه ی وقفه ایحاد میشه
  4. FALLING :وقتی که لبه ی پایین رونده ای در پایه ی وقفه ایجاد میشه

یک نکته در رابطه با وقفه ها در آردوینو :
یک نکته این که توی تابع یا زیرروال وقفه ، تابع delay() عمل نمیکنه، و اینکه مقدار برگشت داده شده با تابع miliis() هم افزایش پیدا نمیکنه و از همه ی نکته هامهم تر چیه؟ اگه گفتین؟:D
اینکه هر متغیری که توی زیرروال وقفه تعریف میکنیم باید حتما از نوع volatile  تعریف بشه.

تابع interrupts  و noInterrupts

جدی جدی داشت یادم میرفت که این رو هم بگم ! بعضی وقتا توی برناممون وقفه داریم اما بعضی از قسمت های برنامه ی اصلی از لحاظ زمانی حساس هستن و نباید بینشون وارد زیرروال بشیم. (باید پشت هم و بدو وقفه زمانی اجرا بشن) این جور مواقع میشه از دستور ()noInterrupts  استفاده میکنیم، اینطوری تا وقتی که به ()interrupts نرسیده باشیم هیچ وقفه ای کار نمیکنه و برنامه اجرا میشه و بعد وقتی اون بخش حساس و مهم رد شد دوباره وقفه هارو با دستور interrupts()  فعال میکنیم.

خب حالا که فهمیدیم اصول چیه ، بریم سراغ مثال این جلسه :
قراره یک کدی بنویسیم که وقتی تغیری سطح منطقی روی پای ی وقفه ی 0 اتفاق افتاد(یعنی باید mode رویCHANGE باشه) حالت پایه ی 13 رو معکوس کنه.

الان اگر وضعیت INT0 یا همون پایه ی 2 از صفرمنطقی به یک منطقی تغییر پیدا کنه ، وضعیت پایه ی 13 که LED داره،  تغییر میکنه.به همین سادگی..

حمیدرضا مودت

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

شما ممکن است این را هم بپسندید

16 پاسخ‌ها

  1. احمد گفت:

    سلام ممنون از آموزشهاتون من هم بعد از 20سال کار با میکرو جدیدا برد آردوینو گرفتم هر چند از سادگی خیلی خوشم نمیاد (چون بعضی وقتها سادگی هزینه بالایی رو به آدم تحمیل می کنه)ولی به هر حال یک تجربس . توی جوابی که به دوستمون جناب آقای بهمن فرموده بودید نوشتین که حتما باید بوت لودر روی میکرو باشه. من توی منوی Sketch یک گزینه داره به نام پروگرام از طریق پروگرمر های مرسوم AVR ، آیا با این کار هم باز باید از بوت لودر استفاده بشه؟.
    ممنون از زحمات شما
    موفق باشید

    • سلام ، پس استاد ما هستین شما! 🙂
      بله برای تجربه قطعا خوبه .
      اما درباره ی سوالتون باید خدمتتون عرض کنم که بدون بوت لودر آردوینو کار نمیکنه!
      در منوی Sketch ، گزینه upload using programmer برای آپلود کد از طریق 6 پین ICSP روی برد هستش.یعنی بدون کابل یو اس بی ولی خب باید حتما بوت لودر وجود داشته باشه.(بوتلودر رو از همین روش هم میشه ریخت)
      انواع پروگرامر ها هم در بخش tools وجود دارن ، اون برای اینه که پروگرامری که به کامپیوتر وصل شده رو انتخاب کنین تا بوتلودر روی میکرو توسط کلید آخر منوی تولز به اسم burn bootloader بریزین.
      سپاس . آرزوی موفقیت برای شما..

      • احمد گفت:

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

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

  2. mahmoud گفت:

    ba tashakor az amozeshe khobeton, mikhastam beporsam chetori mishe signale khubi roye pin 3 arduino az 1 Hz ta 100 kHz tolid konam? age betunid komakam konid kheyli mamnoon misham

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

      • mahmoud گفت:

        merci az javabetun, man mobtadi hastam va ba zabane c ashnaie kami daram. ta hala tonestam bakomake timer2 singanlhai ro besazam ke paeentarinesh 244,14Hz va balatarinesh 62500Hz mohasebe va andazegiri mishe. faghat mitunam az timer2 estefade konam chon baghie pinha bekhatere estefade az display adafruit eshghale. mikhastam beporsam dorei hast ke betunam in rizekariharo yad begiram? bebakhshid man nemitunam be farsi type konam. ba tashakor

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

  3. بهمن گفت:

    سلام و روز بخیر…..و با یه عالمه تشکر و آرزوی تندرستی و موفقیت برای شما
    هر روز که با آردوینو کار میکنم بیشتر بهش علاقمند میشم. اما این وسط چندتا سوال برام پیش اومده که زحمت پاسخشو میدم به شما:
    1- آیا در میکروهای آردوینو firmware از قبل قرار گرفته ؟ ینی تولید کننده بردهای آردوینو درشون برنامه هم ریخته یا همه میکروهای آردوینو کاملا خام هستن؟
    2- توابع تایمر و اینتراپتهای اونو جایی ندیدم اگه میشه در موردش توضیح بدید.
    3- فراخوانی توابع رو هم لطفا مثال بزنید.
    من سالهاست که با کدویژن و انواع میکرو پروژه های خودمو نوشتم و دارم کار میکنم و یکم ذهنم هنوز توی کد ویژن قل میخوره….ARM هم کار میکنم اما با آردوینو احساس بهتری دارم….
    امیدوارم به نوبه خودم بتونم این نیت خاصانه و زحمات شما رو جبران کنم.

    • سلام . ممنون از لطفتون 🌹
      1-بقول شما خام “خیر نیستن “، روشون بوت لودر وجود داره .
      2-اینتراپتو هم که توضیح دادم در همین پست. خیلی ساده میتونین با همین چند دستور داخل مطلب ازش استفاده کنین.دنبال پیچیدگی توی آردوینو نباشین ! اومده که همه چیو ساده کنه 😉
      درباره ی تایمر هم ان شاا.. پست بزارم.
      3-مثل زبون سی هستش دیگه ،فرقی نداره . توی اینتراپت ها هم مثالش هست. تابع void blink یک نمونشه. اما بزودی یک مطلب هم برای تابع ها در بخش آموزش زبان C میزارم و کامل توضیحش میدم.
      آردوینو شیرینه چون سادس ، کسی که کدویژن بلد باشه یکی 2 هفته ای آردوینو رو یاد میگیره !
      موفق باشی ، ما مخلصیم 😀

      +2 مطلبی که ارسال کردین فایل همراهش ارسال نشده.zip کنین راحت تر آپلود میشه

      • بهمن گفت:

        ممنون از این پاسخ سریع!…در مورد بوت لودر : من میخوام کلی کد نویسی کنم و بعدا از بردهای پروگرام شده بعنوان محصول توی دستگاههام استفاده کنم اما نمیخوام کسی که درب دستگاه رو باز میکنه آردوینو ببینه! برای همین وقتی برنامه هام ( کد نویسی)فیکس شد باید برد اختصاصی برای دستگاههام بزنم و اینجاست که با بوت لودر مشکل پیدا میکنم.پیشنهاد شما چیه؟

        • بوت لودر رو روی میکرو بریزین و استفاده کنین. بوت لودر چیز خاصی نیست. ریختنش روی میکرو هم 1 دیقه زمان میبره.
          یا میشه بعد از ریختن کدتون روی برد، میکرو رو از روش بردارین و داخل پروژه تون استفاده کنین. فقط توی پروژتون باید از کریستالی استفاده کنین که روی برد آردوینو وجود داره و تغذیه مناسب بهش بدین.

  4. بهمن گفت:

    سلام مهندس….خیلی دقیق توضیح میدید….واقعا بچه های این مملکت نیاز دارن که دانش رو با هم به اشتراک بذارن تا روزی این کشور از غبار خاکستری خارج بشه…ممنونم از زحمتی که میکشی….خسته نشی یه وقت…هنوز راه طولانیه

  5. mehrdad گفت:

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

پاسخ دهید

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