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

فرض کنید کلیدی رو به پایه ی 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 داره،  تغییر میکنه.به همین سادگی..

حمیدرضا مودت

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

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

2 پاسخ‌ها

  1. mehrdad گفت:

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

پاسخ دهید

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

از لوینیک حمایت کنید