السلام عليكم
اليوم سنبدا باول مقاطعة من المقاطعات الثلاث التي تحدثت عنها وهي مقاطعة الطرف RB0، فكيف تحدث المقاطعة؟
ان هذه المقاطعة تحدث عندما يتغير الجهد الموجود على الطرف RB0 من الجهد 5 فولت الى صفر فولت او عندما يتغير الجهد من صفر فولت الى 5 فولت ، وهذا يتحدد حسب البيت رقم 6 في المسجل OPTION_REG ، انظر الصورة التالي:
[url=http://www.0zz0.com]
[/url]
نلاحظ ان السجل يتكون من 8 بيت ، ما يهمنا هنا البيت رقم 6 الذي يحدد اتجاه المقاطعة ، حيث انه عند وضع القيمة 1 في هذا البيت ستحدث المقاطعة عندما يتغير الجهد على RB0 الطرف من الجهد صفر فولت الى 5 فولت فقط ، اما عند وضع القيمة 0 فان المقاطعة تحدث عندما يتغير الفولت من 5 فولت الى صفر فولت فقط ،وهكذا يتم تحديد القيمة التي نضعها هنا حسب الدارة وحسب الوظيفة المطلوب تنفيذها .
ملاحظات لعمل برنامج مقاطعة للطرف RB0 فقط :
1)وضع القيمة في السجل INTCON : التي تفعل المقاطعات بشكل عام وتقوم بتفعيل مقاطعة الطرفRB0 بالاضافة الى تصفير البيت رقم 1 وهو علم حدوث المقاطعة للطرف RB0 ،لانه اذا لم يكن صفر فقد لا يعرف المتحكم انه حدثت مقاطعة وبالتالي لا يعمل البرنامج.
2)وضع القيمة في السجل OPTION_REG : وبما اننا لن نستخدم سوى مقاطعة واحدة لذلك نقوم بتصفير جميع البيتات عدا البيت رقم 7، ونضع القيمة التي تطابق الدارة المستخدمة في البيت رقم 6 .
الان نبدا بكتابة برنامج المقاطعة والذي سينفذه البيك عند الضغط على الزر الموصل بالطرف RB0 ، ولا ننسى انه للتاكد من حدوث المقاطعة فاننا يجب ان نقوم في بداية برنامج المقاطعة باختبار العلم المسبب للمقاطعة واذا تحقق الشرط ينفذ البرنامج ، وفي نهاية البرنامج نقوم بتصفير العلم المسبب للمقاطعة حتى نعرف اذا حدثت مقاطعة جديدة في المستقبل. وبالتالي يصبح هيكل البرنامج بشكل عام كالتالي:
[CODE]
void interrupt()
{
If(intcon.f1= = 1)
{
Interrupt program
}
Intcon.f1=0;
}
void main ()
{
Intcon=0b10010000;
Option_reg=0b1X000000;
Main program
}
[/CODE]
حيث ان X تكون واحد او صفر حسب الدارة الموجودة لدينا وحسب الوظيفة المطلوبة.
الان ملاحظة مهمة جدا : بما ان البرنامج مستحيل ان يدخل المقاطعة بدون سبب ، ولاننا في البرنامج السابق حددنا فقط سبب واحد للمقاطعة ، فان عملبة اختبار علم المقاطعة في بداية برنامج المقاطعة يمكن ان نلغيها لاننا نعرف سبب المقاطعة وبالتالي يمكن ان نحذف العبارة (If(intcon.f1= = 1) ) وبالتالي نختصر زمن تنفيذ المقاطعة باختصار تعليمة من برنامج المقاطعة . وبالتالي يصبح البرنامج له الشكل التالي:
[CODE]
void interrupt()
{
Interrupt program
Intcon.f1=0;
}
void main ()
{
Intcon=0b10010000;
Option_reg=0b1X000000;
Main program
}
[/CODE]
عند حدوث المقاطعة فان البرنامج يذهب الى برنامج المقاطعة وينفذه ومن ثم يعود الى النقطة التي انتهى عنها ويكمل بعدها كانه ينفذ البرنامج بدون اي مقاطعة اي لا يعود لبداية البرنامج الرئيسي انما عند النقطة التي انتهى اليها قبل عملية المقاطعة.
(يتبع )...