آموزش وقفه ها در آردوینو (دستور attachInterrupt)
اولین پارامتر دستور ()attachInterrupt عدد وقفه است. به طور معمول برای اختصاص دادن پین دیجیتال به یک وقفه، باید از digitalPinToInterrupt(pin)
استفاده کنید. به عنوان مثال، اگر میخواهید از پین 3 به عنوان وقفه استفاده کنید، باید دستور را به شکل digitalPinToInterrupt(3)
بنویسید. و این عدد را به عنوان اولین پارامتر در دستور attachInterrupt استفاده کنید.
جدول زیر پین های دیجیتال وقفه در برد های مختلف آردوینو را نشان میدهد.
برد | پین دیجیتال وقفه |
---|---|
Uno, Nano, Mini, other 328-based | 2, 3 |
Uno WiFi Rev.2, Nano Every | تمام پین های دیجیتالی |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | تمام پین های دیجیتالی به جز 4 |
MKR Family boards | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید | 2, 3, 9, 10, 11, 13, 15, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense | تمام پین ها |
Due | تمام پین های دیجیتالی |
101 | تمام پین های دیجیتالی (پین های 2, 5, 7, 8, 10, 11, 12, 13 فقط با CHANGE کار میکند) |
هشدار:
در هنگام استفاده از وقفه ها، دستور delay کار نمیکند و همچنین تابع millis نیز شمارش را انجام نمیدهد. برای متغیر های درون وقفه باید از کلید واژه volatile استفاده کنید.
دستور attachInterrupt
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
(پیشنهاد شده)
attachInterrupt(interrupt, ISR, mode)
(پیشنهاد نشده)
- interrupt: شماره وقفه
- pin: پین مورد استفاده برای وقفه
- ISR: در زمان رخ دادن وقفه، ISR فراخوانی میشود.
- mode: حالتی که در آن وقفه رخ میدهد. موارد زیر را میتوانید به جای mode قرار دهید.
- LOW: هر زمان که پین وقفه پایین باشد.
- CHANGE: هر زمان که پین وقفه پایین یا بالا شود (تغییر کند)
- RISING: هر زمان که پین وقفه از پایین به بالا برود.
- FALLING: هر زمان که پین وقفه از بالا به پایین برود.
برد های The Due، Zero و MKR1000 از حالت زیر نیز پشتیبانی میکنند.
- HIGH: هر زمان پین وقفه بالا باشد.
این دستور چه چیزی را بر میگرداند؟
هیچ چیز
نمونه کد با تابع attachInterrupt
با کد زیر هر بار که دکمه فشرده شود ال ای دی روشن میشود و با رها کردن دکمه ال ای دی خاموش میشود.
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; }
شماره وقفه ها
به طور معمول شما باید از digitalPinToInterrupt(pin) استفاده کنید ، نه اینکه یک عدد وقفه را مستقیماً در کد خود قرار دهید. جدول زیر پین های وقفه موجود را در صفحه های مختلف نشان می دهد.
توجه داشته باشید که در جدول زیر ، اعداد وقفه به عددی که باید به attachInterrupt() ارسال شود ، اشاره دارند. به دلایل تاریخی ، این شماره همیشه به طور مستقیم با شماره گذاری وقفه در تراشه ATmega مطابقت ندارد (به عنوان مثال int.0 مربوط به INT4 در تراشه ATmega2560 است).
برد | INT.0 | INT.1 | INT.2 | INT.3 | INT.4 | INT.5 |
---|---|---|---|---|---|---|
Uno, Ethernet | 2 | 3 | ||||
Mega2560 | 2 | 3 | 21 | 20 | 19 | 18 |
32u4 based (e.g Leonardo, Micro) | 3 | 2 | 0 | 1 | 7 |
برای برد های Uno WiFiRev.2 ، Due ، Zero ، MKR Family و 101 تعداد وقفه مساوی با شماره پین است.
دستورات مرتبط
خلاصه ، مفید و کاربردی
سلام عزیز
خوشحالم که براتون مفید واقع شده