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

أدوات الموضوع

ardino160
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
المشاركات: 134
نشاط [ ardino160 ]
قوة السمعة:0
قديم 20-06-2016, 10:00 PM المشاركة 1   
افتراضي ما هو سبب Not enough RAM for call stack هذا الخطأ في mikroc Twitter FaceBook Google+



اسلام عليكم

اخواني الكرام انشئت برنامج بالمايكروسي واستعملت فيه عدة دوال حولي 10 دالة

وعند استدعاء 2 دوال في 8 دوال يترجم البرنامج بنجاح ومساحة المستهلكة في RAM هي %38

ولكن المشكلة هي عندما أعكس العملي يعني استدعاء 8 دالات في دالتين احصل على هذه رسالة Not enough RAM for call stack



عندما أعكس العملية يبقى نفس العدد المتغيرات

اعلانات

magdy_3
:: مهندس متميز ::
تاريخ التسجيل: Aug 2006
الدولة: Philippines
المشاركات: 343
نشاط [ magdy_3 ]
قوة السمعة:0
قديم 20-06-2016, 10:16 PM المشاركة 2   
افتراضي


السلام عليكم
اكتب لنا الكود حتى نفهم اكتر ونقدر نساعدك باذن الله

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً ardino160 ( شكر العضو على هذه المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

ardino160
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
المشاركات: 134
نشاط [ ardino160 ]
قوة السمعة:0
قديم 20-06-2016, 10:34 PM المشاركة 3   
افتراضي


السلام عليكم
اكتب لنا الكود حتى نفهم اكتر ونقدر نساعدك باذن الله
حسنا هذا هو الكود:

كود:
#define  value       adc_read(0)


char matrix[]={192,249,164,176,153,146,130,248,128,144,191};
char matrix1[]={64,121,36,48,25,18,2,120,0,16};
unsigned int resulte1=0,cf;
unsigned short a , cc=0 , df=0 , nn=0, motor=0, CNT=0, b=0, resulte2=0, dd=0, SECONDS=0, minute=0, hore=0 ;
float Vt,Rt,temp,y,ffv;
int n=0;




void segment(unsigned int nn)
{

          portb=255;portc=1;
          portb=matrix[nn/100];delay_ms(2);
          portb=255;portc=2;
          portb=matrix1[nn%100/10];delay_ms(2);
          portb=255;portc=4;
          portb=matrix[nn%100%10];delay_ms(2);

}

void temperatur()
{
          Vt = 5.0 * value / 1024.0;

          Rt = Vt * 7340.0 / (5.0 - Vt);

          y = log(Rt/15600.0);

          y = (1.0/298.15) + (y *(1.0/4950.0));

}


void test1_temp()
{
          while(temp < ffv)

         {

              portd.f6=1;

              resulte1 = temp*10;
              segment(resulte1);  portb=255;portc=8;  portb=198; delay_ms(5);          //   segment

         a++;

         if(a==80){ temperatur();  temp=1.0/y; temp = temp -273.15; a=0;  }


             if(porta.f3==0) { dd=1;;  while(porta.f3==0);  }

             if(dd != 0)break;
         }
}

void test2_temp()
{
         while(temp > ffv - 0.2)     //ffv/10) - 0.2
         {
              portd.f6=0;

              resulte1 = temp*10;
              segment(resulte1);  portb=255;portc=8;  portb=198; delay_ms(5);          //   segment

         a++;

         if(a==80){ temperatur();  temp=1.0/y; temp = temp -273.15; a=0;  }

               if(porta.f3==0) { dd=1;;  while(porta.f3==0); }


          if(dd != 0)break;

         }
}

void cunter1()
{
    while(dd==1){

           segment(n);                                                     //   segment

           if(porta.f1==0) { n = n + 1; while(porta.f1==0);  }

           if(porta.f2==0) { n = n - 1;while(porta.f2==0);  }

           if(n>450) { n=450; }
           if(n<0) { n=0; }

           if(porta.f3==0) { ffv=n/10; dd=2; while(porta.f3==0); }

                          }

 }


 void ddd()
{

    while(dd==2){

                          segment(nn);  portb=255;portc=8;  portb=240; delay_ms(5);

           if(porta.f1==0) { nn = nn + 1; while(porta.f1==0);  }

           if(porta.f2==0) { nn = nn - 1;while(porta.f2==0);  }

           if(nn>10) { nn=10; }
           if(nn<1) { nn=1; }

                          if(porta.f3==0) { dd=3; while(porta.f3==0); }

                          }

 }






void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit    = 0;
  TMR1H         = 0x6D;
  TMR1L         = 0x84;
  TMR1IE_bit    = 1;
  INTCON        = 0xC0;
}




void segment0(unsigned short nn1 , unsigned short dg)
  {
          portb=255;portc=16;
          portb=matrix1[nn1];delay_ms(2);
          portb=255;portc=32;
          portb=matrix[dg%100/10];delay_ms(2);
          portb=255;portc=64;
          portb=matrix[dg%100%10];delay_ms(2);

  }


void segment1()
  {
          portb=255;portc=16;
          portb=matrix[10];delay_ms(2);
          portb=255;portc=32;
          portb=matrix[10];delay_ms(2);
          portb=255;portc=64;
          portb=matrix[10];delay_ms(2);

  }


 void reglage_hore()
   {
   
    segment0(b , resulte2);
    if(porta.f1==0) { resulte2=resulte2+5; while(porta.f1==0);    if(b==9)  { if(resulte2>=60 )  { resulte2=55; b==9; }}  if(resulte2==60 )  { resulte2=0; b++; } }

    if(porta.f2==0) { resulte2=resulte2-5; while(porta.f2==0);    if(b==0)  { if(resulte2<5 )  { resulte2=5; b=0; }}  if(resulte2>60)  {  resulte2=55; b--; } }

    if(b>=9) { b=9; }
   }



 void hore_princip()

   {
  if(resulte2==0){ if(b==0){ resulte2=5;} }

            segment0(hore , minute);

//if(porta.f3==0) { dd=3; while(porta.f3==0); }

if(resulte2==minute) { if(b==hore) { portd.f7=1; dd=4; motor=0; } }




 while(dd==3){

          test1_temp();
         test2_temp();
         cunter1();
         ddd();


          reglage_hore();
   if(porta.f3==0) {
   SECONDS=0; minute=0; hore=0; dd=0; while(porta.f3==0); } }


 while(dd==4){

          test1_temp();
         test2_temp();
         cunter1();
         ddd();
 

          segment1();
  if(motor==3) { portd.f7=0; motor=0; hore=0; minute=0; SECONDS=0; dd=0; }


     }


   }







 //Timer1
//Prescaler 1:8; TMR1 Preload = 28036; Actual Interrupt Time : 100 ms

//Place/Copy this part in declaration section

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x6D;
    TMR1L         = 0x84;

   CNT++;
   if(CNT==10){SECONDS++;CNT=0;motor++; }
   if(SECONDS==60){SECONDS=0;minute++; }
   if(minute==60){minute=0;hore++;}
   if(hore==10)  {hore=0;}
  }
}




void main()
 {

 trisa=15;trisb=0;trisc=0; trisd=0;
 portb=0;portc=0; portd=0;
 adcon1=14;
 InitTimer1();




 while(1)
 
         {

         hore_princip();

         }

}


ardino160
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
المشاركات: 134
نشاط [ ardino160 ]
قوة السمعة:0
قديم 20-06-2016, 10:37 PM المشاركة 4   
افتراضي


ونوع المايكروكنترولر هو pic16f877a


محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:0
قديم 21-06-2016, 10:29 PM المشاركة 5   
افتراضي


اخي الكريم

حسب ما اذكر ان ال pic16f877a لا يمكن استدعاء اكثر من 8 روتينز او دوال في نفس الوقت لان حجم stack فيه 8

قد تكون الاشكالية هنا

جرب اخي بدل استدعاء 8 دوال في دالتين ان تستدعي 6 او 7 دوال مثلا ..

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً ardino160 ( شكر العضو على هذه المشاركة )

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 22-06-2016, 07:34 AM المشاركة 6   
افتراضي


السلام عليكم

حاول تقلل بعدد استدعاء دوال واحده داخل اخرى لان هذا البيك ذاكره stack هي 8 للعلم ايضا ان delay يعتبر داله يتم أستدعائها

او يمكنك استيدال هذا البيك بأخر مثل 18F45K22 له ذاكره استدعاء 32
وافضل بكثير من البيك 16f877a

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً ardino160 ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

ardino160
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2014
المشاركات: 134
نشاط [ ardino160 ]
قوة السمعة:0
قديم 24-06-2016, 06:10 PM المشاركة 7   
افتراضي


شكرا لكم اخواني الكرام لقد انحلت المشكلة الغيت بعض دوال

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025