آردوینوآموزش آردوینو

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

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

وقفه ها

در این میان وقفه ها مانند همان مثال اتوبوس هستند با این تفاوت که بجای مدام بررسی کنید که آیا اتوبوس آمده است یا نه، شما با خیال راحت در ایستگاه می نشینید و زمانی که اتوبوس به ایستگاه رسید، شما متوجه آمدن آن میشوید. وقفه ها نیز از همین روش استفاده میکنند و دیگر شلوغی در کار نیست.

وقفه ها ی داخلی مانند تایمرها به طور پیش فرض فعال هستند و در پس زمینه کار می کنند. برای غیر فعال کردن آنها  از دستور noInterrupts() استفاده می شود.

به نمونه کد زیر توجه کنید:

void setup() {}

 

void loop()

{

  noInterrupts();

  // کدهای حساس به زمان

  interrupts();

  // دیگر کدها

{

وقفه های سخت افزاری و خارجی

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

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

Digital Pins Usable For InterruptsBoards
۲ , ۳Uno, Nano, Mini, other 328-based
۲ , ۳ ,۱۸ ,۱۹ , ۲۰ , ۲۱Mega, Mega2560, MegaADK
۰, ۱ , ۲ , ۳ , ۷Micro, Leonardo, other 32u4-based
all digital pins, except 4Zero
۰ , ۱ , ۴ , ۵ , ۶ , ۷ , ۸ , ۹ , ۱۱ , ۱۲MKR1000 Rev.1
all digital pinsDue
all digital pins۱۰۱

دستور فعال سازی وقفه های خارجی به صورت زیر است که در حلقه setup(); وارد می شود:

attachInterrupt(digitalPinToInterrupt(pin)); ISR, mode

توضیحات و حالت ها

digitalPinToInterrupt این دستور پین مربوط به وقفه ها را از دیگر پین های دیجیتال متمایز می کند.

Pin شماره پین وقفه را مشخص میکند.

ISR بیانگر نام تابعی است که در هنگام وقوع وقفه فعال خواهد شد.

Mode بیانگر نوع فعالساز وقفه می باشد که ۵ حالت دارد:

۱.       LOW هرگاه پین LOW شود وقفه فعال می شود.

۲.       HIGH وقفه در حالت HIGH فعال می شود(فقط در بردهای Due,Zero,MKR1000)

۳.       CHANGE هرگاه وضعیت پین عوض شود وقفه فعال می شود

۴.       RISING هرگاه پین از حالت LOW به HIGH تغییر کند فعال می شود

۵.       FALLING هرگاه پین از حالت HIGH به LOW تغییر کند فعال می شود.

مثال:

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

 

تابعی که در وقفه فعال می شود BLINK() است که در آن با هربار فشردن سویچ LED پایه ۱۳ تغییر حالت میدهد.

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

;((detachInterrupt(digitalPinToInterrupt(pin

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

برچسب ها
نمایش بیشتر

پاسخی بگذارید

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

دکمه بازگشت به بالا
بستن