0

آموزش برنامه نویسی آردوینو

وقفه یا Interrupt یکی از مفاهیم بنیادی است که برای ساخت پروژه های حرفه ای میکروکنترلری و میکروپروسسوری حتما باید با آن آشنا باشید. در این مطلب قصد دارم به زبان خیلی ساده وقفه ( Interrupt ) و انواع وقفه ها در آردوینو رو برای شما توضیح بدم. اگر شما هم دوست دارید اطلاعات مفیدی در مورد وقفه ها و نحوه استفاده از وقفه در آردوینو کسب کنید، با من همراه شوید.

وقفه (‌Interrupt) چیست؟

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

اگر بخواهم به زبان ساده برای شما توضیح دهم که اینتراپت یا وقفه چیست؟ با یک مثال این مفهوم را برای شما توضیح میدهم. فرض کنید شما سرپرست بخش تعمیر و نگه داری یک خط تولید هستید و هر روز صبح طبق روال مشخصی بخش های مختلف خط تولید کارخانه را بازدید می کنید و عملیات لازم برای تعمیر و نگهداری مستمر کارخانه را انجام می دهید بدون اینکه خللی در روند کار کارخانه بوجود بیاید. یک روز صبح زمانی که ۲ ساعت است کار خود را شروع کرده اید و در حال تعمیر یکی از پمپ های بک آپ خط تولید در کارگاهتان هستید ناگهان یکی از تکنسین های خط تولید وارد کارگاهتان می شود و به شما خبر می دهد که یک مشکل جدی در خط تولید باعث از کار افتادن خط تولید کارخانه شده است. در این وضعیت شما چه می کنید؟! احتمالا شما هم تصمیم می گیرد در روال روزمره کارتان ( یعنی تعمیر پمپ پشتیبان ) وقفه ( Interrupt ) ایجاد کنید و سریعا سراغ رفع مشکل خط تولید بروید. رفع مشکل خط تولید ممکن است چند دقیقه، چند ساعت یا حتی چند روز از وقت شما را بگیرد. در این مدت شما تمام وقت خود را صرف عیب یابی و رفع عیب خطر تولید می کنید تا خط تولید مجددا راه اندازی شود. زمانی که مشکل اصلی برطرف شد و خط تولید به حالت نرمال بازگشت به کارگاهتان بر می گردید و تعمیر پمپ پشتیبان را ادامه می دهید.

در مثال بالا سعی کردم مفهوم وقفه یا اینتراپت را به زبان ساده برای شما توضیح دهم. در واقع زمانی که در آردوینو نیز وقفه اتفاق می افتد، آردوینو روال کاری عادی خودش را کنار می گذرد و سریعا به بررسی وقفه می پردازد. رسیدگی به وقفه ممکن است کمتر از یک میلی ثانیه وقت بخواهد یا ممکن است هیچ وقت رسیدگی به آن تمام نشود! در ادامه سراغ یک مثال نرم افزاری از وقفه در آردوینو می روم.

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

حالا فرض کنید میخواستیم برنامه ای بنویسیم که وقتی یک کلید فشار داده می شد یک LED را به مدت ۳ ثانیه برای ما روشن می کرد. برای این کار میتوانیم داخل ساختار Loop برنامه ای بنویسیم که اگر وضعیت پین ورودی مورد نظر ما LOW بود برنامه ۱۰ میلی ثانیه تاخیر ( delay ) ایجاد کند و اگر وضعیت پین مورد نظر ما HIGH بود برنامه پین خروجی متصل به LED را HIGH کند و سپس ۳۰۰۰ میلی ثانیه delay ایجاد کنیم و پس از آن پین مربوط به LED را به حالت LOW تغییر وضعیت دهیم.

در این حالت با قرار گرفتن این برنامه در loop هر ۱۰ میلی ثانیه یکبار وضعیت کلید بررسی می شود و در صورت که کلید فشار داده شود آردوینو LED مورد نظر ما را ۳ ثانیه روشن می کند و پس از آن مجددا شروع به کار می کند. کد برنامه گفته شده چیزی شبیه این خواهد بود.

const int ButtonPin = 3, LEDPin = 9;
void setup(){
 pinMode(ButtonPin, INPUT);
 pinMode(LEDPin, OUTPUT);
}
void loop(){
 if(digitalRead(ButtonPin)){
  digitalWrite(LEDPin,HIGH);
  delay(3000);
  digitalWrite(LEDPin,LOW);
 }else{
  delay(10);
 }
}

حالا فرض کنید بخواهیم زمانی که LED روشن است اگر یکبار دیگر کلید فشار داده شد و هنوز LED روشن بود، فوراً LED خاموش شود. چه راه حلی برای این مساله به ذهنتان می رسد؟! برای حل این مساله چندین راه حل مختلف وجود دارد.

اما در برنامه بالا یک اشکال اساسی وجود دارد. زمانی که LED روشن می شود اجرای loop به مدت ۳ ثانیه دچار تاخیر یا delay می شود. در این مدت دیگر برنامه های درون loop اجرا نمی شوند. بنابراین در برنامه بالا تا زمانی که LED روشن است نمی توانیم وضعیت پین مربوط به دکمه را چک کنیم. اما یکی از روش های اصولی و ساده برای حل برای این مساله استفاده از وقفه یا اینتراپت است.

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

وقفه ها را میتوان بر اساس منشا رویداد به ۲ دسته خارجی (External) و داخلی (Internal) تقسیم کرد.

وقفه خارجی به زبان ساده

وقفه خارجی یا External Interrupt به وقفه هایی گفته می شود که منشاء رویداد آنها چیزی در خارج از میکروکنترلر است. در واقع زمانی که یک سیگنال به پایه مربوط به وقفه می رسد سیگنال از محیط پیرامون وارد میکروکنترلر می شود و بنابراین منشا وقفه خارج از میکرونترلر است.

وقفه داخلی یا Internal Interrupt چیست؟

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

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

همان طور که می دانید همه ی برد های آردوینو از یک میکروکنترلر استفاده می کنند. در طراحی پردازنده بسیاری از میکروکنترلر ها یک یا چند وقفه سخت افزاری در نظر گرفته شده است.البته برخی از میکروکنترلر های کوچک و ارزان فاقد وقفه ها خارجی هستند. از آنجا که برد آردوینو UNO معیار ما برای آموزش آردوینو است باید بدانیم برد آردوینو اونو از میکروکنترلر ATMEGA328 استفاده می کند که دو وقفه خارجی (External Interrupt)‌ را در اختیارمان قرار می دهد. پین های ۲ و ۳ آردوینو به پایه های INT0 و INT1 میکروکنترلر متصل شده اند و میتوانند به عنوان Trigger یا فعال کننده وقفه عمل کنند.

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

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.