تدريبات :
مقدمة :
الأمر On Interrupt ولغة Basic والمترجم Proton
الغرض :
تمكين معالجة المقاطعات عن طريق روتين فرعى .
المقاطعات ميزة برمجية هامة ، ولذلك سوف نخصص لها الكثير من الوقت لشرح كيفية استخدام هذا الأمر . فى الميكروكونترولر PIC16F84A ، على سبيل المثال ، أربعة مصادر محتملة للمقاطعة : إشارة خارجية على الطرف RB0/INT و تجاوز سعةoverflowالمؤقت TMR0 ، وتغيير حالة الأطراف RB4:RB7 و اكتمال كتابة البيانات إلى الذاكرة EEPROM .
الصيغة العامة :
كود:
On Interrupt Gato Label
عند حدوث المقاطعة ، فإنها تؤدى إلى تحديد set بت العلم flag بالسجل INTCON "سجل التحكم فى المقاطعة" (السجل هو موقع بالذاكرة بحجم بايت byte واحد ) .
هذا السجل يسجل طلبات المقاطعة الفردية عن طريق إعداد البتات الفردية التى تناظر مقاطعة معينة . على سبيل المثال ، المقاطعة نتيجة إشارة خارجية على الطرف RB0/INTسوف تحدد (تجعلها بواحد) البت bit1بالسجلINTCON. البتات ، هذا النوع من البتات تسمى أعلام flags. الميكروكونترولر يستجيب لهذه الأعلام التى تم تحديدها عن طريق تشغيل روتين المقاطعة .
بالإضافة إلى تسجيل المقاطعات ، يستخدم السجل INTCON البتات الأخرى إما لتمكين أو تعطيل المقاطعات. يحتوى السجل INTCON أيضا على بت تمكين عموم المقاطعة GIE (bit 7).
من أجل التعرف على أى مقاطعة ، يجب تمكين set البت GIE . إذا تم مسح clear (0) البتGIE ، فسوف لا يتم الاستجابة لأى مقاطعة . وبالإضافة إلى ذلك ، يمكن أيضا تمكين أو تعطيل المقاطعات الفردية عن طريق تحديد أو مسح بت التحكم المناظرة بالسجل INTCON.
على سبيل المثال ، البت bit 4 (INTE) لتمكين المقاطعة بالطرف RB0/INT. لتمكين المقاطعات عن طريق هذا الطرف ، يجب تحديد البت GIE (bit 7) بالإضافة إلى البت bit 4 . يجب تمكين المقاطعة قبل استخدام الدالة On Interrupt .
فى لغة Basic والمترجم Proton يمكنك تمكين المقاطعات بالطرف RB0/INT كما يلى :
كود:
INTCON = %1001000
or
INTCON = 144
عند حدوث المقاطعة ، فإن الميكروكونترولر لا يقفز فورا إلى روتين المقاطعة المستدعى بالعنوان Label الموجود بالدالة بل يجب عليه أولا إكمال الأمر الذى يتم معالجتة حاليا ، وهذا يمكن أن يخلق تأخير بين لحظة أشارة المقاطعة وإلى حين أن يتم التعامل معها واقعيا ، فى بعض الحالات يكون التأخير كبير .
مثال :
كود:
DelayMs 10000 'pause 10 seconds
إذا حدثت المقاطعة أثناء تنفيذ هذا الأمر، فقد يكون هناك تأخير قريب من 10 ثوانى قبل أن يتم الاستجابة للمقاطعة ، وهذا الزمن طويل جدا لأى استجابة في الوقت الحرج . لذلك فعند استخدام معالجة المقاطعة فى البرمجة الخاصة بك ، تجنب استخدام تأخير من هذا القبيل. بدلا من ذلك ، يتم إعادة كتابة التأخير كما يلى :
كود:
For x = 1 to 10000
DelayMs 1
next x
باستخدام هذا الاسلوب للتأخير ، يكون زمن الاستجابة للمقاطعة ليس سوى عدد قليل من الملى ثانية.
سوف تحتاج إلى أن معرفة ثلاثة أوامر قبل أن تتمكن من كتابة برنامج مقاطعة بسيط ، وهما أمر التمكين Enable وأمر تعطيل التمكين Disable وأمر العودة Resume.
الأمر Disable :
الغرض :
تسمح بتنفيذ أقسام من برنامج بلغة Basic دون إمكانية المقاطعة . توضع الدالة Disable مباشرة "قبل" روتين معالجة المقاطعة .
الأمر Enable :
الغرض :
إستعادة قدرة الميكروكونترولر للاستجابة للمقاطعات .
كل من Disable و Enable ليست أوامر حقيقية ، بل هى توجيهات للمترجم . فعندما يصادف المترجم Disable فى البرنامج ، فإنه يخبر المترجم بعدم الاستجابة للمقاطعة فى جزء البرنامج الذى يليها ويستمر فى ذلك حتى يصادف Enable. هذا هو السبب فى وضع Disable قبل روتين معالجة المقاطعة مباشرة ووضع Enable بعده مباشرة .
الأمر Resume :
وجود الأمر Resume فى نهاية روتين خدمة المقاطعة يؤدى إلى مسح clear(0) بت عموم المقاطعات GIE أى "تعطيل تمكين جميع المقاطعات" ، وإعادة مسار تنفيذ البرنامج من حيث حدثت المقاطعة .
الهيكل العام لاستخدام المقاطعة فى لغة Basic يوضحه البرنامج التالى :
كود:
ON INTERRUPT GOTO myint ; Interrupt handler is myint
INTCON = %10010000 ; Enable RB0 interrupt
DISABLE ; Disable interrupts in handler
myint:
led = 1 ; Turn on LED when interrupted
INTCON.1 = 0 ; Clear interrupt flag
RESUME ; Return to main program
ENABLE ; Enable interrupts after handler
مثال لبرنامج مقاطعة بسيط :