السلام عليكم
اليوم سنتحدث عن النوع الثاني من المقاطعات وهو المقاطعة على الاطراف : RB4/RB5/RB6/RB7 حيث انه عند تغير الجهد على واحد من هذه الاطراف سيكون كافيا لاحداث عملية مقاطعة . فلا نحتاج للضغط على الاطراف جميعها لاحداث مقاطعة انما اي طرف سيقوم بهذه الوظيفة . تختلف هذه المقاطعة عن المقاطعة السابقة بان اتجاه تغير الجهد على الاطراف غير محدد . اي انه عند تغير الجهد من صفر الى 5 فولت ستحدث مقاطعة .وايضا ستحدث لو تغير الجهد من 5 فولت الى صفر فولت . لذلك يجب الحذر عند التعامل مع هذه المقاطعة وعند وصل المفاتيح .لانه ان لم يتم اعطاء زمن كافي خلال البرنامج فانه عند الضغط على المفتاح ستحدث مقاطعة وعندما نبعد يدنا عن المفتاح ستحدث مقاطعة (اي سيعتقد البيك اننا عملنا مقاطعتين ، وهي في الواقع مقاطعة واحدة فيجب الاهتمام بهذه الفكرة عند عمل المقاطعة)
طبعا بما انه لدينا 4 اطراف في هذه المقاطعة فنحتاج ان نعرف اي طرف هو سبب المقاطعة .لذلك عند الدخول الى برنامج المقاطعة نختبر الاعلام اولا، ومن ثم نختبر اي طرف من الاطراف الاربعة قد سبب المقاطعة .
ملاحظات المقاطعة على الاطراف RB4-RB7 كالتالي:
1) وضع القيمة في السجل INTCON : التي تفعل المقاطعات بشكل عام وتقوم بتفعيل مقاطعة الاطرافRB4-RB7 بالاضافة الى تصفير البيت رقم 0 وهو علم حدوث المقاطعة للاطراف
RB4-RB7 ، لانه اذا لم يكن صفر فقد لا يعرف المتحكم انه حدثت مقاطعة وبالتالي لا يعمل البرنامج.
2) وضع تاخير زمني عند اختبار اي الاطراف تم حدوث مقاطعة عليها. مثل استخدام امر التاخير الزمني او الحلقة الفارغة مثلا ( While (portb.f4= = 1) {} ) وذلك لعدم حصول خطأ في عملية المقاطعة.
الان نبدا بكتابة برنامج المقاطعة والذي سينفذه البيك عند الضغط على الزر الموصل بالاطراف RB4-RB7 ، ولا ننسى انه للتاكد من حدوث المقاطعة فاننا يجب ان نقوم في بداية برنامج المقاطعة باختبار العلم المسبب للمقاطعة واذا تحقق الشرط ينفذ البرنامج ، وفي نهاية البرنامج نقوم بتصفير العلم المسبب للمقاطعة حتى نعرف اذا حدثت مقاطعة جديدة في المستقبل. وبالتالي يصبح هيكل البرنامج بشكل عام كالتالي:
كود:
void interrupt()
{
if(intcon.f0= = 1)
{
if (portb.f4= =0) { delay_ms(200); instruction 1; }
if (portb.f5= =0) { delay_ms(200); instruction 2; }
if (portb.f6= =0) { delay_ms(200); instruction 3; }
if (portb.f7= =0) { delay_ms(200); instruction 4; }
}
intcon.f0=0;
}
void main ()
{
intcon=0b10001000;
Main program
}
ففي بداية المقاطعة يتم اختبار العلم RBIF وهو البيت رقم صفر في سجل المقاطعة . واذا تحقق انه سبب المقاطعة فيتم اختبار اي مفتاح هو الذي تم ضغطه (حيث كان الفولت عليه 5 فولت وعند الضغط اصبح صفر فولت كما في الدارة التالية ):
وعند تحقق الشرط يتم تنفيذ مجموعة التعليمات للمفتاح المضغوط اي :
Instruction1-instruction4 . طبعا يتم تامين تاخير زمني للضغط على المفتاح حتى لا يعتبر البيك انه حدثت اكثر من مقاطعة . وليس لدينا من اعدادات في بداية البرنامج الرئيسي الا سجل المقاطعة فقط .
الان ملاحظة مهمة جدا : بما ان البرنامج مستحيل ان يدخل المقاطعة بدون سبب ، ولاننا في البرنامج السابق حددنا فقط سبب واحد للمقاطعة ، فان عملبة اختبار علم المقاطعة في بداية برنامج المقاطعة يمكن ان نلغيها لاننا نعرف سبب المقاطعة وبالتالي يمكن ان نحذف العبارة (if(intcon.f0= = 1) ) وبالتالي نختصر زمن تنفيذ المقاطعة باختصار تعليمة من برنامج المقاطعة . وبالتالي يصبح البرنامج له الشكل التالي:
كود:
void interrupt()
{
if (portb.f4= =0) { delay_ms(200); instruction 1; }
if (portb.f5= =0) { delay_ms(200); instruction 2; }
if (portb.f5= =0) { delay_ms(200); instruction 3; }
if (portb.f7= =0) { delay_ms(200); instruction 4; }
intcon.f0=0;
}
void main ()
{
Intcon=0b10001000;
Main program
}
(يتبع)