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

   

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



شوف يا اخي المفلحي
انا عندي Rotary Encoder بيخرج منة Pulses مش انا اللي متحكم في النبضات دي
في نبضات كتير بتخرج من انا مش عايزها ونبضات انا عايزها بمعني اخر
اعمل برنامج هدخلة Channel A من اي Pin في المايكرو بحيث انه هيعدد النبضات دي اول ما يستلم اشارة ان في نبضات اشتغلت طبعا انا عايزة اديلة شرط وهو مثلا لو النبضات دي وصلت 1200 نبضة في الثانية هتعمل تأخير 500 US وتخرج النبضات من PINB1 اللي دخلالك من B0 بس غير كدة مش هتخرج اي حاجة ،و بعد ما يخرج النبضات دي يفضل مراقب لو عد 1200 نبضة في ثانية مرة تانية وهو بيخرج النبضات اللي داخلة له يوقف انه يخرج من PINB1 ويعمل ريستارت للبرنامج لتكرار العملية مرة أخري
ياريت تكون وصلت فكرة البرنامج

اعلانات

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


السلام عليكم اخي الكريم carsper
انا اسف على التأخير ولكن هذا بسبب ان النت كان قد انقطع عندي واليوم فقط اعدته
سؤال مهم : كم هي فولتية الـ Pulses ؟ لانه اذا كانت صغيرة لايمكن ان يشعر بها البيك.
انا سأطرح الان البرنامج ولكن اولا تأكد من فولتية البلس قبل التنفيذ، اذا كانت 5 فولت فأن شاء الله يعمل.
هذا البرنامج:

كود:
char x,clock;                         //  variables declaration


void interrupt()                      //  interrupt program
{
     if(intcon.f2==1)                 // check if interrupt due to tmr0 overflow
     {
      clock++;
      intcon.f2=0;
     }

     if(intcon.f1==1)                 // check if interrupt due to input pulse to RB0
     {
      x++;
      intcon.f1=0;
     }
}

void main()                           //  main program
{
    adcon1=0x07;                      //  make port B deal with digital inputs ( not analog )
    trisb=0xff;                       //  port B input
    trisb.f1=0;                       //  RB1 output
    portb.f1=0;                       //  RB1 = 0 volt
    intcon=0b10110000;                //  enable and setting interrupt
    option_reg=0b10000101;            //  interrupt setting

    while(1)
    {
     loop:                            // Label
     x=0;
     delay_ms(1000);                  // delay 1 second
      if(x >= 1200)                   // check if input pulses in RB0 is 1200 or greater during last second
       {
          delay_us(500);              // delay 500 microsecond
          x=0; clock=0;               // reset x and clock
           while(1)
           {
             portb.f1=portb.f0;       // RB1 = RB0
             if(clock >= 61)          // check if 1 second is passed
             {
               if(x >= 1200)          // check if input pulses in RB0 is 1200 or greater during last second
               {
                portb.f1=0;           // RB1 = 0  ( reset )
                goto loop;            // repeat operation
               }
               x=0; clock=0;          // reset x and clock
             }
          }
       }
    }
}
هذا هو البرنامج الذي قدرت ان اعمله ولكن كما قلت لك ان هناك مشكلة وهي ان البرنامج يفحص عدد البلس عند نهاية كل ثانية والمشكلة هي ان لو البلس بدأت عند منتصف الثانية الاولى ووصلت عدد البلس 1200 في نصف الثانية الثانية (اي ان خلال ثانية واحدة دخلت 1200 بلس) ولكن البرنامج سيفحص عند نهاية الثانية الاولى وسيرى ان البلس لم تصل الى 1200 بلس وسيقوم بتصفير عداد البلس لكي يحسب عدد البلس في الثانية الثانية ولكن عند نهاية الثانية الثانية سيرى ان عدد البلس ليس 1200 لانه بدأ العد من نهاية الثانية الاولى رغم ان الجهاز اعطى 1200 بلس خلال ثانية ولكن كانت بين الثانية الاولى والثانية الثانية التي قام البيك بالفحص عند نهايتهم، ارجو ان تكون المشكلة واضحة لك ونتمنى من احد الاخوة المحترفين في البرمجة ان يحاول ان يقوم بحلها.
اذا في اي شيء مش واضح فلا تتردد بالسؤال.
بالتوفيق.

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

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


السلام عليكم ورحمة الله وبركاتة
مشكور كتير كتير يا استاذي
بس في مشكلة فعلا انا لما قست فولتية البلس علي الأوسليسكوب لقيتها 0.2 V
كدة علي ما اعتقد اني محتاج مكبر صح؟ وقرأت ايضا ان الأفضل LM358
ارجو لو توضيح كيفية تكبير الفولت
وكمان ما هي اقل قيمة فولت يشعر بها الPIC ?


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


السلام عليكم ورحمة الله وبركاتة
مشكور كتير كتير يا استاذي
بس في مشكلة فعلا انا لما قست فولتية البلس علي الأوسليسكوب لقيتها 0.2 V
كدة علي ما اعتقد اني محتاج مكبر صح؟ وقرأت ايضا ان الأفضل LM358
ارجو لو توضيح كيفية تكبير الفولت
وكمان ما هي اقل قيمة فولت يشعر بها الPIC ?
وعليكم السلام ورحمة الله وبركاته
نعم اخي الكريم يجب ان تستخدم مكبر ولكن للأسف ليست لدي فكرة في كيفية التكبير ولكن هناك الكثير من الاعضاء قد يفيدوك في هذا الجزء
بالنسبة لاقل قيمة فولت يشعر بها البيك اضن والله اعلم انها 3.5 او 4 فولت والافضل انك تجعل الفولت بعد التكبير 5 فولت تجنبا لأية مشاكل .
بالتوفيق.


carsper
:: مهندس ::
تاريخ التسجيل: Feb 2011
المشاركات: 42
نشاط [ carsper ]
قوة السمعة:
قديم 15-03-2011, 05:44 PM المشاركة 13   
Thumbs up


الف الف شكر يا اخي المفلحي
انا هدور علي حد من الاخوان في قسم الدوائر لمساعدتي في تضخيم الفولت وراح أجرب الكود اللي وضعتة ولو في اي مشكلة راح أرجهلك إن شاء الله
والف مليون شكر مرة تانية علي المساعدة وسرعة الإستجابة


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


العفو اخي الكريم
نحن في الخدمة إن شاء الله بقدر المستطاع والتعاون أساس النجاح
بالتوفيق.


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


السلام عليكم
اخي المفلحي لقد قمت بحمد الله بتضخيم البلس واشتغل زي الفل
بس الكود لم يشتغل
اليك ما اريد بالظبط حاولت مع هذا الكود ولم يفلح

كود:
char x,y;                         //  variables declaration


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

     if(intcon.f3 == 1){
      y=1;
      x=0;
      intcon.f3=0;
     }
}

void main()                           //  main program
{

y=0;
x=0;
    trisb=0xff;
    trisb.f2=0;
    trisb.f3=0;                       //  RB1 output
    portb.f2=0;
    portb.f3=0;
    intcon=0b10010001;                //  enable and setting interrupt
    option_reg=0b11000000;            //  interrupt setting
    while(1)
    {
    if(y == 1){
      if(x >= 10){
            portb.f2=portb.f0;
            portb.f3=portb.f1;
            if(x >= 20){
              portb.f2=0;
              portb.f3=0;
              x=0;
            }
    }
}
}
}


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


السلام عليكم
اخي المفلحي لقد قمت بحمد الله بتضخيم البلس واشتغل زي الفل
بس الكود لم يشتغل
اليك ما اريد بالظبط حاولت مع هذا الكود ولم يفلح

كود:
char x,y;                         //  variables declaration


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

     if(intcon.f3 == 1){
      y=1;
      x=0;
      intcon.f3=0;
     }
}

void main()                           //  main program
{

y=0;
x=0;
    trisb=0xff;
    trisb.f2=0;
    trisb.f3=0;                       //  RB1 output
    portb.f2=0;
    portb.f3=0;
    intcon=0b10010001;                //  enable and setting interrupt
    option_reg=0b11000000;            //  interrupt setting
    while(1)
    {
    if(y == 1){
      if(x >= 10){
            portb.f2=portb.f0;
            portb.f3=portb.f1;
            if(x >= 20){
              portb.f2=0;
              portb.f3=0;
              x=0;
            }
    }
}
}
}
اخي الكريم الكود الذي حطيته انت لن ينفذ المطلوب لان الشرط if(y == 1) لن يتحقق ابدا لان معك خطأ في برنامج interrupt
اخي الكريم حاول بالبرنامج الذي وضعته لك واستخدم كريستال 4 ميجاهيرتز واذا لم يعمل بشكل صحيح فقد تكون المشكلة هي ما اوضحتها لك من قبل
هذا هو البرنامج الذي قدرت ان اعمله ولكن كما قلت لك ان هناك مشكلة وهي ان البرنامج يفحص عدد البلس عند نهاية كل ثانية والمشكلة هي ان لو البلس بدأت عند منتصف الثانية الاولى ووصلت عدد البلس 1200 في نصف الثانية الثانية (اي ان خلال ثانية واحدة دخلت 1200 بلس) ولكن البرنامج سيفحص عند نهاية الثانية الاولى وسيرى ان البلس لم تصل الى 1200 بلس وسيقوم بتصفير عداد البلس لكي يحسب عدد البلس في الثانية الثانية ولكن عند نهاية الثانية الثانية سيرى ان عدد البلس ليس 1200 لانه بدأ العد من نهاية الثانية الاولى رغم ان الجهاز اعطى 1200 بلس خلال ثانية ولكن كانت بين الثانية الاولى والثانية الثانية التي قام البيك بالفحص عند نهايتهم، ارجو ان تكون المشكلة واضحة لك ونتمنى من احد الاخوة المحترفين في البرمجة ان يحاول ان يقوم بحلها.
input of pulses in RB0
output in RB1



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