وقفه ها در آردوینو

وقفه ها در آردوینو ،وقفه ها باعث توقف در اجرای برنامه آردوینو می شوند و معمولا علت آن رسیدگی به یک کار یا وظیفه مشخص است.

وقفه ها در آردوینو

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

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

خصوصیات مهم وقفه ها در آردوینو

تعدادی از مهم ترین خصوصیات وقفه ها عبارت اند از :

  • وقفه ها می توانند ناشی از منابع متفاوتی باشند. به عنوان مثال تغییر ولتاژ یکی از پایه های دیجیتالی میتواند یک وقفه سخت افزاری ایجاد کند.
  • اکثر بردهای آردوینو دارای دو وقفه سخت افزاری هستند که به نام های interrupt0 و interrupt1 شناخته می شوند که توسط پایه های 2 و 3 فعال می شوند.
  • برد آردوینو Mega دارای 6 وقفه سخت افزاری است، شامل وقفه های اضافی interrupt2 تا interrupt5 بر روی پایه های 18 ، 19 ، 20 و 21 .
  • میتوانید توسط سرویس روتین وقفه (ISR) برای هر وقفه یک تابع تعریف کنید.
  • میتوانید شرایط اتفاق افتادن وقفه را بر روی حالت هایی مانند لبه بالا رونده یا لبه پایین رونده یا هر دو تنظیم کنید.
  • میتوانید تنظیمات وقفه را به شکلی انجام دهید که با اتفاق افتادن وقفه به صورت خودکار تابع نوشته شده برای آن اجرا شود.
مطلب پیشنهادی:  آموزش کار با میکروکنترلرهای STM32 با استفاده از Arduino IDE: پروژه LED چشمک زن

انواع وقفه ها

به طور کلی دو نوع وقفه وجود دارد که عبارت است از :

  • وقفه سخت افزاری : این نوع وقفه در پاسخ به رخدادهای خارجی اتفاق می افتد مانند تغییر ولتاژ روی یک پایه
  • وقفه نرم افزاری : این نوع از وقفه در پاسخ به دستورات در نرم افزار اتفاق می افتد. تنها نوع وقفه نرم افزاری که آردوینو پشتیبانی می کند تابع attachInterrupt است.

استفاده از وقفه در آردوینو

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

معمولا از یک متغیر سراسری به منظور تبادل داده ها بین ISR ها و برنامه اصلی استفاده می شود. همچنین به منظور اطمینان از به روز رسانی صحیح متغیرهایی که بین ISR ها و برنامه های مختلف استفاده می شوند، این متغیرها را از نوع volatile تعریف کنید.

مطلب پیشنهادی:   کتابخانه توابع ریاضی در آردوینو 

نحوه استفاده از تابع attachInterrupt

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

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode) ;

تابع فقط برای استفاده در بردهای آردوینو Due ، Zero :

attachInterrupt(pin, ISR, mode) ;

نکته : آرگومان pin در این تابع شماره پایه مورد نظر است. آرگومان ISR شماره ISR است که با رخ دادن وقفه باید اجرا شود. این تابع هیچ مقداری را به عنوان ورودی نمی گیرد و هیچ مقداری را برنمیگرداند. به این تابع گاهی اوقات سرویس روتین وقفه نیز گفته می شود. آرگومان mode نیز تعیین کننده این است که وقفه باید در چه شرایطی رخ دهد.

سه ثابت زیر نیز به صورت پیشفرض برای mode تعریف شده اند :

  • LOW : رخ دادن وقفه زمانی که ولتاژ پایه در سطح پایین قرار می گیرد.
  • CHANGE : رخ دادن وقفه زمانی که ولتاژ پایه تغییر می کند.
  • FALLING : رخ دادن وقفه زمانی که ولتاژ پایه از سطح بالا به پایین تغییر می کند.

مثال :

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

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
 pinMode(13, OUTPUT); //set pin 13 as output
 attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
 //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
 digitalWrite(13, state); //pin 13 equal the state value
}

void blink() { 
 //ISR function
 state = !state; //toggle the state when the interrupt occurs
}

به پایان این جلسه از آموزش آردوینو (وقفه ها در آردوینو) رسیدیم امیدواریم در پروژه های خود بتوانید از وقفه آردوینو کمک بگیرید. برای مشاهده جلسات قبل و بعد اینجا کلیک کنید.

مطلب پیشنهادی:  برنامه نویسی آردوینو – عملگرها

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

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

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