|
اخي الكريم
المقاطعة الخارجية تستهلك زمن يعتمد على فترة الضغط على
السويتش المتصل مع قطب المقاطعة الخارجية
وبالنسبة للمقاطعة الداخلية فزمنها يعتمد على قيمة الهزاز الكريستالي
وهذا الزمن صغير جدا يقدر بدورات الساعة وعدد التعليمات المستخدمة
ولاتنسى اساس استخدام المقاطعه الخارجية هو ان يترك المتحكم ماينفذه بالبرنامج الرئيسي او ترتيب اولوية اللمقاطعات وتنفيذ خدمة المقاطعه واهم مثال
تنبيه الحريق
تقبل مروري
|
السلام عليكم
أخي الكريم لم انسى ذلك ..
لكن مقاطعة الطرف RB0 لا تنفذ إلا مرة واحدة مع كل ضغطة على السويتش .
المتحكم ينفذ أمر المقاطعة وهو هنا قلب حالة الخرج RC0 ثم يعود الى تنفيذ البرنامج الرئيس من أول تعليمة بعد التعليمة التي توقف عندها لحظة الضغط على السويتش.
المقاطعة تحدث نتيجة تغير الحالة على الطرف RB0
هذا التغير على الطرف إما أن يبرمج ليتحقق بحافة صاعدة أو بحافة هابطة .
هنا اختار صاحب البرنامج أن يتم بحافة صاعدة وذلك بكتابة التعليمة التالية التي تهيء البت المخصص لذلك في المسجل OPTION_REG:
|
OPTION_REG.INTEDG = 1; // Set Rising Edge Trigger for INT
|
وبناء عليه فإن زمن تنفيذ مابداخل دالة المقاطعة والعودة الى متابعة تنفيذ البرنامج الرئيس (وهو قلب حالة خرج RC0) زمن ضئيل جداو لا علاقة له بزمن الضغط على السويتش..
بقي الكلام على زمن التأخير المدرج في دالة المقاطعة: لا علاقة له بتعليمات تنفيذ المقاطعة لكنه مرتبط بطبيعة مصدر الدخل على الطرف RB0 فهو سويتش ضغطة واحدة عليه ممكن تنتج عنها عدة نبضات متتالية (مشكل الارتدادات المعروف)
وهذا هو رابط ملفات المثال والمحاكاة على بروتوس مرة أخرى:
http://up.top4top.net/downloadf-755jo71-rar.html
للرجوع الى الكود للمعاينة والتصحيح ان اقتضى الحال