اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : کامپایلر IAR

    INTVEC : قسمتی از کد که فهرست بردار های وقفه و ریست را در خود برای استفاده از وقفه ها حفظ می کند مثلا برای مگا 16 که 4 بایت می باشد

    دیدگاه


      پاسخ : کامپایلر IAR

      نوشته اصلی توسط mojtaba_led
      INTVEC : قسمتی از کد که فهرست بردار های وقفه و ریست را در خود برای استفاده از وقفه ها حفظ می کند مثلا برای مگا 16 که 4 بایت می باشد
      خوب حالا چجوری از MAP استفاده کنیم؟

      دیدگاه


        پاسخ : کامپایلر IAR

        خوب آخه فایل map که همین یک مورد نیست من این مسئله به عنوان یک مثال مطرح کردم که اگه مثلا یک چیزی مثل این توی ای فایل دید بدونید چیه!
        حالا استفاده هایی که من خودم تا حالا از این فایل کردم سه مورد بیشتر نبوده :
        1 . مقدرا حداقل cstack
        2. مقدار حداقل rstack
        3. در صد فضای اشغال شده از حافظه flash

        خوب در مورد هر سه تاش هم توی پست های قبل هم که گفتم چجوری باید استخراج بشن

        اما اگر مورد جدید بدرد بخوری به پستم خورد حتما عنوان میکنم از شما هم می خوام که اگر اطلاعاتی در این مورد بدست آوردید من رو بی نصیب نزارید !

        دیدگاه


          پاسخ : کامپایلر IAR

          چرا خروجی تابع sprintf در مد f اینقدر دراز میشه رشته ای که نشون میده منظورم اعداد بعد از ممیزه میشه کمترش کرد؟

          دیدگاه


            پاسخ : کامپایلر IAR

            بله میشه برای این کار باید از فرم زیر که توی اسن پست اشاره کردم استفاده کنید :

            char str [];
            sprintf(str,"%width.precisionمقدار عددی یا تک کاراکتر یا یک عبارت رشته ای ",کاراکتر)



            مثلا من توی تابع زیر برای نشون دان یگ عدد اعشاری با 2 رقم قبل از ممیز و 3 رقم بعد از ممیز SPRINTF رو به صورت زیر نوشتم :

            /*.....Display function: */
            void lcddp(char number){
            char str[16];
            char phname[]={'\0','R','S',&#039 ;T'};
            sprintf(str,"PF.%c = %2.3f",phname[number],PF[number]);
            lcd_home();
            lcd_puts(str);
            }



            دیدگاه


              پاسخ : کامپایلر IAR

              نوشته اصلی توسط mojtaba_led

              [];
              sprintf(str,"%width.precisionمقدار عددی یا تک کاراکتر یا یک عبارت رشته ای ",کاراکتر)



              مثلا من توی تابع زیر برای نشون دان یگ عدد اعشاری با 2 رقم قبل از ممیز و 3 رقم بعد از ممیز SPRINTF رو به صورت زیر نوشتم :
              [ltR]
              sprintf(str,"PF.%c = %2.3f",phname[number],PF[number]);
              نفهمیدم میشه دومی رو به فارسی بنویسید تا بفهمیم؟

              دیدگاه


                پاسخ : کامپایلر IAR

                خوب مثلا فرض کنید میخوایم عدد 25.6413441652 رو که در داخل متغیر a هست با 3 رقم اعشار روی LCD نشون بدیم کاری که باید بکنیم :

                char str[];
                float a=25.6413441652;
                sprintf(str,"a=%2.3f",a);
                lcd_puts(str); /* display : a=25.641*/

                دیدگاه


                  پاسخ : کامپایلر IAR

                  فکر میکنم اینطوری بنویسید بهتره

                  sprintf(str,"%تعداد ارقام صحیح.تعداد ارقام اعشاریf",ورودی از نوع float);

                  str هم رشته حاوی کارکتر ها هست
                  نوشته اصلی توسط mojtaba_led

                  char str[];
                  float a=25.6413441652;
                  sprintf(str,"a=%2.3f",a);

                  این میشه برای من اینطوری جواب داد

                  char str[];
                  float a=25.6413441652;
                  sprintf(str,"%2.3f,a);

                  دلیلش هم اینه که اگر مینویسید a= حتما این قسمت رو تغییر بدید به largو گرنه در مد full خود a نشون دهنده یک مد دیکد هست

                  ولی با این وضعیت هنوز اولیش برای من کار نمیکنه :cry:

                  دیدگاه


                    پاسخ : کامپایلر IAR

                    درست شد باز هم سوتی دادم% رو جا به جا گذاشته بودم

                    دیدگاه


                      پاسخ : کامپایلر IAR

                      نوشته اصلی توسط mojtaba_led
                      بله میشه برای این کار باید از فرم زیر که توی اسن پست اشاره کردم استفاده کنید :

                      char str [];
                      sprintf(str,"%width.precisionمقدار عددی یا تک کاراکتر یا یک عبارت رشته ای ",کاراکتر)



                      مثلا من توی تابع زیر برای نشون دان یگ عدد اعشاری با 2 رقم قبل از ممیز و 3 رقم بعد از ممیز SPRINTF رو به صورت زیر نوشتم :

                      /*.....Display function: */
                      void lcddp(char number){
                      char str[16];
                      char phname[]={'\0','R','S',&#039 ;T'};
                      sprintf(str,"PF.%c = %2.3f",phname[number],PF[number]);
                      lcd_home();
                      lcd_puts(str);
                      }
                      با سلام. جسارتاً یک نکته:
                      طول میدان مقادیر اعشاری به صورت w.df% بیان میشه که در اون w طول کل میدان و d طول قسمت اعشاره.
                      به عنوان مثال وقتی میدان رو به صورت 4.1f% بیان میکنیم یعنی دو رقم صحیح و یک رقم برای کاراکتر"." و یک رقم برای اعشار داریم.
                      عبارتی که نوشتید یعنی 2.3% کاملاً اشتباه است. چون طول مقدار اعشاری از کل طول میدان بیشتره در نتیجه کامپایلر رقم اعشار رو به طور خودکار گرد میکنه. برای همین ممکنه در ظاهر خروجی درست باشه. ولی در بسیاری موارد ممکنه خروجی اشتباه باشه.

                      دیدگاه


                        پاسخ : کامپایلر IAR

                        نوشته اصلی توسط شهریار رجب زاده
                        حالا یه مشکل دیگه هست وقتی lcd رو توی while که گاهی وقت ها به وجود میاد پاک میکنم lcd چرت و پرت نشون میده ولی بیرون while درسته oo:
                        نوشته اصلی توسط شهریار رجب زاده
                        کد:
                        #include <ioavr.h>
                        #include <intrinsics.h>
                        #include "lcd_0.h"
                        
                        __flash char a[]="XMEGA";
                        char s[5];
                        unsigned int b=0;
                        bool change=false;
                        void main()
                        {
                         lcd_init(16,2);
                         lcd_gotoxy(6,0);
                         lcd_puts_flash(a);
                         PORTD_DIR=0xff;
                         OSC_CTRL=0x03;       
                         while(!(OSC_STATUS & 2 )); 
                         CCP=0xd8;
                         CLK_CTRL=0x01;
                         PMIC_CTRL=0x01;
                         PORTC_INTCTRL=0x05;
                         PORTC_PIN1CTRL=0x11;
                         PORTC_PIN2CTRL=0x11;
                         PORTC_INT0MASK=0x02;
                         PORTC_INT1MASK=0x04;
                         PORTC_DIR=0x01;
                         TCC0_PER=0xffff;
                         TCC0_CCA=0;
                         TCC0_CTRLB=0x16;
                         TCC0_CTRLA=0x03;
                         __enable_interrupt();
                         lcd_gotoxy(0,1);
                         lcd_puts_ram("TCC0_CCA:");
                         sprintf(s,"%u",b);
                         lcd_gotoxy(10,1);
                         lcd_puts_ram(s);
                         while(1)
                         {
                          if(change==true)
                          {
                           b=TCC0_CCA;
                           sprintf(s,"%u",b);
                           lcd_cmd(0x01);
                           lcd_gotoxy(6,0);
                           lcd_puts_flash(a);
                           lcd_gotoxy(0,1);
                           lcd_puts_ram("TCC0_CCA:");
                           lcd_puts_ram(s);
                           change=false;
                          }
                         }   
                        }
                        #pragma vector=PORTC_INT0_vect
                        __interrupt void PORTC_INT0()
                        {
                         TCC0_CCA+=2048;
                         change=true;
                        }
                        #pragma vector=PORTC_INT1_vect
                        __interrupt void PORTC_INT1()
                        {
                         TCC0_CCA-=2048;
                         change=true;
                        }
                        این برنامه بود
                        اینم MAP
                        http://rajab-electronic.persiangig.com/Xmega/1.map
                        نوشته اصلی توسط شهریار رجب زاده
                        ببخشید مشکل به خاطر یه باگ توی کتابخونه lcd بود :redface:
                        وقتی پست های قبلی رو مطالعه میکردم به مشکلی که در روزهای گذشته داشتید دقت کردم. نکته ای در اون وجود داره که رعایت نشده:
                        در برنامه ای که نوشتید یک متغیر int به نام b و یک رشته به طول 5 به نام s رو به کار بردید. از اونجایی که متغیر b در هر دو حالت باعلامت یا بدون علامت حداکثر تعداد رقم های اون 5 تاست بنابر این برای اینکه توسط تابع sprintf تبدیل به رشته بشه باید طول رشته s برابر 6 باشه یعنی 5 بایت برای کاراکتر ها و یک بایت برای کارکتر نول در انتهای رشته. علت اینکه قبل از حلقه while عدد نمایش داده شده درسته اینه که b یک متغیر سراسری با مقدار اولیه 0 است و چون در طول برنامه قبل از حلقه while به اون مقدار دیگه ای داده نشده بنابر این یک رشته به طول 2 هم برای تبدیل عدد 0 به رشته کفایت میکنه. ولی در داخل حلقه while متغیر b مقادیر مختلفی اخذ میکنه که ممکنه رشته ای به طول 5 برای تبدیل این متغیر کافی نباشه .

                        دیدگاه


                          پاسخ : کامپایلر IAR

                          راستش رو بخواید من امتحان کردم
                          رشته رو با طول 1 در نظر گرفتم و دادم به sprint خروجیش این بود که تونست تا 3 عدد رو برام نشون بده همون مقداری که لازم داشتم
                          باگ کتابخونه از دستور lcd_clear(); بود
                          حالا یه مشکلی هست!
                          برنامه بگیر نگیر داره یعنی تو اجرا گاهی درست کار میکنه گاهی ناقص
                          که البته بیشتر درست کار میکنه

                          دیدگاه


                            پاسخ : کامپایلر IAR

                            مقدار پشته رو روی 200 یا 300 بزار درست میشه
                            در ضمن یه سوال
                            این iar واقعا توابع متنی کمه میشه کتابخونه جداگانه بهش اضافه کرد
                            اصلا برای کپی یا اضافه کردن مثلا
                            strcatn
                            strcpyn
                            strcatf
                            strcpyf
                            نداره و کلی تابع دیگه
                            کتابخونه ای کسی سراغ داره
                            هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                            بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                            میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

                            تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

                            دیدگاه


                              پاسخ : کامپایلر IAR

                              با سلام. جسارتاً یک نکته:
                              طول میدان مقادیر اعشاری به صورت w.df% بیان میشه که در اون w طول کل میدان و d طول قسمت اعشاره.
                              به عنوان مثال وقتی میدان رو به صورت 4.1f% بیان میکنیم یعنی دو رقم صحیح و یک رقم برای کاراکتر"." و یک رقم برای اعشار داریم.
                              عبارتی که نوشتید یعنی 2.3% کاملاً اشتباه است. چون طول مقدار اعشاری از کل طول میدان بیشتره در نتیجه کامپایلر رقم اعشار رو به طور خودکار گرد میکنه. برای همین ممکنه در ظاهر خروجی درست باشه. ولی در بسیاری موارد ممکنه خروجی اشتباه باشه.
                              جناب perfect از اینکه محبت کردید و اشتباهم رو بهم متذکر شدید واقعا سپاسگزارم ، امیدوارم که اگر بازهم اشتباهی در گفته هام دید حتما بهم بگید باز هم ممنونم .

                              و آقا شهریار از شما هم به خاطر اطلاعات غلطی که بهتون دادم واقعا عذر می خوام امیدوارم که من و ببخشیدو اگر اشتباه دیگری رخ داده بازم عذر می خوام .

                              دیدگاه


                                پاسخ : کامپایلر IAR

                                نوشته اصلی توسط mojtaba_led

                                و آقا شهریار از شما هم به خاطر اطلاعات غلطی که بهتون دادم واقعا عذر می خوام امیدوارم که من و ببخشیدو اگر اشتباه دیگری رخ داده بازم عذر می خوام .
                                مشکلی نیست فعلا مشکل ما حل شده
                                ببینم این sprintf تمام کاربرد هاش چیه؟
                                اگه موافقید بشینیم تابع رو تکه تکه کنیم oo:
                                اینطوری هر وقت به هر چیز نیاز داشتیم ازش استفاده کنیم
                                راستی یه سوال توابع از نظر کارکرد و محل حافظشون مثل وقفه های نرم افزاری هستند با این تفاوت که ما صداشون میکنیم اینطور نیست؟

                                دیدگاه

                                لطفا صبر کنید...