Arduino/interrupts/attachinterrupt

من موسوعة حسوب
< Arduino‏ | interrupts
مراجعة 14:53، 20 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المعامل الأول المُمرَّر إلى الدالة attachInterrupt()‎ هو رقم المقاطعة. عمومًا، يجب استدعاء الدالة digitalPinToInterrupt(pin)‎ لتفسير الرجل الرقمية الفعلية إلى رقم مقاطعة محدَّدة. على سبيل المثال، إن أردت تهيئة مقاطعة على الرجل 3، فاستعمل digitalPinToInterrupt(3)‎ بتمريرها كأول معامل إلى الدالة attachInterrupt()‎.

اللوحة الأرجل الرقمية القابلة للاستخدام مع المقاطعات
Uno, Nano, Mini, other 328-based 2، 3
Uno WiFi Rev.2 جميع الأرجل الرقمية
Mega, Mega2560, MegaADK 2، 3، 18، 19، 20، 21
Micro, Leonardo, other 32u4-based 0، 1، 2، 3، 7
Zero جميع الأرجل الرقمية باستثناء الرجل 4
لوحات عائلة MKR 0، 1، 4، 5، 6، 7، 8، 9، A2 ،A1
Due جميع الأرجل الرقمية
101 جميع الأرجل الرقمية (الأرجل 2، و 5، و 7، و 8، و 10، و 12، و 13 تعمل مع CHANGE فقط)

ملاحظات وتحذيرات

ضمن الدالة المرتبطة، لن تعمل الدالة delay()‎، ولن تزيد القيمة المعادة عبر الدالة millis()‎. البيانات المستلمة عبر الاتصال التسلسلي في فترة تنفيذ الدالة قد تُفقَد. يجب عليك التصريح عن أي أية متغير تود تعيدله ضمن الدالة المرتبطة بالكلمة volatile المفتاحية. اطلع على القسم « » في الأسفل لمزيد من التفاصيل.

استعمال المقاطعات

تمكن فائدة المقاطعات بتوفيرها طريقة لتنفيذ شيء أو جعل شيء يحدث تلقائيًّا أثناء تنفيذ برنامج، بالإضافة إلى توفيرها حلولًا للمشاكل المتعلقة بالتوقيت. من الأمثلة الجيدة التي تستخدم المقاطعات هي قراءة مرمِّز دوار (rotary encoder)، أو مراقبة المدخلات من المستخدم.

إن أردت التأكد أن برنامجًا يلتقط النبضات من مرمِّز دوار بشكل دائم ولا يفقد أية نبضة واحدة مطلقًا، فمن الصعب أن ينفّذ البرنامج أي شيء آخر لأن البرنامج سيحتاج إلى التنصت على أرجل الحساس للمرمز باستمرار ليلتقط النبضات عند حدوثها. تملك بعض الحساسات واجهة ديناميكة مشابهة أيضً مثل محاول قراءة حساس صوت من أجل التقاط صوت نقرة أو ضغطة معيَّنة، أو محاولة التقاط حساس أشعة تحت الحمراء (infrared) -مثل قاطع ضوئي (photo-interrupter)- سقوط قطعة معدنية. يمكن جعل المتحكم باستعمال المقاطعات، مع جميع هذه الأمثلة وغيرها، حرًّا في تنفيذ مهام وأعمال أخرى دون إهمال المدخلات والقراءات مثل تلك التي أشرنا إليها آنفًا.

برنامج خدمة المقاطعة (Interrupt Service Routines)

برامج خدمة المقاطعة الفرعية (تدعى اختصارًا ISR) هي نوع مخصَّص من الدوال التي تملك بعض القيود الفريدة الغير موجودة في الدوال الأخرى. فلا يمكن تمرير أيَّة معاملات إلى تلك الدوال ولا يجب أن تعيد أي شيء.

عمومًا، يجب على برنامج خدمة المقاطعة أن يكون قصيرًا وسريعًا قدر الإمكان. إن كانت تملك شيفرتك عدة برامج خدمة المقاطعات، فيجب أن تعمل إحداها فقط في وقت واحد بينما ستُنفَّذ مقاطعات أخرى واحدةً تلو الأخرى -في حال حدوث أكثر من مقاطعة في الوقت نفسه- بترتيب يعتمد على أولوية كل منها. تعتمد الدالة millis()‎ على المقاطعات لعد الزمن، لذا لن تعمل أو تزيد داخل برنامج خدمة مقاطعة. لما كان عمل الدالة delay()‎ يتطلب المقاطعات أيضًا، فلن تعمل إن استدعيت ضمن برنامج خدمة مقاطعة. أمَّا الدالة delay()‎ فإنها تعمل بالبداية بشكل جيد، ولكن سلوكها يبدأ بالتدهور تدريجيًّا بعد مرور 1-2 ميلي ثانية. لا تستعمل الدالة delayMicroseconds()‎ العداد (counter) في المتحكم، لذا ستعمل بشكل طبيعي.

تستخدم عادةً المتغيرات العامة (global variables) لتمرير البيانات بين برنامج خدمة المقاطعة الفرعي والبرنامج الرئيسي. لتكون ميقنًا تمامًا من استعمال المتغيرات المتشاركة بين خدمة المقاطعة والبرنامج الرئيسي بشكل صحيح وتحديثها للبيانات دون حصول خطأ، فاستعمل الكلمة volatile المفتاحية للتصريح عن تلك المتغيرات.

للمزيد من المعلومات حول المقاطعات، اطلع على هذه الملاحظات.

البنية العامة

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (يوصى بها)
attachInterrupt(interrupt, ISR, mode); (لا يوصى بها)
attachInterrupt(pin, ISR, mode); (101 و ،MKR1000 و ،Zero و ،Due لا يوصى بها؛ خاصة بلوحات)

المعاملات

interrupt

عددٌ صحيح يمثِّل رقم المقاطعة.

pin

رقم الرجل (يستعمل مع لوحات Due، و Zero، و MKR1000 فقط).

ISR

عدد

mode

عدد

القيم المعادة

لا يعاد أي شيء.

انظر أيضًا

مصادر