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

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

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 10,061
نشاط [ حيدر علاج حسن ]
قوة السمعة:395
قديم 08-06-2009, 11:57 PM المشاركة 41   
افتراضي



نعم وفقت ان شاء الله واتمنى لك و للاخ فادي التوفيق من الله اكثر و اكثر
مع تحياتي

حيدر علاج حسن
اعلانات

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 13-06-2009, 10:45 PM المشاركة 42   
افتراضي مقاطعة الطرف RB0 ...


السلام عليكم

اليوم سنبدا باول مقاطعة من المقاطعات الثلاث التي تحدثت عنها وهي مقاطعة الطرف RB0، فكيف تحدث المقاطعة؟

ان هذه المقاطعة تحدث عندما يتغير الجهد الموجود على الطرف RB0 من الجهد 5 فولت الى صفر فولت او عندما يتغير الجهد من صفر فولت الى 5 فولت ، وهذا يتحدد حسب البيت رقم 6 في المسجل OPTION_REG ، انظر الصورة التالي:

[url=http://www.0zz0.com][/url]


نلاحظ ان السجل يتكون من 8 بيت ، ما يهمنا هنا البيت رقم 6 الذي يحدد اتجاه المقاطعة ، حيث انه عند وضع القيمة 1 في هذا البيت ستحدث المقاطعة عندما يتغير الجهد على RB0 الطرف من الجهد صفر فولت الى 5 فولت فقط ، اما عند وضع القيمة 0 فان المقاطعة تحدث عندما يتغير الفولت من 5 فولت الى صفر فولت فقط ،وهكذا يتم تحديد القيمة التي نضعها هنا حسب الدارة وحسب الوظيفة المطلوب تنفيذها .

ملاحظات لعمل برنامج مقاطعة للطرف RB0 فقط :
1)وضع القيمة في السجل INTCON : التي تفعل المقاطعات بشكل عام وتقوم بتفعيل مقاطعة الطرفRB0 بالاضافة الى تصفير البيت رقم 1 وهو علم حدوث المقاطعة للطرف RB0 ،لانه اذا لم يكن صفر فقد لا يعرف المتحكم انه حدثت مقاطعة وبالتالي لا يعمل البرنامج.
2)وضع القيمة في السجل OPTION_REG : وبما اننا لن نستخدم سوى مقاطعة واحدة لذلك نقوم بتصفير جميع البيتات عدا البيت رقم 7، ونضع القيمة التي تطابق الدارة المستخدمة في البيت رقم 6 .


الان نبدا بكتابة برنامج المقاطعة والذي سينفذه البيك عند الضغط على الزر الموصل بالطرف RB0 ، ولا ننسى انه للتاكد من حدوث المقاطعة فاننا يجب ان نقوم في بداية برنامج المقاطعة باختبار العلم المسبب للمقاطعة واذا تحقق الشرط ينفذ البرنامج ، وفي نهاية البرنامج نقوم بتصفير العلم المسبب للمقاطعة حتى نعرف اذا حدثت مقاطعة جديدة في المستقبل. وبالتالي يصبح هيكل البرنامج بشكل عام كالتالي:

[CODE]
void interrupt()
{

If(intcon.f1= = 1)
{
Interrupt program
}

Intcon.f1=0;
}

void main ()
{

Intcon=0b10010000;
Option_reg=0b1X000000;

Main program

}
[/CODE]


حيث ان X تكون واحد او صفر حسب الدارة الموجودة لدينا وحسب الوظيفة المطلوبة.
الان ملاحظة مهمة جدا : بما ان البرنامج مستحيل ان يدخل المقاطعة بدون سبب ، ولاننا في البرنامج السابق حددنا فقط سبب واحد للمقاطعة ، فان عملبة اختبار علم المقاطعة في بداية برنامج المقاطعة يمكن ان نلغيها لاننا نعرف سبب المقاطعة وبالتالي يمكن ان نحذف العبارة (If(intcon.f1= = 1) ) وبالتالي نختصر زمن تنفيذ المقاطعة باختصار تعليمة من برنامج المقاطعة . وبالتالي يصبح البرنامج له الشكل التالي:

[CODE]
void interrupt()
{

Interrupt program

Intcon.f1=0;
}

void main ()
{

Intcon=0b10010000;
Option_reg=0b1X000000;

Main program

}
[/CODE]

عند حدوث المقاطعة فان البرنامج يذهب الى برنامج المقاطعة وينفذه ومن ثم يعود الى النقطة التي انتهى عنها ويكمل بعدها كانه ينفذ البرنامج بدون اي مقاطعة اي لا يعود لبداية البرنامج الرئيسي انما عند النقطة التي انتهى اليها قبل عملية المقاطعة.

(يتبع )...


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 13-06-2009 الساعة 10:51 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 13-06-2009, 10:47 PM المشاركة 43   
افتراضي تكملة المقاطعة RB0 ...


تكملة الموضوع السابق لمقاطعة الطرف RB0 :


الان ننتقل الى الجانب العملي لنفهم الموضوع بشكل افضل.

مثال : اريد كتابة برنامج فلاشر له عده اشكال للاضاءة واقوم بالتغيير بين الاشكال باستخدام المقاطعة. شكل الفلاشر كالتالي:

1)برنامج يقوم بعمل اضاءة لكل البورت C ومن ثم اطفاؤها .
2)برنامج يقوم باضاءة الاطراف الزوجية ثم الفردية في البورت C .
3)برنامج يقوم باضاءة C0 ثم C1 الى C7 .

وذلك حسب الدارة التالية:

[url=http://www.0zz0.com][/url]


الجواب :
ان البرنامج الذي يقوم بهذه الوظيفة هو التالي:

[CODE]

char m=0;
void interrupt ()
{
m++;
if(m==3) m=0;

intcon.f1=0;

}

void Sub1()
{
Portc=0B11111111;
Delay_ms(500);
Portc=0;
Delay_ms(500);
}

void sub2()
{
Portc=0B10101010;
Delay_ms(500);
Portc=0;
Delay_ms(500);
Portc=0B01010101;
Delay_ms(500);
Portc=0;
Delay_ms(500);
}

void sub3()
{
for(portc=1;portc!=0;portc*=2)
delay_ms(500);
}

void main()
{
Trisb.f0=1;
Trisc=0;
Portc=0;
Intcon=0b10010000;
Option_reg=0b10000000;
while(1)
{
if(m==0) sub1();
if(m==1) sub2();
if(m==2) sub3();
}
}
[/CODE]

يحتوي البرنامج السابق على 3 برامج فرعية هي : sub1,sub2,sub3 وتنفيذ البرنامج الفرعي يعتمد على قيمة المتغير m ففي حال كانت تساوي صفر ينفذ البرنامج الاول ، واذا كانت واحد ينفذ البرنامج الثاني ، واذا كانت اثنان ينفذ البرنامج الثالث ، طبعا المقاطعة تقوم فقط بزيادة قيمة المتغير m وتجعل قيمة المتغير صفر اذا زادت القيمة عن 2 وبالتالي يعود لتنفيذ البرنامج الاول وهكذا .
ملاحظة : يمكن تنفيذ البرنامج بدون مقاطعة وانما بالاطراف العادية ، ولكن كتبتها بالمقاطعة لتوضيح فكرة المقاطعة فقط.

ملاحظة : ملفات المشروع موجود على الرابط التالي لمن اراد تجربة المشروع وان يرى كيفية عمله وعمل المقاطعة ولاي استفسار ..الرابط التالي للمشروع هو

http://filaty.com/f/906/57681/RB0.rar.html

واخر دعوانا ان الحمدلله رب العالمين...وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم...


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 13-06-2009 الساعة 10:56 PM

الصورة الرمزية ahmad72
ahmad72
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2004
المشاركات: 729
نشاط [ ahmad72 ]
قوة السمعة:109
قديم 14-06-2009, 07:01 AM المشاركة 44   
sun


السلام عليكم رحمه الله وبركاته
شكرا استاذ فادى على هذا المجهود
جزاك الله خيرا
السلام عليكم


الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,073
نشاط [ عطية حسن محمود ]
قوة السمعة:124
قديم 14-06-2009, 05:55 PM المشاركة 45   
افتراضي


ممتاز اخى فادى
شرح جميل وواضح
جزاك الله عنا خيرا


عادل100
:: مهندس ::
تاريخ التسجيل: Apr 2009
المشاركات: 20
نشاط [ عادل100 ]
قوة السمعة:0
قديم 14-06-2009, 07:45 PM المشاركة 46   
x6


السلام عليكم
شكرا يا استاذ فادى على الشرح الاكثر من رائع
ولاكن عندى سؤال
ما هى فائده باقى محتويات السجل OPTION_REG
شكرا جزيلا لك وجزاك الله خير


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:106
قديم 14-06-2009, 09:11 PM المشاركة 47   
افتراضي


السلام عليكم
شكرا يا استاذ فادى على الشرح الاكثر من رائع
ولاكن عندى سؤال
ما هى فائده باقى محتويات السجل OPTION_REG
شكرا جزيلا لك وجزاك الله خير
السلام عليكم

اهلا بك اخي عادل ... ان باقي البتات لها وظائف في المقاطعة الاخيرة وهي التايمر زيرو..وان شاء الله ستعرف وظيفة كل بت ان شاء الله...


الاخوة الاعزاء اشكركم على ردودكم الطيبة والمشجعة..وان شاء الله ربنا يوفقنا جميعا لما يحبه ويرضاه..

واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 15-06-2009, 11:04 AM المشاركة 48   
افتراضي


أخى فادى جزاك الله عنا خيرا و رزقك من فضله ...

إضافة رد

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

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

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


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

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