قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 08-02-2012, 10:17 AM المشاركة 1   
افتراضي المقاطعات Interrupts والمفاهيم الأساسية لأنظمة التشغيل متعددة المهام للميكروكونترولر Twitter FaceBook Google+



المقاطعات Interrupts والمفاهيم الأساسية لأنظمة التشغيل متعددة المهام للميكروكونترولر PIC
في نهاية هذا الدرس والدرس القادم ، مع برنامجنا الذي سوف نقوم بتحميله بالميكروكونترولر PIC، فإننا سوف نكون قادرين على الأداء الجيد لمهمتين في آن واحد: وميض ليد وإصدار أصوات من جرز buzzer بنغمة ثابتة . هذا الشيء غير ممكن عادة بدون الحيل الخاصة وتفصيلا :
في الواقع، يتم تنفيذ برنامج بالتسلسل: تعليمة تلو الآخرى، وتنفيذ مهمتين في وقت واحد، مع هذا النظام، من المستحيل تماما. لتنفيذ اثنين أو أكثر من المهام في آن واحد يمكننا ان نتصور ان برنامجنا الرئيسي يخلق مساحة ذاكرة، والتى يعين لها مهمة: إيجاد مساحة منفصلة، حيث يمكن لمهمة العمل في وقت واحد مع البرنامج الرئيسي دون التأثير على تنفيذه العادى .


</SPAN></SPAN>

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 08-02-2012, 10:19 AM المشاركة 2   
افتراضي


المقاطعات Interrupts :
مفتاح الحصول على ذلك هو "المقاطعة بالمؤقت". يمكن للمؤقت Timer0 بالميكروكونترولر PIC توليد مقاطعة . ولكن خطوة بخطوة , ما هى المقاطعة ؟
تخيل : أننا بالمنزل نقوم بأعمالنا المعتادة , ولسنا في حاجة إلى رفع سماعة الهاتف بين الحين والآخر، وذلك لأن الهاتف سوف ينبهك مما يسمح لك بوقف ما تقوم به لكى نفرغ أنفسنا للهاتف .
والمفهوم الرئيسي: رنين الهاتف هو المقاطعة بالنسبة لنا : يسمح لنا بأن نتوقف مؤقتا عما كنا نقوم به لتفريغ أنفسنا للحالة التي ولدت المقاطعة حتى نقرر استئناف عملنا من حيث كنا.
المقاطعة الدورية (حيث يتم تشغيل ذلك بواسطة بالمؤقت )، المرتبطة بعدادات مختلفة، تساعدنا على خلق النظم التي تعمل مهام متعددة في الوقت الحقيقي أى تؤدي وظائف متعددة في وقت واحد، بشكل مستقل عن البرنامج الرئيسي .

مصادر المقاطعة للميكروكونترولر PIC :
مثال الهاتف شيء تافه جدا، بالطبع، ولكنه يوضح مفهوم أساس المقاطعة. في الميكروكونترولر PICأكثر من "جرس" والتي تسمح لنا بوقف برنامجنا للحظات عند نقطة، والتفرغ لمهمة معينة، ومن ثم نستأنف من المكان المحدد حيث كنا قد توقفنا .
المصادر المختلفة المقاطعة، ولا سيما في الميكروكونترولر PIC16F877، هي:
1- المقاطعة على تجاوزOverflow (فيضان) المؤقت Timer0 (يتم بيان ذلك عن طريق بتات الأعلام T0IF أو TMR0IF): إن المؤقت Timer0 هو عداد مكون من 8 بت والذى يتزايد تلقائيا (بغض النظر عن ما يقوم به البرنامج الرئيسي) على فترات زمنية متقاربة جدا . يمكننا تحديد عدد مرات التي ينبغي أن تتزايد عن طريق الإعدادات المناسبة (والذي نتناولها في الدرس التالي). كونه عداد من 8 بت، ويمكن أن يكون له قيم تتراوح بين 0 إلى 255. عندما يصل إلى 255 ويحين التزايد التالى يصبح العداد بصفر ممن خلال رفع علم المقاطعة، يمكننا الكشف عنها واستغلالها. "فقط هذه الوظيفة التي نستخدمها (هو الأكثر استغلالا بشكل عام) .
2- المقاطعة الخارجة على الطرف RB0(INTF) :
الطرف رقم 33 بالميكروكونترولر PIC16F877 هو الطرف RB0/INT . وجود الشرطة المائلة بين اسماء متعددة تعنى أن الطرف له أكثر من وظيفة . فى الحقيقة , هذا الطرف مخصص للعمل كمدخل / مخرج I/O رقمى , ولكن غذا تم تهيئته كمدخل وإذا قمنا بتمكين عمل المقاطعة على الطر ف RB0 فسوف يولد مقاطعة حينما يتم وضع هذا الطرف فى الحالة المنطقية المرتفعة "خارجيا" . فى الحقيقة تعرف هذه المقاطعة بالمقاطعة الخارجية حيث لا تتولد بدوائر داخل الميكروكونترولر بل بدوائر خارجية .
3- المقاطعة عند تغيير حالة الأطراف RB4-RB7(RBHF) :
يمكنك أيضا التحقق من المقاطعة عند تغيير حالة واحدة من هذه الأطراف الأربعة , من الواضح أننا إذا قمنا بتمكين عمل هذا المصدر للمقاطعة، فإنه فقط بمجرد تغيير وضعية طرف واحد على الأقل من الأربعة أطراف يؤدى إلى توليد المقاطعة.
4- مقاطعة الجهاز (الميكروكونترولر) :


هذه الفئة هى قائمة بالمقاطعات التي يتم توليدها عن طريق الأجهزة مثل :
  • ذاكرة EEPROM الداخلية (ترتيب عمليات الكتابة على ذاكرة EEPROM الداخلية , عندما يتم تمكين هذا المصدر للمقاطعة، وعندما نكتب أى نرسل بيانات إلى ذاكرة EEPROM وتنتهى الكتابة فسوف تحدث مقاطعة ).
  • و الفيضان overflowفي المؤقت timer1 .
  • واستقبال بايت في حافز (عازل) buffer الاتصال التسلسلي، وما إلى ذلك.
ومن الواضح أن بعض هذه المقاطعات تتوفر فقط فى بعض الميكروكونترولر PIC(على سبيل المثال، USART، الذي يسمح بالاتصالات التسلسلية ، أو موديول MSSP الذى يسمح بالاتصالات التسلسية نوع 2C أو نوع SPI وهى غير متوفرة في جميع PIC).




عند حدوث المقاطعة , فإنها تطلق الأحداث التالية :
  • يتم مقاطعة البرنامج الرئيسي.
  • يتم حفظ القيمة العددية لعداد البرنامج PC (عداد البرنامج هو عداد داخلى بالميكروكزنترولر الذي يأخذ في الاعتبار السطر الذى يتم تنفيذه من البرنامج) في المكدس (وهو سجل خاص لتخزين هذه القيمة).
  • يقفز (يثب) الميكروكونترولر إلى موقع ذاكرة محددة (يسمى متجه المقاطعة) والذى هو فى الواقع يحتفظ بالتعليمات التى يتم تنفيذها فى حالة المقاطعات.
  • يقوم الميكروكونترولر بتنفيذ التعليمات الموجودة عند متجه المقاطعة.
  • بعد الانتهاء من تنفيذ هذه التعليمات فإن الميكروكونترولر يلتقط من المكدس السطر الذى توقف عنده البرنامج الرئيسى .
  • يستأنف البرنامج الرئيسي التنفيذ من النقطة التي توقف عندها عند حدوث المقاطعة .
فى لغة السى مجرد ذكر كلمة " المقاطعة " interrupt قبل اسم الدالة المراد تنفيذها فيقوم المترجم بوضع هذه التعليمات فى موقع الذاكرة المناسب للميكروكونترولر PIC الخاص الذى تم اختياره للقيام بالمهمة .

فى المترجم الميكروسى برو نكتب :
void interrupt(void);
{
}

كود:
void interrupt(void); { }
أى أنه : في كل مرة تحدث مقاطعة، سوف يقوم الميكروكونترولر PICبأداء هذه المهمة</SPAN> تلقائيا ، والتوقف للحظات عن تنفيذ البرنامج الرئيسى . فى هذه الدالة يتم تحديد التعليمات التى يتم تنفيذها عند حدوث المقاطعة وعادة ما يتم ذلك عن طريق تنفيذ سلسلة من عبارة الشرط IF</SPAN> على مجموعة أعلام المقاطعة. فى الواقع، إذا حدثت مقاطعة بسبب المؤقت Timer0، فإنه تلقائيا يتم جعل علمها (T0IF) فى الحالة TRUE=1,ومن ثم</SPAN> يمكننا معرفة ما الذي تسبب في المقاطعة، ونتصرف على هذا الاساس . بإنتهاء تنفيذ التعليمات يجب أن تكون مهمتنا عمل "إعادة" reset يدويا لهذا العلم للحالة FALSE=0، وإلا فإننا لن نكون قادرين على تكرار حدوث المقاطعة :


كود:
void interrupt (  ) { if  ( T0IF )  {  / / here are the instructions to be executed if the interrupt was caused by the Timer0  T0IF = 0 ; / / I have to reset the flag or I will no longer interrupt     } }
من الواضح
أن كتابتنا لوظيفة خاصة في متجه المقاطعة ليست كافية للتعامل مع المقاطعة: يجب عليك تمكين enableالمقاطعات . يتم ذلك من خلال علم flagخاص</SPAN> في سجل تهيئة (إعداد) المقاطعة، والمعروف باسم INTCON (راجع الداتا شيت ).

كما ترى بعض البتات يشار إليها "بالعلم" Flag والأخرى يشار إليها "بالتمكين" Enable . بتات التمكين هى فى الأساس "مفاتيح" Switches والتى تسمح بالتمكين أو عدم التمكين لحدوث مقاطعة معينة.
فى حين أن "العلم" هى "جواسيس" والتي</SPAN> تحذرنا إذا وقعت مقاطعة من نوع معين من أنواع المقاطعات. ويتم جعلها فى حالة "تعيين" set ( أى جعلها true=1 ) تلقائيا بالميكروكونترولر ويجب أن يتم "إعادتها" reset (جعلها false=0) بواستطنا عن طريق البرامج .
</SPAN>تحديد المقاطعة يمكن أن يتم دفعة واحدة بتحديد سجل التحكم فى المقاطعة INTCON بإعطائه قيمة عددية أو تحديد بت تلو الأخرى . فيما يلى شرح لكل بت :



بتات التمكين :
  • GIE بت تمكين عموم المقاطعة : هى مفتاح يكون فى الوضع العادى بصفر وهذا يعنى "عدم تمكين" disable جميع أنواع المقاطعات .
  • PEIE بت تمكين المقاطعة بالمحيطات , لتمكين وعدم تمكين الأجهزة ( EEPROM و TIMER1 و USART و...)
  • TMR0IE تمكين وعدم تمكين المقاطعة نتيجة حدوث فيضان بالمؤقت Timer0 .
  • INIE تمكين وعدم تمكين الدخل المشار إليه بكلمة INT(RB0) .
  • RBIE تمكين وعدم تمكين المقاطعة نتيجة تغير حالة الأطراف الأربعة RB4-RB7 .

بتات الأعلام :
  • TMR0F : علم المقاطعة بالمؤقت Timer0 . يتم جعله true=1 تلقائيا عندما ينهى المؤقت Timer0 عده ويعود مرة أخرى ( حدوث فيضان overflow) . يشار إليه ايضا بالحروف T0IF .
  • INTF "علم INT " يتم جعله true=1 تلقائيا إذا تم جعل الطرف RB0/INT بالحالة المنطقية المرتفعة من مصدر خارجى .
  • RBIF "علم المقاطعة RB" يتم جعله true=1 تلقائيا إذا تغيرت حالة أحد الأطراف الأربعة RB4-RB7 .
جميع الأعلام يجب "إعادتها" reset ( جعلها false=0)عن طريق البرنامج حتى نتمكن من مراقبة المقاطعة.

إذا أردنا تمكين المقاطعة بالمؤقت Timer0 نتيجة حدوث الطفحان يمكننا تنفيذ ذلك بطريقتين : بتحديد سجل النحكم فى المقاطعة INTCON دفعة واحدة :

كود:
 

// Set interruptINTCON = 0b10100000 ; // bit 0 -> RBIF - Flag interrupt on port B // bit 1 -> INTF - Interrupt Flag of RB0/INT // bit 2 -> T0IF - on Timer0 interrupt flag // bit 3 -> RBIE, Interrupt on port B disabled // bit 4 -> INTE, Interrupt port RB0/INT disabled // bit 5 -> TMR0IE, Interrupt on Timer0 enabled // bit 6 -> PEIE, device interrupts disabled 
// bit 7 -> GIE, Management Interrupt Active

نفس الشىء يمكن كتابته بالشكل التالى :

كود:
INTCON = 0xA0 ; / / I've written in hexadecimal

أو :

كود:
INTCON = 160 ; / / I've written in decimal
أو يمكننا تحديد البتات بطريقة منفردة وهى أسهل فى التذكر :

كود:
TMR0IE = 1 ; // enable the management sull'overflow Timer0 interrupt GIE = 1 ;  // enable interrupt the operation of all

في البرنامج، سوف نحدد بعد ذلك المقاطعة التى تسببت القفز إلى متجه المقاطعة .
فى الموضوع القادم سوف نرى كيف نقوم بتعيين set المؤقت Timer0 للتأكد من أن المقاطعة تحدث بأسرع ما نريد ونستخدمها للتأكد من أن الميكروكوزنترولر PIC ينفذ أمرين فى وقت واحد : الأول , وميض ليد متصل بطرف والثانى , إخراج موجة مربعة لتشغيل جرس buzzer متصل بطرف آخر .




اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:24 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025