المقاطعات هي ميزة قوية من متحكمها تسمح لك بالتعامل مع الأحداث بشكل غير متزامن. على عكس الاقتراع ، الذي يتحقق بشكل مستمر للأحداث ، تستجيب المقاطعات فورًا عند حدوث حدث معين ، مثل الضغط على زر أو تدفق مؤقت. سوف يرشدك هذا البرنامج التعليمي من خلال فهم واستخدام المقاطعات مع Arduino.
ماذا ستحتاج
- Arduino Uno (أو لوحة متوافقة)
- زر
- مقاوم 10K-OHM (للتكوين المنسدلة)
- LED و 220 أوم المقاوم (اختياري)
- الأسلاك الأسلاك والبلوز
- Arduino IDE مثبتة على جهاز الكمبيوتر الخاص بك
الخطوة 1: ما هي المقاطعات؟
توقف المقاطعة مؤقتًا عن تنفيذ البرنامج الرئيسي للتعامل مع حدث معين. بمجرد معالجة الحدث ، يستأنف البرنامج حيث توقف. تتم إدارة المقاطعات باستخدام وظائف خاصة تسمى إجراءات خدمة المقاطعة (ISRS).
أنواع المقاطعات في أردوينو
- المقاطعات الخارجية: الناتج عن الأحداث على دبابيس محددة (على سبيل المثال ، PIN 2 أو 3 على Arduino UNO).
- مقاطعات تغيير الدبوس: الناتج عن تغيير على أي دبوس رقمي.
- تقاطعات المؤقت: الناتج عن تدفق الموقت أو مقارنة المباريات.
الخطوة 2: استخدام المقاطعات الخارجية
يدعم Arduino UNO المقاطعات الخارجية على المسامير 2 و 3. يمكنك تكوين هذه المقاطعات لتشغيل:
- ارتفاع: إشارة تذهب من منخفضة إلى عالية.
- هبوط: إشارة تذهب من عالية إلى منخفضة.
- يتغير: تغييرات الإشارة الحالة (منخفضة إلى عالية أو عالية إلى منخفضة).
- قليل: لا تزال الإشارة منخفضة.
رمز مثال: اكتشاف زر اضغط
هذا المثال يبطح LED عند الضغط على زر متصل بـ PIN 2.
#define buttonPin 2 // Interrupt pin
#define ledPin 13 // Built-in LED
volatile bool ledState = false; // Shared variable between ISR and main code
void handleInterrupt() {
ledState = !ledState; // Toggle LED state
digitalWrite(ledPin, ledState);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}
void loop() {
// Main loop does nothing; interrupt handles the LED
}
توضيح
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: تكوين المقاطعة.-
pin
: دبوس المقاطعة (على سبيل المثال ، دبوس 2 أو 3 على Arduino UNO). -
ISR
: روتين خدمة المقاطعة للتنفيذ. -
mode
: حالة التشغيل (RISING
,FALLING
,CHANGE
، أوLOW
).
-
-
digitalPinToInterrupt(pin)
: يحول رقم دبوس إلى رقم المقاطعة.
الخطوة 3: استخدام مقاطعات تغيير الدبوس
تتيح لك مقاطعات تغيير الدبوس الكشف عن التغييرات على أي دبوس رقمي. هذا يتطلب مكتبات إضافية ، مثل تمكين.
مثال رمز: PIN تغيير المقاطعة
#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor
void handlePinChange() {
Serial.println("Pin state changed!");
}
void setup() {
Serial.begin(9600);
enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}
void loop() {
// Main loop does nothing; interrupt handles the event
}
تثبيت المكتبة
لاستخدام مقاطعات تغيير الدبوس ، قم بتثبيت ملف تمكين مكتبة عبر مدير مكتبة Arduino.
الخطوة 4: قاطعات المؤقت
مقاطعات المؤقت مفيدة لجدولة مهام على فترات فترات دقيقة. الرجوع إلى Arduino Timer البرنامج التعليمي للحصول على تفاصيل حول تكوين مقاطعات المؤقت.
مثال: وميض LED مع Timer1 مقاطعة
#define ledPin 13
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
الخطوة 5: أفضل الممارسات لاستخدام المقاطعات
- تبقي isrs قصيرة: تجنب التأخير أو الحسابات المعقدة في ISRs لضمان استجابة سريعة.
- تجنب الاتصال التسلسلي في ISRS: قد لا تعمل الوظائف التسلسلية بشكل موثوق داخل ISR.
-
يستخدم
volatile
للمتغيرات المشتركة: مارك متغيرات مشتركة بين ISRs والبرنامج الرئيسي مثلvolatile
لمنع مشكلات تحسين التحويل البرمجي. - المدخلات debounce: التعامل مع Debounce منطق في البرامج أو الأجهزة للحصول على إشارات صاخبة مثل الضغط على الزر.
-
تعطيل المقاطعات خلال الأقسام الحرجة: يستخدم
noInterrupts()
وinterrupts()
لحماية أقسام التعليمات البرمجية الحرجة.
تطبيقات المقاطعات
- يضغط زر التعامل دون الاقتراع
- قراءة الترميز الدوار
- توقيت الأحداث الحرجة (على سبيل المثال ، التحكم الدقيق للمحرك)
- جدولة المهام الدورية
- رد فعل على الإشارات الخارجية (على سبيل المثال ، أجهزة الاستشعار ، أحداث الاتصال)
استكشاف الأخطاء وإصلاحها
- مقاطعة لا تؤدي: تأكد من تكوين الدبوس والوضع الصحيحين.
- سلوك غير مستقر: debounce إشارات صاخبة وتجنب isrs طويلة.
- الصراعات مع المكتبات: تستخدم بعض المكتبات المقاطعات داخليًا (على سبيل المثال ، Servo ، PWM). تأكد من عدم الصراع مع الكود الخاص بك.
خاتمة
تتيح المقاطعات التعامل المستجيب والفعال للأحداث في مشاريع Arduino. من خلال تعلم استخدام المقاطعات الخارجية والتغيير الخارجي والمقاطعات ، يمكنك إنشاء تطبيقات قوية ودقيقة. تجربة مع أنواع مختلفة من المقاطعات لتعزيز مشاريعك وتحسين الأداء!