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

   

almoflehy
:: مهندس جيد ::
تاريخ التسجيل: Apr 2007
الدولة: YEMEN
المشاركات: 252
نشاط [ almoflehy ]
قوة السمعة:
قديم 21-03-2011, 01:39 AM المشاركة 9   
افتراضي



اخي الكريم لقد قمت بتنفيذ الدائرة عمليا بالنسبة للبرنامج الذي في السيموليشن وعملت بشكل ممتاز اما بالنسبة للبرنامج الذي يعد 2000 بلس فلا استطيع تجربته لعدم وجود function generator و اوسيلسكوب معي فحاول اولا تطبيق البرنامج الذي في الملف الذي في السيموليشن عمليا

اعلانات

carsper
:: مهندس ::
تاريخ التسجيل: Feb 2011
المشاركات: 42
نشاط [ carsper ]
قوة السمعة:
قديم 21-03-2011, 12:37 PM المشاركة 10   
افتراضي


روح يا اخي المفلحي ربنا يعمر بيتك ويكتر من أمثالك
لقد قمت بتجربة الكود وقد تم تنفيذ المشروع بنجاح اشكرك جدا جدا لولا مساعدتك ما كنت نجحت ولا كنت احببت العمل علي اليكروكنترولر
وياريت يا اخي تشرح لنا الكود ليستفيد الجميع
ولك جزيل الشكر

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

almoflehy
:: مهندس جيد ::
تاريخ التسجيل: Apr 2007
الدولة: YEMEN
المشاركات: 252
نشاط [ almoflehy ]
قوة السمعة:
قديم 22-03-2011, 12:13 AM المشاركة 11   
افتراضي


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


carsper
:: مهندس ::
تاريخ التسجيل: Feb 2011
المشاركات: 42
نشاط [ carsper ]
قوة السمعة:
قديم 22-03-2011, 12:29 AM المشاركة 12   
افتراضي


تسلم يا اخي
ونحن في انتظار مشاركتك


almoflehy
:: مهندس جيد ::
تاريخ التسجيل: Apr 2007
الدولة: YEMEN
المشاركات: 252
نشاط [ almoflehy ]
قوة السمعة:
قديم 23-03-2011, 01:43 AM المشاركة 13   
افتراضي شرح البرنامج


بسم الله الرحمن الرحيم


الكود
كود:
char n,m;
int x,i,b;

void interrupt()
{
     if(intcon.f1==1)
     {
      x++;
      intcon.f1=0;
     }
}

void main()
{

    trisb=0;
    trisb.f0=1;
    trisa=0xff;
    portb=0;
    intcon=0b10110000;
    option_reg=0b10111000;

    start:
    portb=0;
    i=1;
    b=0;
    n=0;
    m=0;
    if(porta.f0==1)
    { x=0;
      while(x<2000) { }
      x=0;
      tmr0=0;
      while(x<18000)
      {
       if(x==(5*i)+b)
        {portb.f1=portb.f0;  n=1;}
       else {portb.f1=0;
             if(n==1){n=0;i++;b++;}
            }
       if(tmr0==5)
        {portb.f2=porta.f4;  m=1;}
       else {portb.f2=0;
             if(m==1){m=0;tmr0=0;}
            }
      }
    }
    goto start;
}
شرح البرنامج بشكل عام
اولا نقوم بتعريف متغير X يقوم بحساب عدد ال Pulses الداخلة من RB0 وذلك بالاستفادة من المقاطعات بحيث نقوم بتنفيذ البرنامج الاساسي وعند دخول Pulse تتم المقاطعة ويزيد المتغير X بواحد وهكذا، وبالنسبة لل Pulses الداخلة من RA4 فقد استفدت من السجل tmr0 واستخدمته كعداد خارجي (اي كل Pulse داخلة لل RA4 تزيد tmr0 بواحد وهكذا)
لفهم المقاطعات بشكل اكبر يرجى الرجوع للموضوع التالي
المقاطعات وكيفية الاستفادة منها..
في البرنامج الاساسي
1- ننتظر الى ان يتم الضغط على مفتاح بدء العد الذي في المنفذ RA0
2- من ثم ننتظر الى ان يكون العدد في المتغير X هو 2000
3- من ثم نقوم بتصفير المتغير X ، ونفحص المتغير X الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RB0 يخرج من المنفذ RB1 (وهي ال Pulse رقم 6) ، ومرة اخرى نفحص المتغير X الى ان يصل للرقم 11 فنجعل بعد ذلك ما سيدخل للمنفذ RB0 يخرج من المنفذ RB1 (وهي ال Pulse رقم 12)، وهكذا .... ولا ننسى انه في نفس الوقت يتم فحص السجل tmr0 الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RA4 يخرج من المنفذ RB2 (وهي ال Pulse رقم 6) ومن ثم نصفر ال tmr0 ومرة اخرى نفحص السجل tmr0 الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RA4 يخرج من المنفذ RB2 (وهي ال Pulse رقم 12) وهكذا...
4- الى ان يصل الرقم في المتغير X الى الرقم 18000 (لان 18000 مع 2000 السابقة تكون 20000) يعيد تنفيذ البرنامج من جديد.

شرح الكود

كود:
char n,m;
int x,i,b;
تعريف للمتغيرات
n,m من النوع char لان الرقم الذي سيحفظ بهم لن يتجاوز 2
x,i,b من النوع int لان الرقم الذي سيحفظ بهم يصل لاكبر من 3000

كود:
void interrupt()
{
     if(intcon.f1==1)
     {
      x++;
      intcon.f1=0;
     }
}
برنامج المقاطعة الذي يعمل على تزايد X كلما دخلت بلس من RB0

كود:
    trisb=0;                    // PrttB is output
    trisb.f0=1;                 // RB0 is input
    trisa=0xff;                 // PortA is input
    portb=0;                    // reset portB
الشرح امامهم

كود:
    intcon=0b10110000;
    option_reg=0b10111000;
الاعدادات الخاصة بعمل المقاطعات

كود:
    start:       // label
    portb=0;     // reset portB
    i=1;         // set i to 1
    b=0;         // reset
    n=0;         // reset
    m=0;         // reset
الشرح امامهم

كود:
if(porta.f0==1)
لفحص اذا ما تم الضغط على مفتاح بدء العد ينفذ ما بعده من اوامر

كود:
x=0;               // reset x
      while(x<2000) { }  // wait until x = 2000
يصفر المتغير X ومن ثم ينتظر الى ان تدخل 2000 بلس (اي يصبح العدد في X هو 2000)

كود:
x=0;
      tmr0=0;
يصفر كلا من X و tmr0 ليتم الحساب من البداية

كود:
while(x<18000)
      {
       if(x==(5*i)+b)
        {portb.f1=portb.f0;  n=1;}
       else {portb.f1=0;
             if(n==1){n=0;i++;b++;}
            }
       if(tmr0==5)
        {portb.f2=porta.f4;  m=1;}
       else {portb.f2=0;
             if(m==1){m=0;tmr0=0;}
            }
      }
الامر while(x<18000) ينفذ الاوامر المحصورة بين حاصرتيه الى ان يصل عدد البلس 18000 ومن ثم يخرج

كود:
if(x==(5*i)+b)
        {portb.f1=portb.f0;  n=1;}
يفحص اذا ما وصل العدد في X الى 5 او 11 او 17 او ...... يقوم بجعل البلس التالية تخرج من RB1 ويجعل n=1

كود:
else {portb.f1=0;
             if(n==1){n=0;i++;b++;}
في حال عدم تحقق الشرط السابق يقوم بتصفير المنفذ RB1 ويتأكد هل n=1 فاذا ساوت 1 يقوم بتصفير n ويزيد كل من i, b بواحد

كود:
 if(tmr0==5)
        {portb.f2=porta.f4;  m=1;}
       else {portb.f2=0;
             if(m==1){m=0;tmr0=0;}
            }
نفس ما في السابق

كود:
goto start;
عند وصول عدد البلس الى 18000 يخرج من حلقة While وينفذ هذا الامر الذي يعيد البرنامج من البداية.

ارجو ان اكون قد اوضحت البرنامج بشكل واضح واذا في اي غموض في مكان محدد فاشر اليه وان شاء الله نوضحه
بالتوفيق بإذن الله.


carsper
:: مهندس ::
تاريخ التسجيل: Feb 2011
المشاركات: 42
نشاط [ carsper ]
قوة السمعة:
قديم 23-03-2011, 09:52 PM المشاركة 14   
افتراضي


تسلملي يا اخي المفلحي
والله انت ما تقصر
اذهلتني بالتواصل الدائم وسرغة الاستجابة والبساطة في الشرح
تسلملنا


almoflehy
:: مهندس جيد ::
تاريخ التسجيل: Apr 2007
الدولة: YEMEN
المشاركات: 252
نشاط [ almoflehy ]
قوة السمعة:
قديم 24-03-2011, 11:51 AM المشاركة 15   
افتراضي


الله يسلمك يا اخي carsper
ما عملت الا الواجب
وتمنياتي لك بالتوفيق في مشروعك
اخوك نبيل المفلحي



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