المقاطعات Interrupt
ضمن برمجية الأردوينو
(1)
في هذه التدوينة , سأقوم بشرح أحد أهم المواضيع في برمجة المتحكمات الأصغرية Microcontroller, موضوع المقاطعات Interrupt , فما هي المقاطعات ؟ و متى تستخدم ؟ و كيف نكتب الكود الخاص بها ؟
هناك نوعان من المقاطعات :
1) المقاطعات المعتمدة على البرنامج Software Interrupt حيث تستجيب للاشارات التي يعطيها البرنامج .
2) المقاطعات المعتمدة على التغيرات الخارجية Hardware Interrupt حيث تستجيب للأشارات القادمة من خارج المتحكم , بفعل التغيرات التي تحدث على مداخل المتحكم .
المتحكمات من عائلة AVR 8bit لا تدعم المقاطعات المعتمدة على البرنامج Software Interrupt , المقاطعات الخارجية هي المدعومة فقط في لغة الأردوينو .
هناك مقاطعات تعتمد على المؤقتات Timer Interrupt التي تدعمها لغة أردوينو ذات فائدة كبيرة و استخدامات شائعة .
المقاطعات الخارجية المدعومة في برمجية الأردوينو تستخدم الأمر attachInerrupt .
ما هي المقاطعات Interrupt :
هو تعليمة Code يقوم بمقاطعة برنامج فعّال لعمل برنامج آخر , اعتماداً على قدحTriggering خارجي أو داخلي , عندما يتم هذا القدح Triggering يتم إيقاف البرنامج الفعّال و ينتقل لعمل برنامج آخر هذا يسمى " Interrupt Service Routine" ISR
عندما ينتهي تطبيق البرنامج العارض , يتم العودة للبرنامج الأصلي الذي كان يعمل عليها المتحكم قبل المقاطعة .
مبدأ العمل :
في الغالب , نستطيع عمل كل الأوامر في جملة الدوران Loop بالتسلسل حسب ترتيب الكود , لكن المقاطعات تعطينا الأفضلية دائما في مثل هذه الحالات لأنها تعتمد على "عدم التزامن Asynchronous ".
عدم التوافق هو حادث عارض يحدث خارج البرنامج الرئيسي حيث أنها يمكن ان تحدث في أي وقت , و خلال أي جزء من الكود أي بمعنى أخر , تحويل عملية التحقق من تحقق يحدث فقط خلال جزء معين في الكود , إلى تحقق آلي يتحقق من المتغيرات فور حدوثها ! .
المتحكمات المستخدمة في لوحات الأردوينو Arduino Board's هي من عائلة Atmel AVR 8bit و هي غير قادرة على تنفيذ الكثير من البرامج في آن واحد Parallel process فمثلاً المتحكم Atmega 328 يحتوي على مدخلي مقاطعة فقط (Interrupt 0 (D2 و (Interrupt 1 (D3
عدم التوافق هو حادث عارض يحدث خارج البرنامج الرئيسي حيث أنها يمكن ان تحدث في أي وقت , و خلال أي جزء من الكود أي بمعنى أخر , تحويل عملية التحقق من تحقق يحدث فقط خلال جزء معين في الكود , إلى تحقق آلي يتحقق من المتغيرات فور حدوثها ! .
المتحكمات المستخدمة في لوحات الأردوينو Arduino Board's هي من عائلة Atmel AVR 8bit و هي غير قادرة على تنفيذ الكثير من البرامج في آن واحد Parallel process فمثلاً المتحكم Atmega 328 يحتوي على مدخلي مقاطعة فقط (Interrupt 0 (D2 و (Interrupt 1 (D3
أنواع المقاطعات :
1) المقاطعات المعتمدة على البرنامج Software Interrupt حيث تستجيب للاشارات التي يعطيها البرنامج .
2) المقاطعات المعتمدة على التغيرات الخارجية Hardware Interrupt حيث تستجيب للأشارات القادمة من خارج المتحكم , بفعل التغيرات التي تحدث على مداخل المتحكم .
المتحكمات من عائلة AVR 8bit لا تدعم المقاطعات المعتمدة على البرنامج Software Interrupt , المقاطعات الخارجية هي المدعومة فقط في لغة الأردوينو .
هناك مقاطعات تعتمد على المؤقتات Timer Interrupt التي تدعمها لغة أردوينو ذات فائدة كبيرة و استخدامات شائعة .
المقاطعات الخارجية المدعومة في برمجية الأردوينو تستخدم الأمر attachInerrupt .
لكل متحكم أصغري , لائحة من أوامر المقاطعات و المداخل التي تدعم المقاطعات , لكل أمر هناك هناك ذاكرة موقع interrupt vectors memory location و عندما نفّعل أحد هذه المواقع , سينتقل البرنامج للموقع المحدد في ذاكرة الموقع , هذا هو جوهر ال ( ISR )
يوجد طريقتين يمكن تفعيل المقاطعات من خلالها , بلغة الأردوينو , و لغة الآلة Assembly ضمن بيئة أردوينو البرمجية .
لن أتكلم عن كتابة الكود بلغة الآلة , لكن سأتطرق للمقاطعة بلغة الأردوينو .
في البداية ستحتاج للمكونات التالية :
طريقة كتابة البرنامج :
الأمر الذي يستخدم لتفعيل المقاطعة Interrupt هو :
attachInterrupt();
و الصيغة الذي يكتب به هذا الكود :
attachInterrupt(interrupt, Function, mode);
interrupt: هو المدخل الذي سيحدث المقاطعة بناءاً على حالته
إما 0, 1
Function: هو البرنامج الذي سينتقل إليه العمل .
mode : هو الحالة التي لو تم تطبيقها على مدخل المقاطعة
سيدخل البرنامج إلى برنامج المقاطعة , و الحالات هي
LOW
ChANGE
RISING
FALLING
أن تعليمة delay و millis لن تعمل داخل جملة المقاطعة
لكن يجب أن تنتبه لعدة أمور في حال استدعيت المقاطعات و هي :
أن تعليمة delay و millis لن تعمل داخل جملة المقاطعة
Interrupt , و اي متغيير ستستخدمه داخل جملة المقاطعة
يجب أن يعرف بالمتغيير volatile .لذلك لا تستعمل اوامر طويلة جداً داخل جملة المقاطعة .
تذكر أن الأوامر المركبة ايضاً لا تعمل داخل جملة المقاطعة مثل digitalWrite/read و analoge Read/Write أيضاً لن تعمل داخل لبرنامج
لنأخذ الآن مثالاً بسيطاً على المقاطعات :
1) بطاقة أردوينو
2) حساس Reflected sensor IR
3)اسلاك
4) BreadBoard
و الكود أدناه
أفتح الSerial Monitor و لاحظ استمرار حدوث البرنامج المعتاد و بنفس الوقت يقوم بتعداد المرات التي يحدث فيها مرور من أمام الحساس .
0 التعليقات :
إرسال تعليق