در این آموزش به بررسی  pooling  و همچنین intterupt به طور تخصصی در پلت‌فرم‎های آردوینو خواهیم پرداخت. در ادامه‌ی آموزش با مرجع تخصصی آدوینو ، دیجی اسپارک همراه باشید. اکثر سیستم های‌ میکروکنترلر دارای ارتباط سریال ، SPI ، I2C ، مبدل آنالوگ به دیجیتال و . . . می‌باشند.گاهی اوغات یک سیستم خارجی ( مانند یک سنسور ) برای انجام عملیاتی مشخص به میکروکنترلر یا آردوینو متصل می‌شوند و از طریق دستورالعمل‎هایی با آن‌ها ارتباط برقرار شده و کنترل می‌شوند. به عنوان نمونه یک سیستم دماسنج دیجیتال، که دمای محیط را اندازه‌گیری می‌کند و پس از پایان اندازه‌گیری مقادیر را به میکروکنترلر ارسال می‌کند.

چگونه یک پردازنده اطلاعات مورد نیاز را از سیستم‌های خارجی متصل به خود دریافت می‌کند ؟

این عمل را به دو طریق می‌توان انجام داد:

  • pooling
  • intterupt

 

روش pooling که روش ساده‌ای می‌باشد :

در این روش  طبق بازه‌های زمانی  خاص که برنامه نویس آن‌ها را مشخص می‌کند ،  میکروکنترلر یا آردوینو به سیستم‌خارجی ( سنسور یا …) رجوع می‌کند و اطلاعات مربوطه را دریافت می‌کند. در روش pooling میکروکنترلر  باید مرتبا به سیستم خارجی رجوع کند و از سیستم مورد نظر درخواست اطلاعات کند. همانطور که مشاهده می‌کنید در روش pooling سیستم خارجی متصل به میکروکنترلر ، یک سیستم مجزا محسوب نمی‌شود و وابسته به میکروکنترلر می‌باشد.اشکال این روش در این است که بار پردازشی اضافه برای چک کردن دائم سیستم خارجی می‌باشد که باعث مصرف انرژی و منابع میکروکنترلر می‌شود.

 

 

روش  interrupt :

وقفه یا intterupt  یک سیگنال به ریزپردازنده است که به توجه و پاسخ سریع CPU نیاز دارد. هنگامی که یک وقفه رخ می‌دهد، پردازنده عملیات جاری خود را متوقف می‌کند تا به درخواست وقفه(کدهای خاصی که دربرنامه نوشته شده است) رسیدگی کند. پس از رسیدگی به درخواست مورد نظر و انجام آن ، برنامه از همان‌جایی که متوقف شده است شروع به اجرا می‌کند. استفاده از وقفه باعث مصرف کمتر انرژی ، بهینه تر شدن کد ، درک بهتر از کد و همچنین استفاده کمتر از منابع میکروکنترلر می‌شود.

نسبت دادن intrrupt و pooling به وقایع روزانه

فرض کنید منظر سرویس برای رفتن به سر کار باشید.سرویس شما راس ساعت ۸:۰۵ در مقابل منزلتان منتظر شماست. شما می‌خواهید ساعت ۸ از خانه خارج شوید و در بیرون خانه منتظر سرویس بایستید. دو راه کار پیش روی شماست :

۱- هنگامی که از خواب بیدار می‌شوید مدام به ساعت نگاه کنید تا  وقتی ساعت ۸ شد از خانه خارج شوید ( کاری بسیار کسل کننده ) ( روش pooling ) .

۲- برای ساعت ۸ زنگ ساعت را تنظیم کنید که  هنگام راس ساعت ۸ زنگ آن به صدا آید و شما را مطلع ساز ( روش interrupt ) .

 

مثالی حقیقی از عمل کرد وقفه

فرض کنید قصد داریدبرنامه‌ای بنویسید که با هر بار فشار دادن یک کلید ، یک عدد LED  روشن شود. اگر از pooling استفاده کنید باید مدام برنامه وضعیت کلید را چک کند و در صورت یک منطقی کلید ، LED روشن می‌شود. ولی در روش interrupt بدون چک کردن دائم وضعیت کلید ، هنگام فعال شدن کلید یک سیگنال به cpu  فرستاده می‌شود و سپس LED روشن می‌شود.

روال پاسخ گویی به وقفه یا ( ISR ( interrupt service routine

قبل از توضیح این قسمت توجه شمارا به تعریف چند کلمه‌ی خاص جلب می‌کنم :

stack : قسمتی از حافظه SRAM می‌باشد که دستوراتی جهت اجرای وقفه و فراخوانی میکروکنتلر در آن جا ذخیره می‌شود.

ثبات : به حافظه‌‌های سریع درون پردازنده ثبات یا Register می‌گویند.

Program counter : شمارنده برنامه ‌می‌باشد که نشان می‌دهد میکروکنترلردر کدام قسمت از برنامه قرار دارد.

بردار وقفه :  هر سطح وقفه یک محل رزرو شده در حافظه دارد که بردار وقفه (interrupt vector) نامیده می شود. همه بردارهای وقفه در جدولی به نام جدول بردار وقفه (interrupt vector table) نگهداری می شوند. به عنوان مثال جدول بردار وقفه یک میکروکنترلر را مشاهده می‌کنید:

آموزش وقفه

بردار وقفه

 

تذکر : اگر چند وقفه به طور همزمان رخ دهد ، هرکدام که اولویت بالاتری دارد را اجرا می‎کند. همانطور که در جدول فوق مشاهده می‌کنید وقفه RESET در میکروکنترلر و آردوینو از اولویت بالاتری برخوردار می‌باشد و با اجرای آن میکروکنتلربه شروع آدرس برنامه‌ی درون خود پرش می‌کند.

 

پس از آن که cpu سیگنال وقفه را دریافت کرد مراحل زیر را به ترتیب اجرا می‌کند:

۱- برنامه دستوری که در حال اجرای آن بوه است را متوقف نموده . سپس تمام ثبات ها  ، Program counter و آدرس قسمتی از برنامه که در حال اجرای آن بوده است، در stack ذخیره می‌شوند.

۳- به جدول بردار وقفه ( جدولی همانند تصویر بالا ) مراجعه می‌کند و آدرس سرویس وقفه ( program address ) را پیدا می‌کند .

۳- سپس به آدرس بدست آمده از بردار وقفه پرش می‌کند و زیربرنامه موجود در آن آدرس بدست آمده را اجرا می‌کند.

۴-به stack بازگشته ثبات ها و آدرس همان جایی از برنامه که هنگام وقوع وقفه ، متوقف شده بود را دریافت می‌کند.

۵- سپس به همان آدرس پرش می‌کند و ادامه‌ی برنامه را اجرا می‌کند ( به زبان ساده تر،به همان جایی که برنامه متوقف شده بود ، باز می‌گردد و شروع به اجرای برنامه می‌کند).

 

آموزش وقفه Arduino آردوینو

دیاگرام وقفه

 

آموزش وقفه interrupt

 

انواع وقفه

  • وقفه داخلی : وقفه‌ای که بر اثر اجرای دستورات در ریزپردازنده رخ می‌دهد همانند وقفه‌ی تقسیم بر صفر.
  • وقفه خارجی : وقفه‌ای که در اثر وقوع یک اتفاق خارجی  از طرف سخت افزار‌های منصل به پردازنده ایجاد می‌شود.همانند وقفه‌ی یک کلید که به یکی از پین‌های INT ( پین‌های مرببوط به وقفه خارجی )  متصل است.

 

در بخش بعدی از آموش به وقفه‌های خارجی آردوینو خواهیم پرداخت.

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

2 دیدگاه ها

  1. […] دو لینک زیر به آموزش وقفه در آردوینو پرداخته بخش اول بخش […]

پاسخ دهید

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