آردوینو, پروژه آردوینو

آموزش 0 تا 100 آردوینو؛ قسمت نهم

آموزش 0 تا 100 آردوینو قسمت نهم؛ وقفه ها در آردوینو

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

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

بگذارید با یک مثال ساده تر وقفه ها در آردوینو را توضیح دهیم: فرض کنید شما منتظر رسیدن اتوبوس هستید و هر چند ثانیه یک بار بررسی می‌کنید که آیا اتوبوس رسیده است یا خیر. این همان روشی است که به صورت پیش‌فرض در آردوینو استفاده می‌شود. مثلاً اگر بخواهیم Low بودن یک پایه را بررسی کنیم، آردوینو مدام سرکشی می‌کند تا ببیند آیا پایه Low شده است یا خیر. همین امر باعث می‌شود تا فعالیت‌ها به تأخیر بیفتند و برد آردوینو نتواند به همه اعمال واکنش نشان دهد.

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

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

یک نمونه کد مربوط به وقفه ها در آردوینو

void setup() {}

void loop()

{

noInterrupts();

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

  interrupts();

  // دیگر کدها

{

وقفه ها در آردوینو؛ وقفه‌های سخت‌افزاری و خارجی

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

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

پین‌های دیجیتال قابل استفاده برای وقفه ها در آردوینو

بوردهای آردوینو

2 و 3

آردوینو Uno، آردوینو Nano، آردوینو Mini و سایر بردهای آردوینو خانواده 328

2، 3، 18، 19، 20 و 21

آردوینو Mega، آردوینو Mega2560 و آردوینو MegaADK

0، 1، 2، 3 و 7

آردوینو Micro، آردوینو Leonardo و سایر بردهای آردوینو خانواده 32u4

همه پین‌های دیجیتال به غیر از پین شماره 4

آردوینو Zero

0، 1، 4، 5، 6، 7، 8، 9، 11 و 12

آردوینو MKR1000 Rev.1

همه پین‌های دیجیتال

آردوینو Due

همه پین‌های دیجیتال

آردوینو 101

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

attachInterrupt(digitalPinToInterrupt(pin)); ISR, mode

توضیحات و حالت‌های وقفه ها در آردوینو

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

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

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

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

  • Low: هرگاه پین Low شود، وقفه فعال می‌گردد.
  • High: وقفه در حالت High فعال می‌شود (فقط در بردهای آردوینو Zero، آردوینو Due و آردوینو MKR1000)
  • Change: هرگاه وضعیت پین عوض شود، وقفه فعال می‌شود.
  • هرگاه پین از حالت 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 است که در آن با هر بار فشردن سوئیچ پایه 13 تغییر حالت می‌دهد.

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

Detachinterrupt(digitalPinToInterrupt(Pin));

دیدگاهتان را بنویسید

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