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

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

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



السلام عليكم

اليوم سنتحدث عن النوع الثاني من المقاطعات وهو المقاطعة على الاطراف : RB4/RB5/RB6/RB7 حيث انه عند تغير الجهد على واحد من هذه الاطراف سيكون كافيا لاحداث عملية مقاطعة . فلا نحتاج للضغط على الاطراف جميعها لاحداث مقاطعة انما اي طرف سيقوم بهذه الوظيفة . تختلف هذه المقاطعة عن المقاطعة السابقة بان اتجاه تغير الجهد على الاطراف غير محدد . اي انه عند تغير الجهد من صفر الى 5 فولت ستحدث مقاطعة .وايضا ستحدث لو تغير الجهد من 5 فولت الى صفر فولت . لذلك يجب الحذر عند التعامل مع هذه المقاطعة وعند وصل المفاتيح .لانه ان لم يتم اعطاء زمن كافي خلال البرنامج فانه عند الضغط على المفتاح ستحدث مقاطعة وعندما نبعد يدنا عن المفتاح ستحدث مقاطعة (اي سيعتقد البيك اننا عملنا مقاطعتين ، وهي في الواقع مقاطعة واحدة فيجب الاهتمام بهذه الفكرة عند عمل المقاطعة)

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

ملاحظات المقاطعة على الاطراف RB4-RB7 كالتالي:

1) وضع القيمة في السجل INTCON : التي تفعل المقاطعات بشكل عام وتقوم بتفعيل مقاطعة الاطرافRB4-RB7 بالاضافة الى تصفير البيت رقم 0 وهو علم حدوث المقاطعة للاطراف
RB4-RB7 ، لانه اذا لم يكن صفر فقد لا يعرف المتحكم انه حدثت مقاطعة وبالتالي لا يعمل البرنامج.
2) وضع تاخير زمني عند اختبار اي الاطراف تم حدوث مقاطعة عليها. مثل استخدام امر التاخير الزمني او الحلقة الفارغة مثلا ( While (portb.f4= = 1) {} ) وذلك لعدم حصول خطأ في عملية المقاطعة.

الان نبدا بكتابة برنامج المقاطعة والذي سينفذه البيك عند الضغط على الزر الموصل بالاطراف RB4-RB7 ، ولا ننسى انه للتاكد من حدوث المقاطعة فاننا يجب ان نقوم في بداية برنامج المقاطعة باختبار العلم المسبب للمقاطعة واذا تحقق الشرط ينفذ البرنامج ، وفي نهاية البرنامج نقوم بتصفير العلم المسبب للمقاطعة حتى نعرف اذا حدثت مقاطعة جديدة في المستقبل. وبالتالي يصبح هيكل البرنامج بشكل عام كالتالي:
كود:
void interrupt()
{
 
if(intcon.f0= = 1) 
  {
 
if (portb.f4= =0)  { delay_ms(200);  instruction 1; }
if (portb.f5= =0)  { delay_ms(200);  instruction 2; }
if (portb.f6= =0)  { delay_ms(200);  instruction 3; }
if (portb.f7= =0)  { delay_ms(200);  instruction 4; }
 
}
 
intcon.f0=0;
}
 
void main ()
{
 
intcon=0b10001000;
 
Main program 
}
ففي بداية المقاطعة يتم اختبار العلم RBIF وهو البيت رقم صفر في سجل المقاطعة . واذا تحقق انه سبب المقاطعة فيتم اختبار اي مفتاح هو الذي تم ضغطه (حيث كان الفولت عليه 5 فولت وعند الضغط اصبح صفر فولت كما في الدارة التالية ):


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

الان ملاحظة مهمة جدا : بما ان البرنامج مستحيل ان يدخل المقاطعة بدون سبب ، ولاننا في البرنامج السابق حددنا فقط سبب واحد للمقاطعة ، فان عملبة اختبار علم المقاطعة في بداية برنامج المقاطعة يمكن ان نلغيها لاننا نعرف سبب المقاطعة وبالتالي يمكن ان نحذف العبارة (if(intcon.f0= = 1) ) وبالتالي نختصر زمن تنفيذ المقاطعة باختصار تعليمة من برنامج المقاطعة . وبالتالي يصبح البرنامج له الشكل التالي:
كود:
void interrupt()
{
 
if (portb.f4= =0)  { delay_ms(200);  instruction 1; }
if (portb.f5= =0)  { delay_ms(200);  instruction 2; }
if (portb.f5= =0)  { delay_ms(200);  instruction 3; }
if (portb.f7= =0)  { delay_ms(200);  instruction 4; }
 
 
intcon.f0=0;
}
 
void main ()
{
 
Intcon=0b10001000;
 
Main program 
}
(يتبع)


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 22-06-2009 الساعة 08:58 PM
اعلانات

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


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

الان نريد تنفيذ البرنامج السابق مع تعديل بسيط . طبعا البرنامج هو كالتالي:

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

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

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



الان التعديل سيكون كالتالي:
عند الضغط على RB4 ينتقل الى البرنامج التالي (اذا كان في 1 ينتقل الى 2 وهكذا )
عند الضغط على RB5 ينتقل الى البرنامج السابق ( اذا كان في 2 ينتقل الى 1 وهكذا )
عند الضغط على RB6 يطبق البرنامج الثاني .
عند الضغط على RB7 يطبق البرنامج الثالث .

الجواب :

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

كود:
char m=0;
void interrupt ()
{
if (portb.f4==0)  { delay_ms(200);  m++;  if (m==3) m=0;}
if (portb.f5==0)  { delay_ms(200);  m--; if(m==255) m=2;}
if (portb.f6==0)  { delay_ms(200);  m=1; }
if (portb.f7==0)  { delay_ms(200);  m=2; }
intcon.f0=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=0b11110000;
Trisc=0;
Portc=0;
intcon=0b10001000;
while(1)
{
if(m==0) sub1();
if(m==1) sub2();
if(m==2) sub3();
}
}
يحتوي البرنامج السابق على 3 برامج فرعية هي : sub1,sub2,sub3 وتنفيذ البرنامج الفرعي يعتمد على المفتاح الذي تم الضغط عليه . فاذا تم الضغط على RB4 ينتقل الى البرنامج التالي (فان كان في البرنامج الاول ينتقل الى الثاني وهكذا ) ، اما اذا تم الضغط على المفتاح RB5 ينتقل الى البرنامج السابق (فان كان على البرنامج الاول الثاني ينتقل الى الاول وهكذا ) ،اما اذا تم الضغط على RB6 فانه ينفذ البرنامج الثاني ، واذا تم الضغط على RB7 فينفذ البرنامج الثالث .

ملاحظة : يمكن تنفيذ البرنامج بدون مقاطعة وانما بالاطراف العادية ، ولكن كتبتها بالمقاطعة لتوضيح فكرة المقاطعة فقط.

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

http://filaty.com/f/906/38940/RB4_RB7_INT.rar.html

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


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

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


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


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 19-06-2009, 02:34 PM المشاركة 52   
افتراضي


السلام عليكم ورحمة الله وبركاته

ماشاء الله عليك أخى فادى .....

شرح وافى وكافى ...... ربنا يجعله فى ميزان حسناتك


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


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

حيدر علاج حسن

شعاع الحرية
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
الدولة: فلسطين المحتلة
المشاركات: 64
نشاط [ شعاع الحرية ]
قوة السمعة:0
قديم 19-06-2009, 10:45 PM المشاركة 54   
افتراضي


بارك الله فيك أخي فادي ....

مجهوووود رائع بلا شك ..

وننتظر المزيد ..


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


اخى العزيز / فادى
void x();
{----}
void y()
{-----}
void main()
{;trisb=0
portb=0;
for(;

{
{if(portb.f0==1)
{------}
else if(portb.f1==1)
{-----}
}
}
عند تنفيذ البرنامج يحقق شرط واحد اى لو ضغطت على زر يحقق الشرط الاول يستجيب وعند الضغط على الزر الذى يحقق الشرط الثانى لا يستجيب
والعكس بالعكس
ما هو السبب


التعديل الأخير تم بواسطة : عطية حسن محمود بتاريخ 19-06-2009 الساعة 11:08 PM

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


اخى العزيز / فادى
void x();
{----}
void y()
{-----}
void main()
{;trisb=0
portb=0;
for(;

{
{if(portb.f0==1)
{------}
else if(portb.f1==1)
{-----}
}
}
عند تنفيذ البرنامج يحقق شرط واحد اى لو ضغطت على زر يحقق الشرط الاول يستجيب وعند الضغط على الزر الذى يحقق الشرط الثانى لا يستجيب
والعكس بالعكس
ما هو السبب
السلام عليكم جميعا
ارجو ان يكون الجميع على خير ما يرام..واشكركم جميعا على تواجدكم في هذا المنتدى ودعمكم لجميع الافراد الموجودين فيه بما فيهم اخوكم الصغير geniusse01 ربنا يوفقكم جميعا ويجزيكم خير الجزاء وينفع بكم الاسلام والمسلمين..

اخونا ومشرفنا الغالي
البرنامج ليس واضح كثيرا بالاختصارات الموجودة فيه...يمكنك وضع البرنامج باكمله..بجميع الاحوال قم بتفقد الاقواس { } وتاكد انه يتبع لاي شرط او برنامج..فقد كانت تحدث معي الكثير من الاخطاء بسبب قوس ناقص..بما فهمت من البرنامج فانه يتفقد ضغط احد المفتاحين الموصلين على البورت ب وهما البين رقم صفر وواحد..فيجب انه عند تنفيذ شرط معين ان ينفذ احدهما وليس الاثنين..عادة كلمة else تسبب لي المشاكل فتاكد من وجود اقواس تحصر جملة الشرط If وكل ما تحتويه داخل قوسين تابعين لكلمة else... وربما يكون السبب وجود وقت طويل خلال جملتي الشرط مثلا استخدام تاخير معين (بحيث عند الضغط على المفتاح الثاني مثلا يكون البرنامج مازال ينفذ الشرط الاول وبالتالي لا يتحسس لضغطة الزر...سؤال اخر ما هي الدارة التي استخدمتها للبرنامج (لاني ارى ان الشرط يحدث عند وصول جهد 5 فولت من خلال المفتاح الى البيك وعي عكس ما انفذه انا احيانا مع العلم ان الشرط يعتمد على الدارة ) ربنا يوفقك يا غالي ويجزيك الخير ...

اخوكم الصغير

إضافة رد

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

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

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


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

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