 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:332
|
|
23-07-2017, 10:18 PM
المشاركة 5
|
|
تدريب 5 : التعامل مع مقاطعات متعددة
المقاطعات هى أحداث مجدولة والتى تجعل الميكروكونترولر PIC "يعلق" برنامجه القائم على تنفيذه ويقوم بتشغيل جزء من برنامج (برنامج فرعى يسمى روتين المقاطعة interrupt routine) مقترن بحدث .
عند اكتمال روتين المقاطعة يستمر PIC فى تنفيذ سريان البرنامج من عند نفس النقطة التى كان قد علق عندها التنفيذ.
مصادر المقاطعة تختلف تبعا لنوع الميكروكونترولر . على سبيل المثال الميكروكونترولر PIC 16F877A له 15 مصدر للمقاطعة مثل :
• المقاطعة بالمؤقت Timer0 عند حدوث طفحان بالمؤقت .
• المقاطعة عن تغيير حافة النبضة الخارجية على الطرف RB0 (تعرف بالمقاطعة الخارجية) .
• المقاطعة عند وصول البيانات التسلسلية خلال الوحدة USART .
• المقاطعة بالمحول من تناظرى لرقمى ADC عند انتهاء التحويل .
وغيرها من المقاطعات .
مترجم الميكروسى برو يتضمن دالة سابقة التعريف من أجل تنفيذ المقاطعة ، هذه الدالة هى "دالة أو روتين المقاطعة" وهى بالصيغة التالية :
void interrupt (void);
يجب إعلان هذه الدالة قبل الدالة الرئيسية .
عند حدوث مقاطعة يتم استدعاء "دالة المقاطعة" تلقائيا عن طريق البرنامج ، داخل هذه الدالة يجب تحديد ما هى المقاطعات التى يتم بدؤها وأعلام (معلمات - علامات) flags كل مقاطعة .
لإعداد المقاطعات يجب تفعيل البتات المناظرة بسجلات المقاطعة . فى الميكروكونترولر PIC16F877A ، على سبيل المثال ، سجلات المقاطعة هى : INTCON, PIR1, PIR2, PIE1 , PIE2 . الشكل التالى يبين هذه السجلات يالميكروكونترولر PIC 16F877A :

لتنفيذ المقاطعات يجب اتباع الخطوات المناسبة للإعداد مع مرعاة ما يلى :
• أولا يتم تفعيل المقاطعات المطلوب استخدامها عن طريق بت التمكين IEالمناسب مثل :
TMR0IE, INTE, RCIE وغيرها .
• يجب عدم تمكين أعلام المقاطعات مثل :
TMR0IF, INTF, RCIF وغيرها .
• يجب تمكين مقاطعات الطرفيات عندما يتطلب ذلك ، على سبيل المثال المقاطعات التابعة للسجلات :
PIE1 و PIE2.
• وأخيرا يتم تحديد set بت تمكين عموم المقاطعات : GIE .
المثال التالى سوف يستخدم فى : المقاطعة باستقبال الاتصال التسلسلى ، والمقاطعة بالمؤقت Timer 0 ، والمقاطعة الخارجية . لهذا الهدف يمكنك مراقبة وتحليل كود المصدر للبرنامج التالى :
كود:
//1-declaration interrupt function.
void interrupt ( void )
{
//A-Declaration of variables used in interrupt function.
char Data;
//B-Evaluates whether the interrupt is triggered by Timer 0, TMR0IF
if( INTCON.F2==1 )
{
//It complements the bit value RB1.
if(PORTB.F1==1)
PORTB.F1=0;
else
PORTB.F1=1;
// Turned off Timer 0 Flag.
INTCON.F2=0;
}
//C-Evaluates whether the external interrupt is triggered.
// INTF
if( INTCON.F1==1 )
{
//It complements the bit value RB2.
if(PORTB.F2==1)
PORTB.F2=0;
else
PORTB.F2=1;
//It turns off the external interrupt flag.
INTCON.F1=0;
}
//D-Evaluates whether the interruption triggered by serial reception.
if( PIR1.F5 ==1)
{
//It reads the input data.
Data = UART1_Read();
//Confirmation information is sent.
UART1_Write_Text("Input data: ");
//It sends the data received.
UART1_Write(Data);
UART1_Write(13); //ASCII code is sent enter.
UART1_Write(10); //and sends carriage return code.
//It reception apparatus for serial flag.
PIR1.F5 = 0;
}
}
void main( void )
{
//Ports are configured.
TRISB = 0b00000001;
PORTB = 0;
//Activates the serial receive interrupt.
PIE1 = 0b00100000;
//Other interrupt sources are disabled .
PIE2 = 0;
//Turn off interrupt flags.
PIR2 = 0;
PIR1 = 0;
//Setting the Timer 0 to 65.535 m Sec
OPTION_REG=0b11000111;
//Configuring the serial port at 9600 bps.
UART1_Init(9600);
//Global interrupts are enabled,
//for Timer 0, and external.
INTCON = 0b11110000;
while(1) //Infinite Loop.
{
}
}
لمحاكاة هذا البرنامج ببرنامج إيزيس يتم جلب الأجهزة التالية :
16F877A, RES, BUTTON, LED-RED والوحدة الطرفية التخيلية والأوسليسكوب .
بعد تشغيل المحاكاة يجب التفاعل مع الوحدة الطرفية لإرسال بيانات , بالمفتاح الضاغط يجب أن تشاهد حالة الليد وخرج الأوسليسكوب وعرض شكل الموجة المربعة يتغير كل 65.535 msec , تبعا للمؤقت Timer 0 .
الدائرة الكهربية :

|