وقفهها در آردوینو ،وقفهها باعث توقف در اجرای برنامه آردوینو میشوند و معمولا علت آن رسیدگی به یک کار یا وظیفه مشخص است.
تصور کنید که در خانه نشستهاید و دارید با کسی چت میکنید. ناگهان تلفن زنگ میخورد. در این شرایط چت کردن را متوقف میکنید و به سراغ تلفن میروید و آن را جواب میدهید. زمانی که مکالمتان با شخص تماس گیرنده به پایان رسید، تلفن را قطع کرده و مجددا به ادامه چت خود میپردازید. در این مثال در واقع چت کردن شما “روتین اصلی” یا کاری اصلی شما هست و زنگ تلفن باعث میشود که کار خود را متوقف کنید. “سرویس وقفه” در این مثال همان صحبت شما پشت تلفن است. این مثال دقیقا به شما نشان میدهد که پردازنده در زمان اتفاق افتادن وقفه چگونه عمل میکند.
برنامه اصلی معمولا تعدادی از توابع اصلی را در مدار ما پیاده سازی میکند. زمانی که وقفه اتفاق میافتد، روند اجرای برنامه اصلی متوقف میشود و کدهای مربوط به سرویس وقفه اجرا خواهند شد. زمانی که این کدها به اتمام رسید، پردازنده به برنامه اصلی باز میگردد و از جایی که متوقف شده بود ادامه میدهد.
خصوصیات مهم وقفهها در آردوینو
تعدادی از مهم ترین خصوصیات وقفهها عبارتاند از:
- وقفهها میتوانند ناشی از منابع متفاوتی باشند. به عنوان مثال تغییر ولتاژ یکی از پایههای دیجیتالی میتواند یک وقفه سخت افزاری ایجاد کند.
- اکثر بردهای آردوینو دارای دو وقفه سخت افزاری هستند که به نامهای interrupt0 و interrupt1 شناخته میشوند که توسط پایههای 2 و 3 فعال میشوند.
- برد آردوینو Mega دارای 6 وقفه سخت افزاری است، شامل وقفههای اضافی interrupt2 تا interrupt5 بر روی پایههای 18 ، 19 ، 20 و 21 .
- میتوانید توسط سرویس روتین وقفه (ISR) برای هر وقفه یک تابع تعریف کنید.
- میتوانید شرایط اتفاق افتادن وقفه را بر روی حالتهایی مانند لبه بالا رونده یا لبه پایین رونده یا هر دو تنظیم کنید.
- میتوانید تنظیمات وقفه را به شکلی انجام دهید که با اتفاق افتادن وقفه به صورت خودکار تابع نوشته شده برای آن اجرا شود.
انواع وقفهها
به طور کلی دو نوع وقفه وجود دارد که عبارت است از:
- وقفه سخت افزاری: این نوع وقفه در پاسخ به رخدادهای خارجی اتفاق میافتد مانند تغییر ولتاژ روی یک پایه
- وقفه نرم افزاری: این نوع از وقفه در پاسخ به دستورات در نرم افزار اتفاق میافتد. تنها نوع وقفه نرم افزاری که آردوینو پشتیبانی میکند تابع 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 }
به پایان این جلسه از آموزش آردوینو (وقفهها در آردوینو) رسیدیم امیدواریم در پروژههای خود بتوانید از وقفه آردوینو کمک بگیرید.
منبع: میکرودیزاینرالکترونیک