إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

المقاطعات Interruptions ولغة Basic والمترجم Proton :

تقليص
X
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • المقاطعات Interruptions ولغة Basic والمترجم Proton :

    المقاطعات Interruptions ولغة Basic والمترجم Proton :
    الدالة On Interrupt ولغة Basic والمترجم Proton
    الغرض :
    تمكين معالجة المقاطعات عن طلايق روتين فرعى .
    المقاطعات ميزة برمجية هامة ، ولذلك سوف نخصص لها الكثير من الوقت لشرح كيفية استخدام هذه الدالة . فى الميكروكونترولر PIC16F84A ، على سبيل المثال ، أربعة مصادر محتملة للمقاطعة : إشارة خارجية على الطرف RB0/INT و تجاوز سعةoverflowالمؤقت TMRO ، وتغيير حالة الأطراف RB4:RB7 و اكتمال كتابة البيانات إلى الذاكرة EEPROM .
    الصيغة العامة :

    كود:
    On Interrupt Gato Label

    عند حدوث المقاطعة ، فإنها تؤدى إلى تحديد set بت العلم flag بالسجل . السجل هو موقع بالذاكرة بحجم بايت byte واحد والذى يسمى "سجل التحكم فى المقاطعة" INTCON .
    هذا السجل يسجل طلبات المقاطعة الفردية عن طريق إعداد البتات الفردية التى تناظر مقاطعة معينة . على سبيل المثال ، المقاطعة ، نتيجة إشارة خارجية ، على الطرف RB0/INTسوف تحدد (تجعلها بواحد) البت bit1بالسجلINTCON. البتات ، عندما تستخدم في هذا النوع من إشارات التطبيق ، وتسمى الأعلام flags. الميكروكونترولر يستجيب لهذه الأعلام التى تم تحديدها عن طريق تشغيل روتين المقاطعة .
    بالإضافة إلى تسجيل المقاطعات ، يستخدم السجل INTCON البتات الأخرى إما لتمكين أو تعطيل المقاطعات. يحتوى السجل INTCON أيضا على بت تمكين عموم المقاطعة GIE (bit 7).
    من أجل التعرف على أى مقاطعة ، يجب تمكين set البت GIE . إذا تم مسح clear (0) البتGIE ، فسوف لا يتم الاستجابة لأى مقاطعة . وبالإضافة إلى ذلك ، يمكن أيضا تمكين أو تعطيل المقاطعات الفردية عن طريق تحديد أو مسح بت التحكم المناظرة بالسجل INTCON.

    على سبيل المثال ، البت bit 4 لتمكين المقاطعة بالطرف 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.
    الدالة Disable :
    الغرض :
    تسمح بتنفيذ أقسام من برنامج بلغة Basic دون إمكانية المقاطعة . توضع الدالة Disable مباشرة "قبل" روتين معالجة المقاطعة .
    الدالة Enable :
    الغرض :
    إستعادة قدرة الميكروكونترولر للاستجابة للمقاطعات .
    كل من Disable و Enable ليست أوامر حقيقية ، بل هى توجيهات للمترجم . فعندما يصادف المترجم Disable فى البرنامج ، فإنه يخبر المترجم بعدم الاستجابة للمقاطعة فى جزء البرنامج الذى يليها ويستمر فى ذلك حتى يصادف Enable. هذا هو السبب فى وضع Disable قبل روتين معالجة المقاطعة مباشرة ووضع Enable بعده مباشرة .

    استخدام المقاطعة عند تغيير حالة الطرف PORTB.0 :

  • #2
    استخدام المقاطعة عند تغيير حالة الطرف PORTB.0 :
    أفضل طريقة لفهم للمقاطعة عن تغيير حالة الطرف PORTB.0 هى دراسة مثال عملى لوميض ليد أحمر كل 200 ملى ثانية ، وعند تواجد مقاطعة خارجية ( مفتاح ضاغط) يتوقف البرنامج عن العمل ويقوم بتنفيذ البرنامج الفرعى للمقاطعة والذى يحتوى على إضاء ليد أخضر لمدة ثانية ، وبمجرد أن تعيد المقاطعة البرنامج إلى البرنامج الرئيسى إلى المكان الذى حدثت عنده المقاطعة .
    الدائرة الكهربية :
    البرنامج :
    كود:
    ;Pin PORTB.0 interrupt program Device = 16F628A Xtal = 4 All_Digital True Dim redLED As PORTB.1 Dim greenLED As PORTB.2 On Interrupt GoTo green ; in case there is an interruption to go green INTCON = %10010000 ;Interrupt enable B0 PROG: ;main program High redLED ;turn on the red LED DelayMS 200 Low redLED DelayMS 200 GoTo PROG ;keep this bond Disable ;disables interrupts in the handler green: ;the interrupt handler High greenLED DelayMS 2000 Low greenLED INTCON = %10010000 ;Interrupt enable B0 Resume ;returns to the main program where integrated occurred. Enable ;Enable interrupts handler after End

    كما ترى ، عند لحظة الضغط على المفتاح الضاغط ، يتم تلقائيا الخروج من مسار البرنامج الرئيسى والقيام بتنفيذ روتين خدمة المقاطعة المسمى green ، ينتهى هذا الروتين بعبارة RESUME والتى تعود مسار تنفيذ البرنامج إلى المكان الذى حدث عنده المقاطعة ، ومع ذلك يمكنك وضع RESUME PROG3 ، فى هذه الحالة يتم الرجوع إلى PROG3 وإهمال مكان المقاطعة .
    يجب ملاحظة أن المقاطعة تحدث فقط عند تغيير حالة الطرف PORTB.0 من "0" إلى "1" ، لذلك يجب أن ندرك أنه عند الضغط على المفتاح الضاغط لا يتم توليد مقاطعة ، ولكن عند تحريره تتولد المقاطعة عند الحافة الصاعدة . لتغيير المقاطعة عند الحافة الهابطة أى عند التغيير من "1" إلى "0" ، نضيف بعد
    INTCON =% 10010000 السطر التالى ، لتغيير البت INTEDG(bit6) بالسجل PTION_REG من الحالة الافتراضية (1) إلى الصفر (0) :


    كود:
    OPTION_REG.6=0 ; change bit 6 of the OPTION register, falling edge active to B.0

    تعليق

    يعمل...
    X