الخميس، 14 مارس، 2013

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


المقاطعات Interrupt

ضمن برمجية الأردوينو 

(1)


في هذه التدوينة , سأقوم بشرح أحد أهم المواضيع في برمجة المتحكمات الأصغرية Microcontroller, موضوع المقاطعات Interrupt , فما هي المقاطعات ؟ و متى تستخدم ؟ و كيف نكتب الكود الخاص بها ؟

ما هي المقاطعات 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 
Pic taken from http://avrprogrammers.com

أنواع المقاطعات :

هناك نوعان من المقاطعات :
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 لن تعمل داخل جملة المقاطعة 
Interrupt , و اي متغيير ستستخدمه داخل جملة المقاطعة 
يجب أن يعرف بالمتغيير volatile .لذلك لا تستعمل اوامر طويلة جداً داخل جملة المقاطعة .

تذكر أن الأوامر المركبة ايضاً لا تعمل داخل جملة المقاطعة مثل digitalWrite/read و analoge Read/Write  أيضاً لن تعمل داخل لبرنامج 






لنأخذ الآن مثالاً بسيطاً على المقاطعات :



في البداية ستحتاج للمكونات التالية :
1) بطاقة أردوينو 
2) حساس Reflected sensor IR 
3)اسلاك
4) BreadBoard




التوصيل يكون فقط بتوصيل قطبي التغذية , و طرف البيانات مع المدخل D2 

و الكود أدناه


//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/
//****************************************************
//Name :Mohannad Rawashdeh .
//Date "30/6/2012 3:00pm
// Description: This  Code for Sow how interruupt works  with arduino board using IR Reflected sensor connected to D2
// Programmed for http://genotronex.blogspot.com/

int interrupt_pin=2; //Define pin D2 
int led=13;
volatile int count=0;
void setup(){
  Serial.begin(9600);
  pinMode(interrupt_pin,INPUT);
  pinMode(led,OUTPUT);
  attachInterrupt(0,counter,RISING);//inter to the interrupt mode
  //if sensor change from off to on 
}

void loop(){
  digitalWrite(led,HIGH);
  delay(500);
  digitalWrite(led,LOW);
  delay(500);
  Serial.print("counter = ");
   Serial.println(count);
}
  void counter(){
    count++;
  }

أفتح الSerial Monitor و لاحظ استمرار حدوث البرنامج المعتاد و بنفس الوقت يقوم بتعداد المرات التي يحدث فيها مرور من أمام الحساس .



يمكن الأستفادة من هذه التقنية في العديد من تطبيقات البرمجة المختلفة , و سأتحدث عن المؤقتات Timer في وقت لاحق .

تحياتي 


0 التعليقات :

إرسال تعليق

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.