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

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

supersarmed
:: مهندس ::
تاريخ التسجيل: Jan 2011
الدولة: العراق
المشاركات: 35
نشاط [ supersarmed ]
قوة السمعة:0
قديم 02-03-2016, 06:15 PM المشاركة 1   
ha استفسار في المقاطعة الخارجية(RBIE) Twitter FaceBook Google+



رجاءاً ... اردت فقط تجربة كيفية تفعيل المقاطعة الخارجية وطريقة عملها بكتابة كود بسيط لعمل فلاش ليد على البورت A وتحديدا على RA0 واجهت شيء غريب بالنسبة لي وهو عند الضغط على احد الــSwitchs المربوطة مع اطراف الدخل RB4,5,6,7 وتغير الجهد على احد الاطراف المذكورة دخول البرنامج في المقاطعة وعدم الخروج منها اي يستمر الــLED بالـFlashing وعدم العودة الى البرنامج الاصلي ... فما هو السبب؟
كود:
void interrupt(){
porta.f0=1;
delay_ms(200);
porta.f0=0;
delay_ms(200);
intcon.RBIF=0;}

void main() {
trisa=0;
trisb=0b11110000;
porta=0;
portb=0b00000000;
intcon=0b10001000;
while(1){
portb=0b00001111;
delay_ms(400);
portb=0b00000000;
delay_ms(400);}

اعلانات

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 324
نشاط [ احمد شهيد جواد ]
قوة السمعة:0
قديم 02-03-2016, 06:33 PM المشاركة 2   
افتراضي


رجاءاً ... اردت فقط تجربة كيفية تفعيل المقاطعة الخارجية وطريقة عملها بكتابة كود بسيط لعمل فلاش ليد على البورت A وتحديدا على RA0 واجهت شيء غريب بالنسبة لي وهو عند الضغط على احد الــSwitchs المربوطة مع اطراف الدخل RB4,5,6,7 وتغير الجهد على احد الاطراف المذكورة دخول البرنامج في المقاطعة وعدم الخروج منها اي يستمر الــLED بالـFlashing وعدم العودة الى البرنامج الاصلي ... فما هو السبب؟
كود:
void interrupt(){
porta.f0=1;
delay_ms(200);
porta.f0=0;
delay_ms(200);
intcon.RBIF=0;}

void main() {
trisa=0;
trisb=0b11110000;
porta=0;
portb=0b00000000;
intcon=0b10001000;
while(1){
portb=0b00001111;
delay_ms(400);
portb=0b00000000;
delay_ms(400);}
السلام عليكم اخي الكريم ...
ماهو البك المستخدم ؟؟؟؟؟
ايضأً انت لم تقم بأيقاف الانلوج على اطراف بورت a
يجب تصفير الـــ Flag في دالة الانتربت حتى يخرج منها البرنامج ولا يبقى يكرر نفس الاوامر...
فقط اذكر نوع البك المستخدم
تحياتي

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

supersarmed
:: مهندس ::
تاريخ التسجيل: Jan 2011
الدولة: العراق
المشاركات: 35
نشاط [ supersarmed ]
قوة السمعة:0
قديم 02-03-2016, 06:44 PM المشاركة 3   
افتراضي


ربي يوفقك على الرد السريع ... عذرا فان مستواي في استخدام الــPic قبل المبتدئ ..
اخي نوع الــPic المستخدم هو (PIC16F84A)
واعتقد كما هو موضح في الكود من خلال (0=intcon.RBIF) في دالة الــInterrupt قد تم تصفير الــFlag.
لو سمحت توضيح ماهو تأثير الانالوج وكيف يتم ايقافه للبورت A ..


supersarmed
:: مهندس ::
تاريخ التسجيل: Jan 2011
الدولة: العراق
المشاركات: 35
نشاط [ supersarmed ]
قوة السمعة:0
قديم 03-03-2016, 06:07 PM المشاركة 4   
Smile


هل سؤالي صعب جداً بحيث يصعب لاحد من العباقرة ان يساعدني فيه ... ام هو بدائي جداً وليس بمستوى الاجابة !!!


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 05-03-2016, 05:08 PM المشاركة 5   
افتراضي


رجاءاً ... اردت فقط تجربة كيفية تفعيل المقاطعة الخارجية وطريقة عملها بكتابة كود بسيط لعمل فلاش ليد على البورت A وتحديدا على RA0 واجهت شيء غريب بالنسبة لي وهو عند الضغط على احد الــSwitchs المربوطة مع اطراف الدخل RB4,5,6,7 وتغير الجهد على احد الاطراف المذكورة دخول البرنامج في المقاطعة وعدم الخروج منها اي يستمر الــLED بالـFlashing وعدم العودة الى البرنامج الاصلي ... فما هو السبب؟
كود:
void interrupt(){
porta.f0=1;
delay_ms(200);
porta.f0=0;
delay_ms(200);
intcon.RBIF=0;}

void main() {
trisa=0;
trisb=0b11110000;
porta=0;
portb=0b00000000;
intcon=0b10001000;
while(1){
portb=0b00001111;
delay_ms(400);
portb=0b00000000;
delay_ms(400);}
السلام عليكم
جرب هذا الكود

كود:
char flag=0 ,pressedButton=0;
void interrupt(){              // Interrupt rutine
  if(RBIF_bit == 1 ) {         // Checks for Receive Interrupt Flag bit
    flag  = 1;                 // Set local interrupt flag
    RBIF_bit = 0;              // Clear Interrupt Flag
    if (PORTB.F7 == 1){        // Checks if the RB7 is pressed
       pressedButton = 7;
    }
    if (PORTB.F6 == 1){        // Checks if the RB6 is pressed
       pressedButton = 6;
    }
    if (PORTB.F5 == 1){        // Checks if the RB5 is pressed
       pressedButton = 5;
    }
    if (PORTB.F4 == 1){        // Checks if the RB4 is pressed
       pressedButton = 4;
    }
  }
}

void main()
{

   TRISA=0;
   trisb=0b11110000;
   porta=0;
   portb=0b00000000;
   INTCON=0x88;

    while(1)
    {
     portb=0b00001111;
     delay_ms(400);
     portb=0b00000000;
     delay_ms(400);
   if(flag==1)
     {
      flag=0;
      switch (pressedButton)
        {
          case 7:RA0_bit=~RA0_bit;
            delay_ms(500);
            pressedButton=0;
            break;
          case 6:RA1_bit=~RA1_bit;
            delay_ms(500);
            pressedButton=0;
            break;
         case 5:RA2_bit=~RA2_bit;
            delay_ms(500);
            pressedButton=0;
            break;
         case 4:RA3_bit=~RA3_bit;
            delay_ms(500);
            pressedButton=0;
            break;
         default:break;
        }

      
     }

    }


}
هنا ملاحظه لاتضع اي ديلي في داله الانتربت لكي يستطيع البيك الرجوع للبرنامج الرئيسي بسرعه لان هذا الزمن سوف يجبر مايكرو على الانتظار في داله الانتربت وهذا ليس صحيح


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 05-03-2016 الساعة 05:19 PM

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


تفضل هذا الكود فيه الليد الاصفر يعمل مع حصول المقاطعة اي مع المفتاح و الليد الاخضر يعمل بشكل مستقل ...
كود:
void interrupt()
{
 portb.f1=~portb.f1;
 intcon.f1=0;
 
}
void main()
 { trisb.f0=1; trisb.f1=0;trisb.f7=0;portb.f1=0;
 intcon=0b10010000;

 while(1){portb.f7=~portb.f7;
          delay_ms(500);
          }

}

[/CENTER]

حيدر علاج حسن

التعديل الأخير تم بواسطة : حيدر علاج حسن بتاريخ 08-03-2016 الساعة 07:39 PM

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


لا اعرف كيف ظهرت مشاركتي قبل مشاركتك ...
سوف نبلغ الادارة عن هذا الخطأ

حيدر علاج حسن

supersarmed
:: مهندس ::
تاريخ التسجيل: Jan 2011
الدولة: العراق
المشاركات: 35
نشاط [ supersarmed ]
قوة السمعة:0
قديم 08-03-2016, 10:16 PM المشاركة 8   
افتراضي


الاخ حسن هادي محمــود ... لك كل الاحترام والتقديـــر

لقد استفدت من مساعدتك الكثير .. اعتقد "الله اعلم" حسب ما قمت بتجربته انه في حالة العمل في هذا النوع من المقاطعة الخارجية(RBIE) يجب استخدام اداة شرط في برنامج الـمقاطعة وتحديد الطرف الذي حصل عليه تغيير بالجهد ومن ثم تنفيذ الامر المطلــوب مابين {} حيث قمت بالعديد من المرات في ازالة هذا الشرط وجدت ان البرنامج لا يخرج من المقاطعة ويستمر بتنفيذ مابداخلها من اوامر وكأنه Loop ولا يعود الى البرنامج الاساسي حتى وبعد تصفير الــRBIF... لااعلم ما اذا كان كلامي صواب ام لا ولكني سأعتمده

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعجاب abu-thabit ( أعجبته المشاركة )
إضافة رد

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

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

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


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

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