Arduino يقاطع البرنامج التعليمي

Arduino Interrupts Tutorial

المقاطعات هي ميزة قوية من متحكمها تسمح لك بالتعامل مع الأحداث بشكل غير متزامن. على عكس الاقتراع ، الذي يتحقق بشكل مستمر للأحداث ، تستجيب المقاطعات فورًا عند حدوث حدث معين ، مثل الضغط على زر أو تدفق مؤقت. سوف يرشدك هذا البرنامج التعليمي من خلال فهم واستخدام المقاطعات مع Arduino.


ماذا ستحتاج

  1. Arduino Uno (أو لوحة متوافقة)
  2. زر
  3. مقاوم 10K-OHM (للتكوين المنسدلة)
  4. LED و 220 أوم المقاوم (اختياري)
  5. الأسلاك الأسلاك والبلوز
  6. Arduino IDE مثبتة على جهاز الكمبيوتر الخاص بك

الخطوة 1: ما هي المقاطعات؟

توقف المقاطعة مؤقتًا عن تنفيذ البرنامج الرئيسي للتعامل مع حدث معين. بمجرد معالجة الحدث ، يستأنف البرنامج حيث توقف. تتم إدارة المقاطعات باستخدام وظائف خاصة تسمى إجراءات خدمة المقاطعة (ISRS).

أنواع المقاطعات في أردوينو

  1. المقاطعات الخارجية: الناتج عن الأحداث على دبابيس محددة (على سبيل المثال ، PIN 2 أو 3 على Arduino UNO).
  2. مقاطعات تغيير الدبوس: الناتج عن تغيير على أي دبوس رقمي.
  3. تقاطعات المؤقت: الناتج عن تدفق الموقت أو مقارنة المباريات.

الخطوة 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: أفضل الممارسات لاستخدام المقاطعات

  1. تبقي isrs قصيرة: تجنب التأخير أو الحسابات المعقدة في ISRs لضمان استجابة سريعة.
  2. تجنب الاتصال التسلسلي في ISRS: قد لا تعمل الوظائف التسلسلية بشكل موثوق داخل ISR.
  3. يستخدم volatile للمتغيرات المشتركة: مارك متغيرات مشتركة بين ISRs والبرنامج الرئيسي مثل volatile لمنع مشكلات تحسين التحويل البرمجي.
  4. المدخلات debounce: التعامل مع Debounce منطق في البرامج أو الأجهزة للحصول على إشارات صاخبة مثل الضغط على الزر.
  5. تعطيل المقاطعات خلال الأقسام الحرجة: يستخدم noInterrupts() و interrupts() لحماية أقسام التعليمات البرمجية الحرجة.

تطبيقات المقاطعات

  1. يضغط زر التعامل دون الاقتراع
  2. قراءة الترميز الدوار
  3. توقيت الأحداث الحرجة (على سبيل المثال ، التحكم الدقيق للمحرك)
  4. جدولة المهام الدورية
  5. رد فعل على الإشارات الخارجية (على سبيل المثال ، أجهزة الاستشعار ، أحداث الاتصال)

استكشاف الأخطاء وإصلاحها

  • مقاطعة لا تؤدي: تأكد من تكوين الدبوس والوضع الصحيحين.
  • سلوك غير مستقر: debounce إشارات صاخبة وتجنب isrs طويلة.
  • الصراعات مع المكتبات: تستخدم بعض المكتبات المقاطعات داخليًا (على سبيل المثال ، Servo ، PWM). تأكد من عدم الصراع مع الكود الخاص بك.

خاتمة

تتيح المقاطعات التعامل المستجيب والفعال للأحداث في مشاريع Arduino. من خلال تعلم استخدام المقاطعات الخارجية والتغيير الخارجي والمقاطعات ، يمكنك إنشاء تطبيقات قوية ودقيقة. تجربة مع أنواع مختلفة من المقاطعات لتعزيز مشاريعك وتحسين الأداء!

اترك تعليقًا

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.