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

   

البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 01-03-2015, 11:08 PM المشاركة 17   
افتراضي



كود:
portb =(portb & 0xF0)+x[i-1];
معلش ممكن تشرحلى السطر دة فى الكود انا ما فهمت انت عملت ايه

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 01-03-2015, 11:25 PM المشاركة 18   
افتراضي


معلش ممكن تشرحلى السطر دة فى الكود انا ما فهمت انت عملت ايه
معنى portb =(portb & 0xF0) انه سوف يتم تصفير بتات البدايه يعني من 0 الى 3 بدون تأثير على بقيه بورت B
يعني & معناه and

لماذا لان ليدات مربوطه على الاطراف rb0 الى rb4 ولكن RB7 مربوط عليها محرك اذن لايجوز ان اقول portb=0 لكي اصفر ليدات لان هنا اثرت على كل عناصر مربوطه مع بورت وعليه اريد اصفر فقط بتات او الاطراف مربوطه بالبورت دون تأثير على البقيه

وهذه طريقه نستخدم &
يعني نقول
portb=portb& 0xF0 هنا سوف تكون النتيجه كتالي
portb= portb & 0b11110000 تلاحظ اي قيمه نعمل لها & مع 1 تبقى قيمه نفسها
ولهذا بنات RB4,5,6,7 لن يتأثرو بعمليه &
اما RB3,2,1,0 فسوف تصبح قيمهم =0 لاني عملت لهم & مع 0

هذه عمليه مهمه في البرمجه عندما تربط اكثر من عنصر على نفس بورت وتريد قيمهم لاتؤثر عند تغير أحدهم

اما معني
portb =(portb & 0xF0)+x[i-1];
معناها قم بتصفير اول اربعه الاطراف من بورت B بعدين اجمع عليه البيانات موجوده في مصفوفه غايه منها اني لازم اطفئ ليدات حتى أضيئ ليد اخر اذن لازم صفر ليدات الاربعه وبعدها اعطيها قيمه جديده كما قلت لابد من العمليه لاتؤثر على الاطراف البورت الغير مربوطه مع ليدات

ارجو اني وضحت ذلك


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 01-03-2015 الساعة 11:29 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 02-03-2015, 12:42 PM المشاركة 19   
افتراضي


طيب ما فائدة ss , flage ؟؟


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 02-03-2015, 03:52 PM المشاركة 20   
افتراضي


كود:
 if (portd.f2 == 1) flag=1;  // if the push button is pushed
  if(portd.f2 == 0  && flag==1)
flag هو متغير يصبح قيمته ب 1 عندما يتم ضغط سويج
اما كود
كود:
if(portd.f2 == 0  && flag==1)
يعني طالما انت ضاغط على سويج لن يسمح بتنفيذ الامر حتى تزول يدك من سويج
ولازم يتم تصفير flag لغرض ضغطه سويج اخرى
================================
اما ss وهي عندما يصبح قيمه i اكبر من 4 يعني مثلا 5 راح يتم ايقاف محرك ولازم هنا يتم كتابه هذا الكود
كود:
if (i >=5)
            {
             i = 0 ;
             portb =0;   // indicator led according to motor speed
             ss=0;
             PWM1_Stop();
            }
حيث تمت تصفير متغير i , ss وايقاف pwm ولازم تطفئ محرك انه تجعل EN =0 وكذلك IN1 حتى نضمن ايقاف محرك
هنا يأتي دور ss وذلك عند ضغط على سويج لغرض البدء تشغيل محرك
كود:
if(i ==1 && ss==0)
          {
           ss=1;
           portb.f7=1; //signal to motor forward direction
           PWM1_Start();
          }
حيث عندما i=1 و ss=0 ابدء بتشغيل محرك وpwm
وهذا الكود يتنفذ مره واحده فقط


البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 04-03-2015, 04:48 AM المشاركة 21   
افتراضي


طيب ما رأيك يا بشمهندس حسن فى هذا الكود

كود:
void main(){
// variables
int x[5]={0, 1, 2, 4, 8};
int i = 1 , flag = 0;
trisa = 0; trisb = 0; trisc = 0; trisd = 255; trise = 0;
porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;
adcon1=6;
PWM1_Init(5000); //initialise PWM1 at 5KHz

while(1) { // start infinit loop
  if (portd.f2 == 1) flag = 1;
  if(portd.f2 == 0  && flag == 1)  // if the push button is pushed
    {
     portb.f7=1; //signal to motor forward direction
     portb = x[i];   // indicator led according to motor speed
     PWM1_Start(); //start PWM1
     PWM1_Set_Duty(i*255/4); // set duty cycle from 25% to 100%
     flag=0;
     i++;
    }
  if (i > 4)
   {
    i = 0 ;
    portb =0;
    PWM1_Stop();
   }

} //end loop
} //end main


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 04-03-2015, 05:19 PM المشاركة 22   
افتراضي


طيب ما رأيك يا بشمهندس حسن فى هذا الكود

كود:
void main(){
// variables
int x[5]={0, 1, 2, 4, 8};
int i = 1 , flag = 0;
trisa = 0; trisb = 0; trisc = 0; trisd = 255; trise = 0;
porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;
adcon1=6;
PWM1_Init(5000); //initialise PWM1 at 5KHz

while(1) { // start infinit loop
  if (portd.f2 == 1) flag = 1;
  if(portd.f2 == 0  && flag == 1)  // if the push button is pushed
    {
     portb.f7=1; //signal to motor forward direction
     portb = x[i];   // indicator led according to motor speed
     PWM1_Start(); //start PWM1
     PWM1_Set_Duty(i*255/4); // set duty cycle from 25% to 100%
     flag=0;
     i++;
    }
  if (i > 4)
   {
    i = 0 ;
    portb =0;
    PWM1_Stop();
   }

} //end loop
} //end main
أخي كريم عندك مجموعه من اخطاء ولكن لابأس حاول أستفاده منها فهي وسيله وحيده لاكتساب الخبره

1- انت خليت بالبدايه i=1 في بادئ الامر تسلسل تشغيل محرك صحيحه ولكن بعدما تصبح i اكبر من 4 راح يصبح i=0 وهنا لو ترجع تدقق بالامر ستجد هناك خطأ وهو لما i=0 وتضغط على سويج راح ماينفذ شيئ لانك وضعت i++ بعد مجموعه من عمليات
كود:
  portb.f7=1; //signal to motor forward direction
     portb = x[i];   // indicator led according to motor speed
     PWM1_Start(); //start PWM1
     PWM1_Set_Duty(i*255/4); // set duty cycle from 25% to 100%
خطأ الثاني هو انت كتبت هذا الكود
كود:
portb.f7=1; //signal to motor forward direction
     portb = x[i];   // indicator led according to motor speed
ستلاحظ هناك خطأ كبير في الكود وهو انت جعلت بن رقم 7 من بورت portb ب 1
ثم قمت بأعاده تغير قيمه portb بالكامل وهنا سوف تصفر قيمه بن رقم 7 من بورت portb

خطأ الثالث هو في هذا الكود
كود:
PWM1_Set_Duty(i*255/4)
هنا ايضا خطأ كبير وهو عليك معرفه حدود متغيرات فكل متغير له قيمه محدده فلا يزيد عنها ابدا

مثلا على فكره هاي مجربه عمليا راح اعطيك مثال
لو عندي متغير من نوع unsigned char لو أفترضناه اسمه x اذن اقصى قيمه له هو 255 ومتغير اخر من نوع int لنفترض اسمه y طبعا اقصى قيمه له 65536
وقلنا
y=x*200
و قيمه x=10 هل تتوقع ان y=2000
الجواب خطأ هنا حدث خطأ كبير وهو انه اذا كانت نتيجه ضرب x*200 اكبر من 255 فسيحدث مشاكل في الحساب ولن تتمكن من حساب قيم صحيحه لذا عليك انتباه لهذه خطوه والتأكد من متغيرات ان لايحدث تجاوز لقيم حتى وان لم يتم خزن تلك القيم بهذه متغيرات
فمثلا الحل
اقول اضع y=x
y=y*200
هنا سوف تجري الامور بشكل صحيح

لذا وضع i*255 خاطئ لانه اولا i من نوع char وثانيا اصلا داله duty تأخذ قيمه من نوع char

تحياتي


البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 04-03-2015, 08:13 PM المشاركة 23   
افتراضي


اذن حل الاخطاء كما فهمت يصبح الكود هكذا
كود:
 void main(){
// variables
int x[5]={0, 1, 2, 4, 8};
int i = 0 , flag = 0;
trisa = 0; trisb = 0; trisc = 0; trisd = 255; trise = 0;
porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;
adcon1=6;
PWM1_Init(5000); //initialise PWM1 at 5KHz

while(1) { // start infinit loop
  if (portd.f2 == 1) flag = 1;
  if(portd.f2 == 0  && flag == 1)  // if the push button is pushed
    {
     i++;
     portb = x[i]+0x80;   // indicator led according to motor speed
                         //signal to motor forward direction
     PWM1_Start(); //start PWM1
     PWM1_Set_Duty(i*255/4); // set duty cycle from 25% to 100%
     flag=0;

    }
  if (i == 5)
   {
    i = 0 ;
    portb =0;
    PWM1_Stop();
   }

} //end loop
} //end main
بالنسبة للخطأ الاخير لاتنسى انى قاسم على 4 .. يعنى فى الاخر الناتج هيكون نسبة من ال 255 ... يعنى استحالة انه القيمة تزيد عن 255


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 04-03-2015, 08:31 PM المشاركة 24   
افتراضي


اذن حل الاخطاء كما فهمت يصبح الكود هكذا
كود:
 void main(){
// variables
int x[5]={0, 1, 2, 4, 8};
int i = 0 , flag = 0;
trisa = 0; trisb = 0; trisc = 0; trisd = 255; trise = 0;
porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;
adcon1=6;
PWM1_Init(5000); //initialise PWM1 at 5KHz

while(1) { // start infinit loop
  if (portd.f2 == 1) flag = 1;
  if(portd.f2 == 0  && flag == 1)  // if the push button is pushed
    {
     i++;
     portb = x[i]+0x80;   // indicator led according to motor speed
                         //signal to motor forward direction
     PWM1_Start(); //start PWM1
     PWM1_Set_Duty(i*255/4); // set duty cycle from 25% to 100%
     flag=0;

    }
  if (i == 5)
   {
    i = 0 ;
    portb =0;
    PWM1_Stop();
   }

} //end loop
} //end main
بالنسبة للخطأ الاخير لاتنسى انى قاسم على 4 .. يعنى فى الاخر الناتج هيكون نسبة من ال 255 ... يعنى استحالة انه القيمة تزيد عن 255
ستأكد من الكود وأعطيك خبر

بالنسبه لقولك انى قاسم على 4 لا يا أخي العزيز الامور لا تسير هكذا يعني اولا سوف تجري عمليه ضرب ويتم خزنها بعد ذلك يتم قسمه النتيجه على 4 مشكله لما تحدث عمليه ضرب يعني 255*i هنا سوف تحدث مشاكل
يعني عمليات حسابيه تجري واحده تلو اخرى طبعا الافضليه بين القوسين بعدين الاس بعدين ضرب او قسمه بعدين عمليه جمع او طرح يعني لاتجري كلها في ان واحد
لذا يجب ان تنتبه لنتيجه وعدم حدوث تجاوز لقيم متغيرات اكرر حتى وان لم تقم بخزن النتيجه بهذه متغيرات



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