اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

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

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

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

    دیدگاه


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

      http://www.persiangig.com/pages/down...t/lcd_4bit.zip
      این کتابخونه ای بود که آقای کی نژاد نوشته بودند من هم یه مقدار تغییرش دادم
      الآن مشکل رو برطرف کردم ولی بازم میزارم
      راستی این definechar چجوری کار میکنه؟

      دیدگاه


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

        نوشته اصلی توسط شهریار رجب زاده
        ببینم این sprintf تمام کاربرد هاش چیه؟
        در مورد کاربرد sprintf فکر نمیکنم بیشتر از اونچیزی باشه که قبلا بهش اشاره کردم یا حداقل مهمترین کاربردهاش اون ها هستند .

        نوشته اصلی توسط شهریار رجب زاده
        اگه موافقید بشینیم تابع رو تکه تکه کنیم oo:
        اینطوری هر وقت به هر چیز نیاز داشتیم ازش استفاده کنیم
        یعنی دقیقا چیکار کنیم ؟
        نوشته اصلی توسط شهریار رجب زاده
        راستی یه سوال توابع از نظر کارکرد و محل حافظشون مثل وقفه های نرم افزاری هستند با این تفاوت که ما صداشون میکنیم اینطور نیست؟
        تا اونجایی که من فهمیدم تابع یک زیر برنامه هست مثل روتین وقفه که در تابع اصلی یا در هر جای دیگه از برنامه مثل همین روتین وقفه(البته معمولا سعی میشه که در داخل روتین وقفه تابعی فراخونی نشه) میتونه فراخوانی بشه چه بسا که خود تابع اصلی هم میتونه در توابع دیگه فراخونی بشه که عموما این کار صورت نمیگیره چون اگه اینکار انجام بشه باید تمام رجیستر هایی که داخل تابع اصلی استفاده شدند به data stack پوش بشن به خاطر همین می تونید تابع اصلی رو با پیشوند "C_task__"شروع کنید این کار باعث میشه که فضای استک و حجم کد حفظ بشه اما وقفه ها با توجه به آدرس بردار وقفه مربوطه ، در زمان بالا رفتن پرچمشون و درصورت فعال بودن اینتراپتشون و اینتراپت سراسری توسط cpu فراخونی میشن و مقدار شمارنده برنامه برابر با مقدار موجود در بردار وقفه میشه و ادامه برنامه هم از همون آدرس اجرا میشه تا اینکه روتین خاتمه پیدا می کنه و بعد از تموم شدن به جایی که ازش امده بود بر میگرده
        و در هر دو تاشون هم به محض ورود بهشون مقادیر رجیستر وضعیت بعلاوه رجیسترهای عمومی که در روتین شون استفاده شدند به داخل DATA STACK پوش می شوند و در انتها و قبل از برگشت به مسیر اصلی برنامه تمام رجیستر ها از داخل DATA STACK پوپ میشن البته به ترتیب عکس موقع پوش شدن

        البته مهمتر از همه باید ببینیم که این گفته های من چقدرش درسته ! :read:

        دیدگاه


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

          نوشته اصلی توسط mojtaba_led
          در مورد کاربرد sprintf فکر نمیکنم بیشتر از اونچیزی باشه که قبلا بهش اشاره کردم یا حداقل مهمترین کاربردهاش اون ها هستند .
          یعنی دقیقا چیکار کنیم ؟
          بیایم مثلا بگیم برای int یه تابع برای float یه تابع الی آخر
          همین تابع در حد کیلو حجم داره!

          دیدگاه


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

            آخه این که فایل سورسش یا همون c. موجود نیست ، هست ؟
            واقعیتش رو هم بخواهید من تمایل چندانی برای اینکار ندارم چرا که اولا این یکی از توابع استاندارد خود نرم افزار هستش و اینکه شاید اگر فعلا روی قسمت های دیگه بیشتر وقت صرف کنیم بهتر باشه البته این نظر منه تا نظر شما چی باشه!

            دیدگاه


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

              نوشته اصلی توسط شهریار رجب زاده
              http://www.persiangig.com/pages/down...t/lcd_4bit.zip
              این کتابخونه ای بود که آقای کی نژاد نوشته بودند من هم یه مقدار تغییرش دادم
              الآن مشکل رو برطرف کردم ولی بازم میزارم
              راستی این definechar چجوری کار میکنه؟
              سلام.
              حق با شماست. علت اشکال اینه که تاخیر لازم بعد از دو دستور LCD_CLR و LCD_HOME ایجاد نمیشه.این دو دستور برای اجرا توسط LCD بیش از دستورات دیگه نیاز به زمان دارند(حدود 2ms ). اگه فرصت داشتید دو تابع lcd_cmd و lcd_data که توابع اصلی این library هستند رو به صورت زیر تغییر بدید و برنامه رو با توابع جدید امتحان کنید. بنده چون xmega در دسترسم نبود امتحان نکردم. لطفا نتیجه رو هم اعلام کنید.

              کد:
              ///////////////////////////////////////
              void lcd_data(unsigned char Data)
              {
               #ifdef LCD_BUSY_CHECK
               lcd_busywait();
               RW_Low();
               #endif
               
               lcd_datalines(Data>>4);
               
               RS_High();
               RW_Low();
              
               E_High();
               _delay_us(20);
               E_Low();
               _delay_us(20);
              
               lcd_datalines(Data); 
               E_High();
               _delay_us(20);
               E_Low();
              
               #ifndef LCD_BUSY_CHECK 
               _delay_us(400); 
               #endif
              }
              
              ///////////////////////////////////////
              
              void lcd_cmd(unsigned char Command)
              {
              
              unsigned char com;
              
               #ifdef LCD_BUSY_CHECK
              
               lcd_busywait();
               RW_Low();
               #endif
              com=Command;
              
               lcd_datalines((Command>>4)); 
               RS_Low();
               RW_Low();
               E_High();
               _delay_us(20);
               E_Low();
               _delay_us(20);
               lcd_datalines(Command); 
               E_High();
               _delay_us(20);
               E_Low();
              
               #ifndef LCD_BUSY_CHECK
               if ((com==LCD_CLR)||(com==LCD_HOME))
                delay_ms(3);
               else delay_ms(1);
               #endif
              
              }
              
              ///////////////////////////////////////

              دیدگاه


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

                نوشته اصلی توسط Perfect
                سلام.
                حق با شماست. علت اشکال اینه که تاخیر لازم بعد از دو دستور LCD_CLR و LCD_HOME ایجاد نمیشه.این دو دستور برای اجرا توسط LCD بیش از دستورات دیگه نیاز به زمان دارند(حدود 2ms ). اگه فرصت داشتید دو تابع lcd_cmd و lcd_data که توابع اصلی این library هستند رو به صورت زیر تغییر بدید و برنامه رو با توابع جدید امتحان کنید. بنده چون xmega در دسترسم نبود امتحان نکردم. لطفا نتیجه رو هم اعلام کنید.

                کد:
                ///////////////////////////////////////
                void lcd_data(unsigned char Data)
                {
                 #ifdef LCD_BUSY_CHECK
                 lcd_busywait();
                 RW_Low();
                 #endif
                 
                 lcd_datalines(Data>>4);
                 
                 RS_High();
                 RW_Low();
                
                 E_High();
                 _delay_us(20);
                 E_Low();
                 _delay_us(20);
                
                 lcd_datalines(Data); 
                 E_High();
                 _delay_us(20);
                 E_Low();
                
                 #ifndef LCD_BUSY_CHECK 
                 _delay_us(400); 
                 #endif
                }
                
                ///////////////////////////////////////
                
                void lcd_cmd(unsigned char Command)
                {
                
                 #ifdef LCD_BUSY_CHECK
                
                 lcd_busywait();
                 RW_Low();
                 #endif
                 
                
                 lcd_datalines((Command>>4)); 
                 RS_Low();
                 RW_Low();
                 E_High();
                 _delay_us(20);
                 E_Low();
                 _delay_us(20);
                 lcd_datalines(Command); 
                 E_High();
                 _delay_us(20);
                 E_Low();
                
                 #ifndef LCD_BUSY_CHECK
                 if ((Command==LCD_CLR)||(Command==LCD_HOME))
                  delay_ms(3);
                 else delay_ms(1);
                 #endif
                
                }
                
                ///////////////////////////////////////
                درست شد منتها الآن یه مشکل جدید دارم
                دو تا کلید رو به دو وقفه وصل کردم که قراره یکی مقدار رو زیاد و دیگری کم کنه(مقدار TCC0_CCA)ولی گاهی زیادی اضافه یا کم میکنند و خیلی کم هم پیش میاد هم برعکس عمل میکنند oo:
                به نظرتون اشکال از چیه؟
                کد:
                #include <ioavr.h>
                #include <intrinsics.h>
                #include "lcd_4bit.h"
                
                __flash char a[]="XMEGA";
                __flash unsigned char q[]={0x15,0x0a,0x15,0x0a,0x15,0x0a,0x15,0x0a};
                char s[1];
                unsigned int b=0,x=0;
                float c=0,d=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=65500;
                 TCC0_CCA=0;
                 TCC0_CTRLB=0x16;
                 TCC0_CTRLA=0x01;
                 __enable_interrupt();
                 lcd_gotoxy(3,1);
                 lcd_puts_ram("Speed : ");
                 sprintf(s,"%u",x);
                 lcd_puts_ram(s);
                 lcd_puts_ram("%");
                 lcd_definechar(q,0);
                 lcd_cmd(0);
                 while(1)
                 {
                  if(change==true)
                  {
                   c=TCC0_CCA;
                   if(c!=0)
                   {
                    d=(c/65500);
                    d*=100;
                    x=d;
                   }
                   else
                    x=0;
                   sprintf(s,"%u",x);
                   lcd_clear();
                   lcd_gotoxy(6,0);
                   lcd_puts_flash(a);
                   lcd_gotoxy(3,1);
                   lcd_puts_ram("Speed : ");
                   lcd_puts_ram(s);
                   lcd_puts_ram("%");
                   change=false;
                  }
                 }   
                }
                #pragma vector=PORTC_INT0_vect
                __interrupt void PORTC_INT0()
                {
                 b=TCC0_CCA;
                 if(b!=65500)
                 {
                  TCC0_CCA+=3275;
                  change=true;
                 }
                }
                #pragma vector=PORTC_INT1_vect
                __interrupt void PORTC_INT1()
                {
                 b=TCC0_CCA;
                 if(b!=0)
                 {
                  TCC0_CCA-=3275;
                  change=true;
                 }
                }

                دیدگاه


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

                  نوشته اصلی توسط شهریار رجب زاده
                  درست شد منتها الآن یه مشکل جدید دارم
                  دو تا کلید رو به دو وقفه وصل کردم که قراره یکی مقدار رو زیاد و دیگری کم کنه(مقدار TCC0_CCA)ولی گاهی زیادی اضافه یا کم میکنند و خیلی کم هم پیش میاد هم برعکس عمل میکنند oo:
                  به نظرتون اشکال از چیه؟
                  کد:
                  #include <ioavr.h>
                  #include <intrinsics.h>
                  #include "lcd_4bit.h"
                  
                  __flash char a[]="XMEGA";
                  __flash unsigned char q[]={0x15,0x0a,0x15,0x0a,0x15,0x0a,0x15,0x0a};
                  char s[1];
                  unsigned int b=0,x=0;
                  float c=0,d=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=65500;
                   TCC0_CCA=0;
                   TCC0_CTRLB=0x16;
                   TCC0_CTRLA=0x01;
                   __enable_interrupt();
                   lcd_gotoxy(3,1);
                   lcd_puts_ram("Speed : ");
                   sprintf(s,"%u",x);
                   lcd_puts_ram(s);
                   lcd_puts_ram("%");
                   lcd_definechar(q,0);
                   lcd_cmd(0);
                   while(1)
                   {
                    if(change==true)
                    {
                     c=TCC0_CCA;
                     if(c!=0)
                     {
                      d=(c/65500);
                      d*=100;
                      x=d;
                     }
                     else
                      x=0;
                     sprintf(s,"%u",x);
                     lcd_clear();
                     lcd_gotoxy(6,0);
                     lcd_puts_flash(a);
                     lcd_gotoxy(3,1);
                     lcd_puts_ram("Speed : ");
                     lcd_puts_ram(s);
                     lcd_puts_ram("%");
                     change=false;
                    }
                   }   
                  }
                  #pragma vector=PORTC_INT0_vect
                  __interrupt void PORTC_INT0()
                  {
                   b=TCC0_CCA;
                   if(b!=65500)
                   {
                    TCC0_CCA+=3275;
                    change=true;
                   }
                  }
                  #pragma vector=PORTC_INT1_vect
                  __interrupt void PORTC_INT1()
                  {
                   b=TCC0_CCA;
                   if(b!=0)
                   {
                    TCC0_CCA-=3275;
                    change=true;
                   }
                  }
                  با یک نگاه کلی و بدون تحلیل برنامه چند اشکال مشاهده میشه که مربوط به نسبت دادن متغیر های float به integer و بالعکس است.
                  متغیر c از نوع ممیز شناور است و چون نوع ذخیره اعداد ممیز شناور با اعداد صحیح تفاوت دارد نسبت دادن یک متغیر صحیح 16 بیتی ( TCC0_CCA ) به آن اشتباه است.
                  همچنین متغیر x را از نوع صحیح تعریف کردیدو ولی در قسمتی از برنامه یم متغیر float رو به اون نسبت دادید که اشتباه است و عدد منتقل شده به این متغیر با مقدار واقعی تفاوت دارد .
                  برای حل این مشکل اگر اشتباه نکنم میتونید به جای دو عبارت زیر :
                  کد:
                  c=TCC0_CCA;
                  x=d;
                  میتونید بنویسید:

                  کد:
                  c=(float)TCC0_CCA;
                  x=(int)d;
                  البته مطمئن نیستم و اساتید باید نظر بدهند.
                  ضمناً باید در زمان انتقال یک عدد float به یک متغیر int باید مواظب باشید که عدد مورد نظر از یک عدد 16 بیتی بزرگتر نباشه.

                  دیدگاه


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

                    سلام.
                    تو اینترنت داشتم میگشتم که تو یکی از این سایتهای چینی یه مقدار فایل در مورد کامپایلر IAR پیدا کردم که شامل PDF های کوتاهی از معرفی کامپایلر ،مقایسه با دیگر کامپایلر ها،توضیهات در مورد ان و یک سری فایل FLASH شامل اشنائی با قسمتهای مختلف اون و....

                    http://s2.picofile.com/file/7122148595/IAR.rar.html
                    دکتر شریعتی:

                    زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

                    دیدگاه


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

                      سلام.ببخشید می پرم وسط.این خط کد که در مورد سون سگمنت در کد های مهندس کی نژاد دیدم چی کار میکنه:
                      کد:
                      __flash unsigned char seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                       0x7d,0x07,0x7f,0x6f};
                      همیشه در حال یادگیری.سعی می کنم موانع سر راهم را بردارم.

                      دیدگاه


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

                        سلام علی آقا
                        اینجا 10 تا ثابت عددی یک بایتی در قالب یک آرایه ی 10 درایه ای از نوع unsigned char در حافظه فلش ذخیره میشه

                        دیدگاه


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

                          سلام استاد عزیز جناب طراح
                          ببخشید هنوز نرم افزار IAR را نگرفتم برای همین این سوال را می پرسم
                          اینکه آیا Syntax نرم افزار IAR با Codevision یکی است یا متفاوتند از اینرو می پرسم که اگر بخواهم با XMega کار کنم می توانم براحتی از Codevision به IAR سوییچ کنم یا خیر؟
                          با سپاس فراوان
                          مولای من
                          نخواهمت که بگریی ولی به گریه دعا کن که وقت رفتن ایام انتظار بیاید

                          یا رب الحسین بحق الحسین اشف صدر الحسین بظهورالحجه

                          دیدگاه


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

                            از نظر اینکه هر دو کامپایلر زبان C هستند، اشتراکات فراوانی در آنها وجود دارد.اما به هر حال هر کامپایلری از نظر محیط کار و تنظیمات دارای ویژگی های خاص خود است. اصولا کار کرد با IAR مشکل تر از فضای کدویژن است، اما مزایایی هم دارد که بارها در مورد آن بحث شده و استفاده از آن را برای برخی کاربردها توجیه پذیر می کند.
                            اوژن: به معنای افکننده و شکست دهنده است
                            دانایی، توانایی است-Knowledge is POWER
                            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                            دیدگاه


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

                              دوستان توصیه میکنم ورژن جدید اومده
                              اونو استفاده کنید
                              رنگ و روی کامپایلر باز شده
                              هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                              بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                              میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

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

                              دیدگاه


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

                                اینجاست:
                                http://www.eca.ir/forum2/index.php?t...3776#msg293776
                                ورژن 6.1 همراه با کرک
                                حجم 301MB
                                دیشب گذاشته بودم برای دانلود الآن هم نصب میکنم ببینم چجوریه

                                دیدگاه

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