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

   

البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 06-05-2015, 08:22 AM المشاركة 73   
افتراضي



شكرا لك اخى الغالى على الشرح
معلش كان لى بعض الاستفسارات:
1. انت ليه كاتب هذا السطر مرتين مع اختلاف ان kk مرة عرفته float ومرة char
كود:
void display_message( float kk , char select_message );
void display_message( char kk, char select_message )
2. لماذا استخدمت المتغير value_duty لماذا لم تكتب مباشرة duty1 = (kk *100)/255
كود:
value_duty=kk;
duty1 = (value_duty *100)/255;
3. هذا السطر انا فهمت منه ان اجعل select_message=1 ولكن كيف اجعل kk=duty اليس من المفترض ان kk تساوى رقم
كود:
display_message(duty,1);
4. ما فائدة هذه المتغيرات وهل اذا لغيتهم هيحصل مشكلة
كود:
temp_flag1=2;
temp_flag2=0;
first_start=255;
وفى هذا السطر على سبيل المثال
كود:
if (act_temp >= 25 && act_temp <30 && (temp_flag1.b1==0||first_start==0) )
لو كتبته هكذا فقط (if (act_temp >= 25 && act_temp <30 ألن يحقق المطلوب
5. ممكن تشرحلى انت عملت ايه هنا
كود:
else{
     if(i==1)PWM1_Start();
     duty_man =duty+ ((i*255)/8) ;
     if(duty_man>255)
       {
         duty_man=0;
         duty=0;
        }
      display_message(duty_man , 0);
      }
delay_ms(250);
6. هذا الجزء (فى الدالة فى البداية ) أظن أن ليس له فائدة لأنك ذكرت وظيفته داخل البرنامج
كود:
if (kk==0)
     {
      PWM1_Stop();
      Lcd_out( 2,1,stop);
     }
معذرة أخى الكريم على الإطالة فأنت كما عهدتك صاحب فضل كبير وذا خلق كريم وهذه الاسئلة لأن ميعاد مناقشة المشروع قرب ولازم أكون مُـلم بكل شئ فيه

اعلانات

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


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

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

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


شكرا لك اخى الغالى على الشرح
معلش كان لى بعض الاستفسارات:
1. انت ليه كاتب هذا السطر مرتين مع اختلاف ان kk مرة عرفته float ومرة char
كود:
void display_message( float kk , char select_message );
void display_message( char kk, char select_message )
2. لماذا استخدمت المتغير value_duty لماذا لم تكتب مباشرة duty1 = (kk *100)/255
كود:
value_duty=kk;
duty1 = (value_duty *100)/255;
3. هذا السطر انا فهمت منه ان اجعل select_message=1 ولكن كيف اجعل kk=duty اليس من المفترض ان kk تساوى رقم
كود:
display_message(duty,1);
4. ما فائدة هذه المتغيرات وهل اذا لغيتهم هيحصل مشكلة
كود:
temp_flag1=2;
temp_flag2=0;
first_start=255;
وفى هذا السطر على سبيل المثال
كود:
if (act_temp >= 25 && act_temp <30 && (temp_flag1.b1==0||first_start==0) )
لو كتبته هكذا فقط (if (act_temp >= 25 && act_temp <30 ألن يحقق المطلوب
5. ممكن تشرحلى انت عملت ايه هنا
كود:
else{
     if(i==1)PWM1_Start();
     duty_man =duty+ ((i*255)/8) ;
     if(duty_man>255)
       {
         duty_man=0;
         duty=0;
        }
      display_message(duty_man , 0);
      }
delay_ms(250);
6. هذا الجزء (فى الدالة فى البداية ) أظن أن ليس له فائدة لأنك ذكرت وظيفته داخل البرنامج
كود:
if (kk==0)
     {
      PWM1_Stop();
      Lcd_out( 2,1,stop);
     }
معذرة أخى الكريم على الإطالة فأنت كما عهدتك صاحب فضل كبير وذا خلق كريم وهذه الاسئلة لأن ميعاد مناقشة المشروع قرب ولازم أكون مُـلم بكل شئ فيه
السلام عليكم
أعتذر عن تاخير لان جدا مشغول

بالنسبه لسؤال رقم 1
كود:
void display_message( float kk , char select_message );
void display_message( char kk, char select_message )
يمكنك اخي تغير kk ولكن للوضح لك الامر ان هذا متغير ليس عام وانما خاص للداله اي انه لايمكنك استخدامه الا في داخل داله نفسها لذلك اخي
انت غير التسميات لمنع اي تداخل

==================================
بالنسبه رقم 2
لماذا استخدمت المتغير value_duty لماذا لم تكتب مباشرة duty1 = (kk *100)/255
بالنسبه للمتغير هو اذا كان منة char لايمكن اجراء عليه عمليه حسابيه لانه مشكلته حجم 255 وعليه اذا زاد عن هذا الرقم راح يسبب مشاكل لذا انا حولته من char الى int
======================================
سؤال الثالث
هذا السطر انا فهمت منه ان اجعل select_message=1 ولكن كيف اجعل kk=duty اليس من المفترض ان kk تساوى رقم
كود:
display_message(duty,1);
الداله تأخذ متغير مو شرط ان اضع قيمه يمكنني ان اعطيه اي قيمه سواء كان رقم او رقم مخزون في متغير وطالما انت وضعته مكان متغير kk اذن معناه ان kk تساوي ماتضعه في مكانها


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


4. ما فائدة هذه المتغيرات وهل اذا لغيتهم هيحصل مشكلة
كود:
temp_flag1=2;
temp_flag2=0;
first_start=255;
أخي هذه متغيرات مهمه
1- temp_flag1 هو يسمح لك بأن تعرض رساله مره واحده على سبيل مثال

كود:
 if (act_temp < 24 && (temp_flag1.b0==0||first_start==0) )
             {
              temp_flag1=1;
              temp_flag2=0;
              first_start=255;
              portc.f0 = 0;   //signal to motor forward direction
              PWM1_Stop();
              Lcd_out( 2, 1,stop);
             }
فهذا temp_flag1 عباره عن 8 بت وانا في كل اختبار كالكود اعلاه لكي اسمح للبيك بأن ينفذ الامر مره واحده فقط وعليه كتبت temp_flag1=1 هذا ماذا يعني يعني لو تلاحظ الاختبار temp_flag1.b0==0 انا جعلت هذا flag =1

وهكذا كل كود انفذه اجعل flag خاص به =1 وصفر البقيه
ملاحظه سبب أختياري ل متغيرين أثنين
temp_flag1
temp_flag2
هو لان أختبارات او شروط الي وضعتها لمقارنه درجات حراره بحدود 9 شروط وكل flag هو 8 بت وبتالي لكي اسمح لكل شرط يتنفذ مره واحده احتاج الى متغيرين اثنان الاول يغطي 8 شروط الاولى والثاني لشروط اخرى

طبعا هو انت تسأل ليش ما أستخدمت لكل شرط متغير الجواب لكي اوفر بحجم الذاكره وانا بحقيقه لست محتاج لمتغير سعته 8بت وانما يكفي flag يعني بت واحد وبتالي اختاري ل متغير 1 بايت اي 8 بت اكدر استفاد منه بأني حصل منه 8 flags
مثلا بت رقم 6 يكتب هكذا temp_flag1.b5 طبعا حساب يبدأ من 0 لذا وضعت b5


طبعا بدون هذه flags راح اخلي البيك يعرض نفس الرساله مرات متكرره وهذا يسبب تهنج البيك وعلاوه على ذلك ماهو داعي من تكرار نفس الرساله عده مرات
===============================

5. ممكن تشرحلى انت عملت ايه هنا
كود:
else{
if(i==1)PWM1_Start();
duty_man =duty+ ((i*255)/8) ;
if(duty_man>255)
{
duty_man=0;
duty=0;
}
display_message(duty_man , 0);
}
delay_ms(250);
هذا الكود في حاله منول وهو بسيط
انت بالبدايه i=0 ومن يتم ضغط سويج مره الاولى راح يصبح i=1 عندها راح اشغل PWM وبعد ماكو حاجه اني اشغل PWM مره اخرى يعني يجب عليك اخي عدم جعل البيك يكرر الامر عده مرات لانه قد يسبب لك مشاكل

وهذه معادله
duty_man =duty+ ((i*255)/8
مهمتها تحسب duty ولكن لازم ماأبدا من البدايه اي لازم اكمل من duty الي انا مضبط عليها محرك لهذا وضعت duty+

طبعا انه لازم أختبر duty يجب ان لاتتجاوز قيمتها اكبر من 255 لانه سوف يسبب لك مشاكل منها هو PWM1_Set_Duty يأخذ char اي قيمه لاتتجاوز 255 فأذا انطيت مثلا 256 فأنه اتوماتيكا راح يساوي 1 لانه متغير حجمه 255 وبتالي راح يعيد نفسه من 0 الى 255 وهكذا لهذا يجب عليه اضع شرط اذا كان duty اكبر من 255 خلي duty =0 لكي يعيد من جديد وهكذا

===================================
if (kk==0)
{
PWM1_Stop();
Lcd_out( 2,1,stop);
}
أخي هذا الكود ضروري جدا لايقاف المحرك


البندقدارى
:: مهندس متواجد ::
تاريخ التسجيل: May 2009
المشاركات: 60
نشاط [ البندقدارى ]
قوة السمعة:
قديم 13-05-2015, 11:42 AM المشاركة 77   
افتراضي


جزاك الله كل خير اخى الكريم
معلش هذه النقطة لم افهمها جيدا

بالنسبه لسؤال رقم 1

كود:
void display_message( float kk , char select_message );
void display_message( char kk, char select_message )
يمكنك اخي تغير kk ولكن للوضح لك الامر ان هذا متغير ليس عام وانما خاص للداله اي انه لايمكنك استخدامه الا في داخل داله نفسها لذلك اخي
انت غير التسميات لمنع اي تداخل
يعنى دى دالتين اثنين أم دالة واحدة وانت كررتها بالخطأ
=============================================
وهذا الجزء لم يتضح لى

وفى هذا السطر على سبيل المثال


كود:
if (act_temp >= 25 && act_temp <30 && (temp_flag1.b1==0||first_start==0) )
لو كتبته هكذا فقط (if (act_temp >= 25 && act_temp <30 ألن يحقق المطلوب
=============================================
وهذه النقطة

كود:
if (kk==0)
{
PWM1_Stop();
Lcd_out( 2,1,stop);
}
أخي هذا الكود ضروري جدا لايقاف المحرك
انا فاهم اخى الكريم انه هام لايقاف المحرك لكن انا أرى انك لم تستدعيه فى البرنامج أبدا ... وكتبت هذا الشرط عوضا عنها فلهذا أرى انها لم تعد لها فائدة
كود:
if (act_temp < 25 && (temp_flag1.b0==0||first_start==0) )
             {
              temp_flag1=1;
              temp_flag2=0;
              first_start=255;
              portc.f0 = 0;       // stop motor
              PWM1_Stop();        // stop motor
              Lcd_out( 2, 1,stop);
             }


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


جزاك الله كل خير اخى الكريم
معلش هذه النقطة لم افهمها جيدا



يعنى دى دالتين اثنين أم دالة واحدة وانت كررتها بالخطأ
=============================================
وهذا الجزء لم يتضح لى


=============================================
وهذه النقطة

انا فاهم اخى الكريم انه هام لايقاف المحرك لكن انا أرى انك لم تستدعيه فى البرنامج أبدا ... وكتبت هذا الشرط عوضا عنها فلهذا أرى انها لم تعد لها فائدة
كود:
if (act_temp < 25 && (temp_flag1.b0==0||first_start==0) )
             {
              temp_flag1=1;
              temp_flag2=0;
              first_start=255;
              portc.f0 = 0;       // stop motor
              PWM1_Stop();        // stop motor
              Lcd_out( 2, 1,stop);
             }
أخي الكريم
بالنسبه للنقطه الاولى صحح عباره float الى char

للعلم هذه داله ليست مكرره مرتين وانما يجب تعريف داله في بدايه البرنامج لكي لاتظهر رساله خطأ بكومبايلر يعني البرنامج يبدأ من اعلى الى نهايه الاوامر فأذا أستدعيت داله وكانت هذه داله أسفل الاوامر الي ينفذها مايكرو راح يقول لك أين داله ؟ يعني يقول لك هذه داله ماأعرفها

مثلا انت عرف متغير X بس موقع هذا متغير قبل void main بتأكيد اذا كتبت كود وكان هذا كود بالبدايه يعني متغير X هو أسفل هذا الكود ماذا تتوقع من كومبايلر ؟
أكيد هو راح يقول لك أنا لاأعرف متغير X

أذن لتجنب هذه مشاكل عليك بتعريف متغيرات ودوال في البدايه برنامج قبل بدء بكتابه اي كود لاي داله

وتعريف داله سهل جدا اكتب فقط اسم داله في بدايه البرنامج ولكن لاتجعلها مفتوحه اي اضع بالنهايه فارزه منقوطه
كود:
void display_message( char kk , char select_message );
===========================================
بالنسبه للنقطه 2 كيف أخي لم أستخدمها ؟
مثلا هذا الكود لما يكون نظام على وضع اتو اي sw_select=1
كود:
if (act_temp >= 25 && act_temp <30 && (temp_flag1.b1==0||first_start==0) )
             {
              temp_flag1=2;
              temp_flag2=0;
              first_start=255;
              duty=32;
              display_message(duty,0);
             }
وهذا الكود لما يكون نظام على وضع منول sw_select=0
كود:
if (i >= 9 )
                  {
                   i = 0 ;
                   duty=0;
                   portc.f0 = 0;   //signal to motor forward direction
                   PWM1_Stop();
                   Lcd_out( 2,1,stop);
                  }
             else{
                  if(i==1)PWM1_Start();
                  duty_man =duty+ ((i*255)/8) ;
                  if(duty_man>255)
                    {
                     duty_man=0;
                     duty=0;
                    }
                  display_message(duty_man , 0);
                 }


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 14-05-2015 الساعة 05:08 AM


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