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

   

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



غريب ..
هل هو نفس الكود هنا أم مختلف عنه ؟:
http://www.qariya.info/vb/showthread...620#post942620
أن سبق لي استخدام برنامج في الرابط المذكور و كمررته إلى برتوس 8.1
و بعد الإجراءات التي توضحها الصور أصبح ممكن فتح البرنامج ببروتوس .
الشاشة تعرض نتائج والمحرك يدور :

لكن السويتش لا يتحكم في البرنامجإلا مرة وحيدة ولا يغير بعد ذلك أي شيء:
http://up.top4top.net/downloadf-top4...36f92-rar.html
هناك نقص أو خطأ في الكود
تخصصي هو البرمجة بفلوكود و مشاركاتي في موضوعك كانت في حدود إمكانياتي الحالية في ما يخص الميكروسي .
لكن إن شاء الله الإخوة خبراء الميكروسي سيساعدونك على تجاوز هذه الصعوبات
فعلا انا كنت مشارك قبل كدة فى الموضوع اللى ذكرته وانا قولت كدة فى بداية الموضوع

اما بخصوص السويتش انا عاوز انه لما ادوس عليه يزود السرعة ويظل ثابت عليها لكن حساس الحرارة اكيد هيغير السرعة طبقا لدرجة الحرارة ومش عارف ازاى اجعله يثبت على السرعة بالسويتش

هذا غير الخطأ فى الكود الذى لا يعطى النتائج صحيحة كما قولت فى بداية الموضوع

اعلانات

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


ايه يا بشمهندس حسن هادي محمود

انا رفعتلك الفولدر على موقع تانى ومنتظر ردك على احر من الجمر

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

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


ايه يا بشمهندس حسن هادي محمود

انا رفعتلك الفولدر على موقع تانى ومنتظر ردك على احر من الجمر
السلام عليكم
هو كود فيه مجموعه من الاخطاء
1- استعمال الرام بشكل كبير وخصوصا في هذا النوع من البيك سوف يسبب مشاكل كبيره جدا لذا لاتحاول خزن الرسائل في رام لاني لاحظته لايستجيب لبعض الاوامر شاهد الكود المعدل

2- عند التعامل مع IF وكنت قد وضعت مجموعه من شروط يستوجب تحقيق احداها عند ذلك أستخدم else لكي لاينفذ مايكرو سوى شرط واحد فقط

3- هناك مشكله في داله if وهي عند التعامل مع قيمه متغيره يعني انلوك يفضل عدم ذكر علامه =
يعني انت تقول اذا درجه حراره بين 25 و 30 نفذ كذا اذن لاتقول اذا درجه حراره==25 واصغر من 30 نفذ كذا فهذا خطأ لانه قد لاتكون درجه حراره =25 وانما مثلا 25.1 عندها لاينفذ شرط أطلاقا

في مثل هذه حالات (( انلوك بشكل عام )) هو تقول اذا كانت درجه حراره اكبر او تساوي 25 واصغر من 30 نفذ كذا

4- لاتحاول استعمل متغيرات من نوع int وانت تعرف ان هذه متغيرات قيمهم لاتتجاوز 255 يعني حاول توفير في رام

على عموم هذا هو كود معدل (( طبعا يحتاج تعديل في كود سويج ولكن حاليا جرب الكود وبعدها نكمل التعديل في كود سويج ))
ايضا هناك تعديل مهم هو ايقاف محرك يجب قطع كهرباء عنه بالكامل
على عموم سوف يتم تعديل على هاتين فقرتين لاحقا بعد تجربه هذا الكود
كود:
// Lcd pinout settings
   sbit LCD_RS at RB2_bit;
   sbit LCD_EN at RB3_bit;
   sbit LCD_D4 at RB4_bit;
   sbit LCD_D5 at RB5_bit;
   sbit LCD_D6 at RB6_bit;
   sbit LCD_D7 at RB7_bit;

   // Pin direction
   sbit LCD_RS_Direction at TRISB2_bit;
   sbit LCD_EN_Direction at TRISB3_bit;
   sbit LCD_D4_Direction at TRISB4_bit;
   sbit LCD_D5_Direction at TRISB5_bit;
   sbit LCD_D6_Direction at TRISB6_bit;
   sbit LCD_D7_Direction at TRISB7_bit;
   
 // variables
   float temp , act_temp ;
   char disp[15], i, flag = 0 , flag_message=0;
   int duty;
   char txt[17],x;

const char *message_duty="Duty cycle=";
void display_message( float kk )
{
 lcd_out(2,12,"     ");
 for(x=0;x<11;x++)txt[x]=message_duty[x];
 txt[11]=0;
 FloatToStr(kk,disp);
 disp[4]=0;// reset pointer
 strcat(txt,disp );
 txt[15]=0;
 lcd_out(2,1,txt);
 lcd_chr_cp('%');
}

void main()
  {

   trisa = 1; trisb = 0; trisc = 0; trisd = 1; trise = 0;
   porta = 0; portb = 0; portc = 0; portd = 0; porte = 0;

   adcon1= 0b11011110 ;  //initialize A0 as analog input

   // LCD instruction
   Lcd_Init();
   Lcd_cmd(_Lcd_cursor_off);
   Lcd_out( 1, 1, "temp = ");

   PWM1_Init(5000); //initialise PWM1 at 5KHz

   while(1)  // start infinit loop
    {
     // temperature reading & calculation
     temp = ADC_Read(0);
     act_temp = (temp * 500) / 1024;
     floattostr(act_temp, disp); //converting float to char
     disp[4]=0;
     Lcd_out(1, 8,disp);

     portc.f0 = 1;   //signal to motor forward direction

     // PWM orders
     if (act_temp >= 25 && act_temp <30 )
       {
        PWM1_Start(); PWM1_Set_Duty(32);
        if(flag_message.b0==0)display_message(12.5);
        flag_message=0x01;
       }

     else if (act_temp >=30 && act_temp <35 )
           {
            PWM1_Start(); PWM1_Set_Duty(64);  
            if(flag_message.b1==0)display_message(25);
            flag_message=0x02;
           }

     else if (act_temp >= 35 && act_temp <40 )
              {
               PWM1_Start(); PWM1_Set_Duty(96);  
               if(flag_message.b2==0)display_message(37.5);
               flag_message=0x04;
              }

     else if (act_temp >= 40 && act_temp <45 )
              {
               PWM1_Start(); PWM1_Set_Duty(127);
               if(flag_message.b3==0)display_message(50);
               flag_message=0x08;
              }

     else if (act_temp >= 45 && act_temp <50 )
           {
            PWM1_Start(); PWM1_Set_Duty(159); 
            if(flag_message.b4==0)display_message(62.5);
            flag_message=0x10;
           }

     else if (act_temp >= 50 && act_temp <55 )
           {
            PWM1_Start(); PWM1_Set_Duty(191); 
            if(flag_message.b5==0)display_message(75);
            flag_message=0x20;
           }

     else if (act_temp >= 55 && act_temp <60 )
            {
             PWM1_Start(); PWM1_Set_Duty(223); 
             if(flag_message.b6==0)display_message(87.5);
              flag_message=0x40;
            }

     else if (act_temp >= 60  )
            {
             PWM1_Start(); PWM1_Set_Duty(255);
             if(flag_message.b6==0)display_message(100);
             flag_message=0x40;
            }

     if (portd.f0 == 1) flag = 1;
     if (portd.f0 == 0  && flag == 1)  // if the push button is pushed
        {
         i++;
         PWM1_Start();   //start PWM1
         duty = (i*255)/8 ;
         if(duty>=255)duty=255;
         PWM1_Set_Duty(duty); // set duty cycle from 25% to 100%
         display_message((duty*100)/255);
         flag=0;
         delay_ms(250);
        }
     if (i == 9 || act_temp < 25)
        {
         i = 0 ;
         PWM1_Stop();
         
         Lcd_out( 2, 1,"     STOP       ");
        }
    } //end loop
  } //end main


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


ممكن تشرحلى وظيفة الدالة اللى انت عملتها ... انا لا افهمها جيدا

كود:
const char *message_duty="Duty cycle=";
void display_message( float kk )
{
 lcd_out(2,12,"     ");
 for(x=0;x<11;x++)txt[x]=message_duty[x];
 txt[11]=0;
 FloatToStr(kk,disp);
 disp[4]=0;// reset pointer
 strcat(txt,disp );
 txt[15]=0;
 lcd_out(2,1,txt);
 lcd_chr_cp('%');
}
بالاضافة ان الكود لا زال لا يعمل



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


ممكن تشرحلى وظيفة الدالة اللى انت عملتها ... انا لا افهمها جيدا

كود:
const char *message_duty="Duty cycle=";
void display_message( float kk )
{
 lcd_out(2,12,"     ");
 for(x=0;x<11;x++)txt[x]=message_duty[x];
 txt[11]=0;
 FloatToStr(kk,disp);
 disp[4]=0;// reset pointer
 strcat(txt,disp );
 txt[15]=0;
 lcd_out(2,1,txt);
 lcd_chr_cp('%');
}
بالاضافة ان الكود لا زال لا يعمل

من ناحيه ظهور رسائل خطأ فأنا لاتظهر عندي لااعرف ماهي مشكله عندك ولكن قم بتحميل مشروع من هذا الرابط
http://up.top4top.net/downloadf-top4...1f221-rar.html


اما بالنسبه لشرح داله حيث تأخذ متغير من نوع float
كود:
void display_message( float kk )
حيث بالبدايه أحتاج الى مسح الارقام الاخيره والتي تمثل duty لان قسم منها يبقى مثلا لو كانت duty=100% ثم اصبحت duty=50% هنا سوف تظهر بالشاشه %duty=50% لذا يجب مسح الارقام الاخيره والتي تتغير
كود:
lcd_out(2,12,"     ");
ثم أبدء بنقل هذه مصفوفه الى مصفوفه اخرى بأعتبار الاولى من نوع const
كود:
message_duty="Duty cycle=";
اي
كود:
for(x=0;x<11;x++)txt[x]=message_duty[x];
ثم أعمل ريسيت للمؤشر لضمن وضع 11 عنصر وهي طول رساله "Duty cycle="
اي اكتب
كود:
 txt[11]=0;
الان مفروض تظهر على شاشه هذه رساله Duty cycle=

بعدها اريد أظهار قيمه duty على شاشه حيث تم خزنها في متغير kk
احول قيمه من float الى text
كود:
FloatToStr(kk,disp);
حيث تم خزن نتيجه التحويل في مصفوفه disp
طبعا انا محتاج فقط 5 عناصر مثلا 187.5لذا يجب عمل رسيت للمؤشر بكتابه
كود:
disp[4]=0;// reset pointer
الان اريد اضافه disp الى مصفوفه الاساسيه txt عن طريق الامر strcat
عمل ريست للعنصر الاخير للمصفوفه
كود:
txt[15]=0;
الان اعرض الرساله
كود:
lcd_out(2,1,txt);
 lcd_chr_cp('%');

تحياتي


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 21-03-2015 الساعة 01:38 PM

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


تمام المشروع اللى انت رفعته اشتغل معى لكن الجزء اليدوى عن طريق السويتش لا يعمل

وكان عندى استفسارات تانية

1. هذا الكود
كود:
lcd_out(2,12,"     ");
أليس يساوى
كود:
Lcd_Cmd(_LCD_CLEAR);
2. وهذا الكود
كود:
disp[4]=0;// reset pointer
أليس يساوى
كود:
Lcd_cmd(_Lcd_cursor_off);
3. المتغير disp انت استخدمته لعرض قيمة duty وأيضا لعرض قيمة temp كيف يكون له قيمتين

انا قمت بالبحث عن مشكلة stack overflow excuting call instruction
وكان السبب هو كثرة استخدام الجمل الشرطية if/ else if
فهل دة صحيح وهل فى pic16f877a ممكن البرنامج لا يعمل بسبب هذه المشكلة

أنا اسف جدا على كثرة الاسئلة لكن انا لسة مبتدئ فى عالم البرمجة وفى اشياء كثيرة لا أعلمها


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


تمام المشروع اللى انت رفعته اشتغل معى لكن الجزء اليدوى عن طريق السويتش لا يعمل

وكان عندى استفسارات تانية

1. هذا الكود
كود:
lcd_out(2,12,"     ");
أليس يساوى
كود:
Lcd_Cmd(_LCD_CLEAR);
2. وهذا الكود
كود:
disp[4]=0;// reset pointer
أليس يساوى
كود:
Lcd_cmd(_Lcd_cursor_off);
3. المتغير disp انت استخدمته لعرض قيمة duty وأيضا لعرض قيمة temp كيف يكون له قيمتين

انا قمت بالبحث عن مشكلة stack overflow excuting call instruction
وكان السبب هو كثرة استخدام الجمل الشرطية if/ else if
فهل دة صحيح وهل فى pic16f877a ممكن البرنامج لا يعمل بسبب هذه المشكلة

أنا اسف جدا على كثرة الاسئلة لكن انا لسة مبتدئ فى عالم البرمجة وفى اشياء كثيرة لا أعلمها
السلام عليكم
بالنسبه لجواب نقطه 1
فالكود
كود:
lcd_out(2,12,"     ");
اريد فقط مسح بعض الخلايا وبتداءا من 12 من عمود 2 اما الامر
كود:
Lcd_Cmd(_LCD_CLEAR);
فهو لمسح الشاشه بأكملها

================================
نقطه 2
كود
كود:
disp[4]=0;// reset pointer
يعني مصفوفه disp حددها لي بخمسه عناصر فقط
راجع هذا موضوع
http://www.qariya.info/vb/showthread.php?t=162098

اما كود
كود:
Lcd_cmd(_Lcd_cursor_off);
فهو لايقاف وميض مؤشر الي يظهر بالشاشه
===================================
نقطه 3
ارجو توضيح اكثر
للعلم disp هي مصفوفه خزنت فيها نتيجه التحويل
كود:
FloatToStr(kk,disp);
==============================
اما قولك
انا قمت بالبحث عن مشكلة stack overflow excuting call instruction
وكان السبب هو كثرة استخدام الجمل الشرطية if/ else if
فهل دة صحيح وهل فى pic16f877a ممكن البرنامج لا يعمل بسبب هذه المشكلة

كلام غير صحيح لان هذه مشكله تظهر عند التعامل مع مصفوفات
راجع موضوع الذي ذكرته في نقطه 2



تحياتي


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


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

لكتابة الدرجة بالسيليزوس بعد السطر
كود:
Lcd_out(1, 8,disp);
مش المفروض انى اكتب هذا الكود ؟؟
كود:
Lcd_Chr(1,13,223);                 
Lcd_Chr(1,14,'C');
بالنسبة للنقطه 3

كان قصدى انك استخدمت المتغير disp فى الدالة التى كتبتها
كود:
FloatToStr(kk,disp);
 disp[4]=0;// reset pointer
 strcat(txt,disp );
وايضا نفس المتغير استخدمته مرة ثانية فى حسابات الحرارة فى اول حلقة while

كود:
temp = ADC_Read(0);
     act_temp = (temp * 500) / 1024;
     floattostr(act_temp, disp); //converting float to char
     disp[4]=0;
     Lcd_out(1, 8,disp);
فكيف يكون له قيمتين


التعديل الأخير تم بواسطة : البندقدارى بتاريخ 24-03-2015 الساعة 05:43 AM


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