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

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

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

آموزش وقفه interrupt بخش اول

 

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

 

 

پین‌هایی که می‌توان از آن‌ها به عنوان پین وقفه استفاده نمودمدل آردوینو
۲, ۳Uno, Nano, Mini, other 328-based
۲, ۳, ۱۸, ۱۹, ۲۰, ۲۱Mega, Mega2560, MegaADK
۰, ۱, ۲, ۳, ۷Micro, Leonardo, other 32u4-based
تمام پین‌های دیجیتال به جز پین شماره ۴Zero
تمام پین‌های دیجیتالDue

 

 

توضیح توابع

 

attachInterrupt(interrupt, ISR, mode);

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

interrupt : شماری‌ وقفه ‌ایست که می‌خواهیم از آن استفاده کنیم.

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

شماره وقفه‌ها در آردوینو به صورت زیر می‌باشد:

 

مدل آردوینوint.0

(وقفه شماره ۰)

int.1

(وقفه شماره ۱ )

int.2

(وقفه شماره ۲ )

int.3

(وقفه شماره ۳)

int.4

(وقفه شماره ۴)

int.5

(وقفه شماره ۵)

Uno, Ethernet۲۳
Mega2560۲۳۲۱۲۰۱۹۱۸
۳۲u4 based (e.g Leonardo, Micro)۳۲۰۱۷
Due, Zero(see below)

 

آردوینو Due درر وقفه‌های خارجی بسیار قدرتمند عمل می‌کند و می‌توان از ۵۴ پین ورودی/خروجی دیجیتال آن به عنوان وقفه خارجی استفاده نمود.

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

برای دو آردوینو Due و Zero می‌توان مستقیما از شماره پین به جای آرگمان interrupt در هنگام استفاده از تابع attachInterrupt استفاده نمود.

 

ISR : نام تابع وقفه‌ می‌باشد که به صورت اختیاری انتخاب می‌شود ، و پس از تحریک شدن پین وقفه‌ی مربوطه ، کدهای درون این تابع اجرا می‌شود. این تابع دارای خروجی نمی‌باشد ( از نوع void می‌باشد ) و نمی‌تواند آرگمان ورودی داشته باشد.

نکاتی پیرامون تابع وقفه :

  • تابع millis برای شمردن متکی به وقفه ها می‌باشد و مقدار آن هیچوقت درون تابع وقفه (ISR) افزایش پیدا نمی‌کند.
  • تابع delay برای کار کردن نیاز به وقفه‌ها دارد از این رو دستور delay هیچگاه درون تابع وقفه (ISR) اجرا نمی‌شود.
  • تابع micros در ابتدای کار ، درون تابع وقفه (ISR) به درستی عمل می‌کند ولی بعد از گذشت ۱-۲ میلی‌ثانیه به طور نامنظم کار می‌کند.
  • تابع delayMicroseconds برای افزایش مقدار خود به هیچ‌شمارنده‌ای وابسته نمی‌باشد بنابراین دستورdelayMicroseconds درون تابع وقفه (ISR) به درستی عمل می‌کند.
  • توجه کنید هیچگاه در تابع وقفه (ISR) پردازش‌های سنگین قرار داده نشود.
  • هیچ گاه دو تابع وقفه همزمان اجرا نمی‌شوند و به ترتیب اولویت موجود در جدول بردار وقفه اجرا می‌شوند.
  • هنگامی که یک متغیر را به طور سراسری تعریف می‌کنید و تمایل دارید مقدار متغیر درون تابع وقفه نیز بتواند تغییر کند باید قبل از تعریف متغیر از کلمه کلیدی volatile استفاده شود. با انجام این کار به کامپایلر یادآوری می‌کنیم که مقدار متغیر را در حافظه RAM و نه در یک رجیستر ذخیره کند و مقدار این متغیر می تواند خارج از برنامه (زیربرنامه وقفه یا سایر زیربرنامه ها) تغییر نماید.

 

 

 

mode : توسط این آرگمان نوع تحریک شدن وقفه مشخص می‌شود.دارای چهار حالت زیر می‌باشد :

  • LOW : هرگاه وضعیت پین interrupt در حالت LOW ( صفر منطقی) قرار داشته باشد ، تابع وقفه اجرا می‌شود.
آموزش interrupt آردوینو

LOW Mode

 

  • HIGH : هر گاه وضعیت پین interrupt  در حالت HIGH ( یک منطقی ) قرار داشته باشد ، تابع وقفه اجرا می‌شود. درست عکس حالت فوق.

 

  • CHANGE : هر گاه وضعیت پین INTERRUPT  از حالت صفر منطقی به  یک منطقی تغییر کند یا هرگاه از حالت ۱ منطقی به صفر منطقی تغییر کند، تابع وقفه اجرا می‌شود.

 

آموزش interrupt آردویتو

CHANGE Mode

 

RISING : هنگامی که وضعیت پین INTERRUPT از صفر منطقی به یک منطقی تغییر کند تابع وقفه اجرا می‌شود.

آموزش interrupt آردویتو

CHANGE Mode

 

آموزش interrupt آردویتو

RISING Mode

 

 

FALLING : هنگامی وضعیت پین INTERRUPT از یک مطقی به صفر منطقی تغییر کند ، تابع وقفه اجرا می‌شود.

FALLING Mode

آموزش intrrupt arduino

 

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

این تابع همانند تابع فوق می‌باشد با این تفاوت که در آرگمان اول از یک تابع دیگر به نام digitalPinToInterrupt استفاده شده است که به کمک آن می‌توانیم به جای شماره وقفه ، شماره‌ی پین وقفه را وارد کنیم به عنوان مثال برای استفاده از وقفه صفر طبق تابع قبلی باید مطابق کد زیر عمل می‌کردیم:

 

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

 

detachInterrupt()

این تابع وقفه مورد نظر را غیرفعال می‌کند و آن پایه که وقفه به آن نسبت داده شده بود به ورودی / خروجی تغییر می‌دهد. این تابع دارای  ساختارهایی به صورت زیر می‌باشند.

 

noInterrupts()

از این تابع برای غیر فعال کردن وقفه استفاده می‌شود.

 

interrupts()

بعد از غیر فعال کردن وقفه‌ می‌توان با این دستور ، وقفه را دوباره فعال نمود.

 

 

مثالی از وقفه در Arduino :

 

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

4 دیدگاه ها

  1. S می‌گه:

    دستتون باپاتون دردنکنه

  2. حسین می‌گه:

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

  3. امیر می‌گه:

    سلام
    چرا انقدر این وقفه محدودیت داره !!!
    تابع pulsein رو تو ISR اجرا نمیکنه باید چیکار کنم؟ راه دیگه نداره؟

پاسخ دهید

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