- المواد المطلوبة:
- ما هي المقاطعات ومكان استخدامها:
- مخطط الدائرة وشرحها:
- محاكاة المقاطعات في الميكروكونترولر PIC:
- شرح الكود:
- عمل المقاطعات PIC16F877A:
في هذا البرنامج التعليمي سوف نتعلم كيفية استخدام المقاطعة الخارجية في PIC Microcontroller ولماذا / أين سنحتاجها. هذا جزء من تسلسل دروس الموافقة المسبقة عن علم حيث بدأنا في تعلم المتحكمات الدقيقة PIC من البداية ؛ ومن هنا يفترض هذا البرنامج التعليمي أنك على دراية بكيفية برمجة PIC MCU باستخدام MPLABX وكيفية توصيل شاشة LCD مع PIC. إذا لم يكن الأمر كذلك ، فالرجاء الرجوع إلى الروابط الخاصة بهم وقراءتها من خلال ، لأنني سوف أتخطى معظم المعلومات التي تم تناولها بالفعل هناك.
المواد المطلوبة:
- لوح أداء PIC16F877A
- شاشة LCD مقاس 16 × 2
- اضغط الزر
- توصيل الأسلاك
- مجلس الخبز
- PicKit 3
ما هي المقاطعات ومكان استخدامها:
قبل الدخول في كيفية برمجة مقاطعات الميكروكونترولر PIC ، دعونا نفهم ما هي المقاطعة في الواقع وأين نحتاج إلى استخدامها. علاوة على ذلك ، هناك الكثير من أنواع المقاطعات في Microcontroller و PIC16F877A بها حوالي 15 منها. دعونا لا نخلط بينهم جميعًا في رؤوسنا في الوقت الحالي.
وبالتالي! ما هو الانقطاع في الميكروكونترولر؟
كما نعلم جميعًا ، تُستخدم وحدات التحكم الدقيقة لأداء مجموعة من التنشيطات المحددة مسبقًا (المبرمجة) والتي تؤدي إلى تشغيل المخرجات الضرورية بناءً على المدخلات. ولكن ، بينما يكون Microcontroller الخاص بك مشغولاً بتنفيذ جزء واحد من التعليمات البرمجية ، فقد يكون هناك حالة طارئة حيث يحتاج جزء آخر من التعليمات البرمجية إلى اهتمام فوري. يجب التعامل مع هذا الجزء الآخر من التعليمات البرمجية الذي يحتاج إلى اهتمام فوري على أنه مقاطعة.
على سبيل المثال: دعنا نفكر في أنك تلعب لعبتك المفضلة على هاتفك المحمول وأن وحدة التحكم (الافتراض) داخل هاتفك مشغولة برمي جميع الرسومات المطلوبة لتستمتع باللعبة. ولكن ، فجأة تتصل صديقتك برقمك. الآن ، أسوأ شيء يحدث هو إهمال وحدة التحكم في هاتفك المحمول لإهمال مكالمة صديقاتك لأنك مشغول بلعب لعبة. لمنع حدوث هذا الكابوس ، نستخدم شيئًا يسمى المقاطعات.
ستكون هذه المقاطعات قائمة نشطة دائمًا لبعض الإجراءات المعينة التي تحدث وعندما تحدث ، فإنها تنفذ جزءًا من التعليمات البرمجية ثم تعود إلى الوظيفة العادية. يسمى هذا الجزء من الكود روتين خدمة المقاطعة (ISR). أحد المشاريع العملية التي تكون المقاطعة فيها إلزامية هو "عداد السرعة الرقمي ودائرة عداد المسافات باستخدام متحكم PIC"
يوجد في Microcontroller نوعان رئيسيان من المقاطعات. إنها مقاطعة خارجية ومقاطعة داخلية. تحدث المقاطعات الداخلية داخل Microntroller لأداء مهمة ، على سبيل المثال Timer Interrupts ، ومقاطعات ADC وما إلى ذلك.. يتم تشغيل هذه المقاطعات بواسطة البرنامج لإكمال عملية Timer أو عملية ADC على التوالي.
المقاطعة الخارجية هي التي يمكن للمستخدم تشغيلها. في هذا البرنامج سوف نتعلم كيفية استخدام مقاطعة خارجية باستخدام زر ضغط لتشغيل مقاطعة. سنستخدم شاشة LCD لعرض الأرقام المتزايدة من 0 إلى 1000 وعندما يتم تشغيل مقاطعة ، يجب أن نخطرك بها من ISR الروتيني لخدمة المقاطعة ثم نتابع مرة أخرى إلى زيادة الأرقام.
مخطط الدائرة وشرحها:
الرسم البياني لاستخدام المقاطعات PIC16F877 معطى في الصورة أعلاه. عليك ببساطة توصيل شاشة LCD بالموافقة المسبقة عن علم كما فعلنا في توصيل البرنامج التعليمي لشاشة LCD.
الآن لتوصيل دبوس المقاطعة ، يجب أن ننظر إلى ورقة البيانات لمعرفة دبوس الموافقة المسبقة عن علم المستخدم للمقاطعة الخارجية. في حالتنا i n PIC16F877A يتم استخدام 33 rd pin RBO / INT للمقاطعة الخارجية. لا يمكنك استخدام أي دبوس آخر غير هذا الدبوس. يظهر اتصال Pin لمخطط الدائرة هذا في الجدول أدناه.
رقم S. |
الرقم السري |
اسم الدبوس |
متصلا |
1 |
21 |
RD2 |
RS لشاشات الكريستال السائل |
2 |
22 |
RD3 |
E لشاشات الكريستال السائل |
3 |
27 |
RD4 |
D4 من شاشات الكريستال السائل |
4 |
28 |
RD5 |
D5 من شاشات الكريستال السائل |
5 |
29 |
RD6 |
D6 من شاشات الكريستال السائل |
6 |
30 |
RD7 |
D7 من شاشات الكريستال السائل |
7 |
33 |
RBO / INT |
اضغط الزر |
لقد قمنا بتمكين مقاومات سحب داخلية في PORT B ، وبالتالي يمكننا توصيل دبوس RB0 مباشرة بالأرض عبر زر ضغط. لذلك عندما يصبح هذا الدبوس منخفضًا ، سيتم تشغيل مقاطعة.
يمكن إجراء التوصيلات على لوحة الخبز كما هو موضح أدناه.
إذا كنت تتابع دروسنا التعليمية ، فيجب أن تكون على دراية بلوحة الأداء هذه التي استخدمتها هنا. إذا لم يكن الأمر كذلك ، فلن تحتاج إلى التفكير كثيرًا في الأمر ، ما عليك سوى اتباع مخطط الدائرة وستجعل الأشياء تعمل.
محاكاة المقاطعات في الميكروكونترولر PIC:
تم إجراء محاكاة لهذا المشروع باستخدام Proteus.
عند محاكاة المشروع ، يجب أن تشاهد سلسلة من الأرقام تتزايد على شاشة LCD. يحدث هذا داخل الحلقة الرئيسية وكلما تم الضغط على زر الضغط ، يجب أن تعرض شاشة LCD أنها دخلت في ISR. يمكنك إجراء تعديلاتك في الكود ومحاولة اختباره هنا.
شرح الكود:
يمكن العثور على الكود الكامل لهذا المشروع في نهاية هذا البرنامج التعليمي. ومع ذلك ، يتم تقسيم البرنامج إلى أجزاء مهمة وموضحة أدناه لفهم أفضل.
مثل جميع البرامج ، يجب أن نبدأ الكود عن طريق تحديد تكوين الدبوس للدبابيس التي نستخدمها في برنامجنا. نحتاج هنا أيضًا إلى تحديد أننا نستخدم RB0 / INT كدبوس خارجي للمقاطعة وليس كمدخل أو طرف إخراج. أدناه سطر من التعليمات البرمجية تمكن المقاوم سحب ما يصل الداخلي على PORTB بجعل 7 تشرين بت ك 0.
OPTION_REG = 0b00000000 ،
ثم نقوم بتمكين المقاطعات العالمية / المحيطية ونعلن أننا نستخدم RB0 كدبوس خارجي للمقاطعة.
GIE = 1 ؛ // Enable Global Interrupt PEIE = 1 ؛ // Enable the Peripheral Interrupt INTE = 1 ؛ // تمكين RB0 كطرف خارجي للمقاطعة
بمجرد تعريف دبوس RB0 على أنه دبوس مقاطعة خارجي ، في كل مرة ينخفض فيها ، ستصبح علامة المقاطعة الخارجية INTF 1 وسيتم تنفيذ الكود الموجود داخل وظيفة مقاطعة الفراغ منذ استدعاء روتين خدمة المقاطعة (ISR).
void interrupt ISR_example () {if (INTF == 1) // تم اكتشاف مقاطعة خارجية {Lcd_Clear () ؛ Lcd_Set_Cursor (1،1) ، Lcd_Print_String ("تم إدخال ISR") ؛ INTF = 0 ؛ // امسح علامة المقاطعة بعد الانتهاء منها __delay_ms (2000) ؛ Lcd_Clear () ، }}
كما ترى ، قمت بتسمية وظيفة المقاطعة باسم ISR_example. يمكنك تسميته حسب رغبتك. داخل وظيفة المقاطعة ، سنتحقق مما إذا كانت علامة INTF عالية ونقوم بتنفيذ الإجراءات المطلوبة. من المهم جدًا مسح علامة المقاطعة بمجرد الانتهاء من الروتين. عندها فقط سيعود البرنامج إلى الوظيفة الرئيسية الباطلة. يجب أن يتم هذا المقاصة عن طريق البرامج التي تستخدم الخط
INTF = 0 ؛ // امسح علامة المقاطعة بعد الانتهاء من ذلك
داخل الوظيفة الرئيسية ، نقوم فقط بزيادة رقم لكل 500 مللي ثانية ونعرضه على شاشة LCD. ليس لدينا أي خط محدد للتحقق من حالة دبوس RB0. ستبقى المقاطعة نشطة دائمًا وكلما تم الضغط على زر الضغط ، ستقفز من فراغ الرئيسي وتنفذ الخطوط في ISR.
Lcd_Set_Cursor (2،1) ، Lcd_Print_String ("داخل الحلقة الرئيسية") ؛ Lcd_Set_Cursor (1،1) ، Lcd_Print_String ("الرقم:") ؛ Lcd_Print_Char (ch1 + '0') ؛ Lcd_Print_Char (ch2 + '0') ؛ Lcd_Print_Char (ch3 + '0') ؛ Lcd_Print_Char (ch4 + '0') ؛ __delay_ms (500) ؛ رقم ++ ؛
عمل المقاطعات PIC16F877A:
بمجرد أن تفهم كيفية عمل المقاطعة ، يمكنك تجربتها على الأجهزة والعبث حولها. يعد هذا البرنامج المقدم هنا مثالًا أساسيًا جدًا للمقاطعة الخارجية حيث يقوم فقط بتغيير عرض شاشة LCD عند اكتشاف مقاطعة.
يمكن العثور على العمل الكامل للمشروع في الفيديو الوارد أدناه. آمل أن تكون قد فهمت المقاطعات وأين / كيفية استخدامها. إذا كان لديك أي شك يمكنك التواصل معي عبر المنتديات أو من خلال قسم التعليقات.