وقفه ها

 

 

 

 

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

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

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

  
void setup() {}

 

void loop()

{

  noInterrupts();

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

  interrupts();

  // دیگر کدها

{

 

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

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

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

Digital Pins Usable For Interrupts

Boards

2 , 3

Uno, Nano, Mini, other 328-based

2 , 3 ,18 ,19 , 20 , 21

Mega, Mega2560, MegaADK

0, 1 , 2 , 3 , 7

Micro, Leonardo, other 32u4-based

all digital pins, except 4

Zero

0 , 1 , 4 , 5 , 6 , 7 , 8 , 9 , 11 , 12

MKR1000 Rev.1

all digital pins

Due

all digital pins

101

 

 

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

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

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

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

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

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

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

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

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

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

5.       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 پایه 13 تغییر حالت میدهد.

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

detachInterrupt(digitalPinToInterrupt(pin));

Top