اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

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

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

    سلام
    من از printf در iar استفاده کردم و فایل write.c را هم به پروژه اضافه کردم و داخل تابع MyLowLevelPutchar کد مربوطه را نوشتم اما جواب نمیده
    کسی میدونه چرا؟
    ممنون

    دیدگاه


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

      یک فایل به نام putchar.c در فولدر پروژه ایجاد کن و کد زیر رو داخلش بنویس

      کد:
      #include <stdio.h>
      
      int putchar(int ch)
      {
        while ((UCSR1A & 32)==0);
        UDR1=c;
       	return ch;
      }
      حالا تو این تابع کد putchar خودت رو اگر فرق داره بنویس.

      دیدگاه


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

        نوشته اصلی توسط امیر . م
        یک فایل به نام putchar.c در فولدر پروژه ایجاد کن و کد زیر رو داخلش بنویس

        کد:
        #include <stdio.h>
        
        int putchar(int ch)
        {
          while ((UCSR1A & 32)==0);
          UDR1=c;
         	return ch;
        }
        حالا تو این تابع کد putchar خودت رو اگر فرق داره بنویس.
        من از کتابخانه dlib و زبان c++ استفاده میکنم و دستور printf در کتابخانه dlib از تابع putchar استفاده نمیکنه و از تابع _write استفاده میکنه

        دیدگاه


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

          1- ظرفیت فلش مموری اشغال شده در فایل map حدود 27 کیلو بایت میباشد . زمان کامپایل برنامه حدود 11 ثانیه می باشد که قبلا (شاید بعلت حجم کم کدها) این زمان خیلی کوتاهتر بود .
          آیا زمان 11 ثانیه ،با توجه به این حجم کد ، زمان نرمالی می باشد یا خیر ؟

          2- در نرم افزار avr studio جهت پروگرام بجای استفاده از فایل با پسوند d90 در قسمت input file hex مسیر فایل a90 را تعریف و از این روش جهت پروگرام استفاده می کنم و بدین شکل زمان پروگرام کوتاهتر میشود و نیازی به reload کردن نیست :
          آیا این روش درست میباشد ؟

          دیدگاه


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

            1- زمان 11 ثانیه زمان چندان غیر معمولی نیست و بسته به تعداد کتابخانه های مورد استفاده و نوع کامپیوتر و نرم افزار های در حال اجرا می تواند امری طبیعی باشد.
            2- در صورت انتخاب نوع فایل بصورت intel standard یا intel extended فایل با پسوند دلخواه و شامل اطلاعات لازم برای فایل hex ساخته می شود. اما در صورت وجود مقادیر اولیه برای eeprom این روش جوابگو نیست و یا باید از فایل d90 استفاده شود و یا از نسخه Release پروژه که دارای فایل های hex مجزا برای eeprom و flash است، استفاده شود.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


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

              پیرو راهنمایی جناب طراح در مورد استفاده از struct :
              شما می توانید متغیرهای با نام های مختلف را در یک Structure تعریف کنید که اعضای آن بصورت پشت سر هم در حافظه قرار می گیرند و نیازی به تعیین آدرس نیست. از نظر مثال هم در مراجعه بعدی به انجمن مثالی را ذکر خواهم کرد.
              و پیشنهاد اقای amin-zareian
              اگر برنامه نویسی cیا++c وارد باشی میتونی با struct (استراکچر) هرنوع متغیر دلخواهی بسازی
              اتفاقا دیروز از این روش برای تعریف متغیر از Structure استفاده کردم که بلافاصله پس از اجرا ، یکی از وقفه ها ( ISR(TCC0_OVF_vect) )
              که وظیفه آن ایجاد یک صدای بیپ با فشار هر کلید یا چرخش ولوم هرزگرد (encoder) می باشد( البته از خروجی های pwm ان استفاده شده ) در منوی اصلی بصورت اتفاقی فعال شده
              و صدای بیپ با زمان چند برابر تعیین شده در وقفه (که ثابت می باشد) پخش می گردد نکته مبهم دیگر اینکه با انتقال برنامه بیپ به دیگر وقفه ها مشکل حل می شود (یا عدم استفاه از Structure !!)
              ISR(TCC0_OVF_vect)
              {
              static unsigned int beep_time=0;
              static unsigned char _alarm=0;
              static bool start_beep=false;

              if(enable_beep && set.beep==BEEP_ON)
              {
              enable_beep=false;
              beep_time=0;
              start_beep=true;
              }
              if(++beep_time==2000)
              {
              beep_time=0;
              start_beep=false;
              }
              if(start_beep )
              {
              if(++_alarm==18)
              {
              PORTE_OUTTGL=PIN2_bm;
              _alarm=0;
              }
              }
              else PORTE_OUTCLR=PIN2_bm;
              }



              Structure ------------------------------------

              struct{
              unsigned char volume;
              unsigned char alarm;
              unsigned char channel;
              unsigned char beep;
              unsigned char contrast;
              unsigned char reset;
              }set={2,1,1,2,1,1};



              بدون Structure
              unsigned char reset=1,contrast=1,beep=2,volume=6,alarm=1,channel =1;


              ضمنا اگر بجای beep_time > 2000، beep_time==2000 قرار دهیم در هنگام اجرای ناخواسته وقفه ، زمان پخش از 2000 فراتر نمی رود ولی در هرصورت منوی بیپ بصورت نا خواسته در منوی اصلی فعال می شود حتی اگر set.beep غیر فعال باشد
              enable_beep در برنامه بصورت موردی توسط ولوم یا کلید true می شود و با set.beep می توان بطور کلی اجرای بیپ را غیر فعال کرد .

              دیدگاه


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

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

                دیدگاه


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

                  1- مشکلی را که در پست قبلی مطرح کردم با سعی و خطا حل شد(از نظر اینجانب) متغیرهایی را که در تابع وقفه بصورت static تعریف کرده بود همه را سراسری تعریف کردم و مشکل حل شد (چند بار امتحان کردم از سراسری به static و بالعکس) و سپس تک تک متغیرها را بصورت سراسری تعریف کردم متوجه شدم اشکال مربوط به bool start_beep که اگر static تعریف کنم در برنامه مشکلات ناخواسته ایجاد میکند .
                  2- در فایل راهنمای ( IAR ( EWAVR-CompilerReference جستجو کردم (ورژن 6.3 چون در ورژن 5.2 ندیدم ) مبحث در صفحه 150 در مورد مشکلات استفاده از مغیرهای static در توابع وقفه و ملاحظاتی را که باید در startup برنامه انجام داد توضیح داده که کاملا متوجه آن نشدم اگر امکان دارد جناب استاد کی نژاد در باره مبحث زیر توضیح دهید و آیا مشکل اینجانب مریوط به مبحث زیر می شود ؟
                  USING STATIC CLASS OBJECTS IN INTERRUPTS
                  If interrupt functions use static class objects that need to be constructed (using
                  constructors) or destroyed (using destructors), your application will not work properly
                  if the interrupt occurs before the objects are constructed, or after the objects are
                  destroyed.
                  To avoid this, make sure that these interrupts are not enabled until the static objects have
                  been constructed, and are disabled when returning from main or calling exit. For
                  information about system startup, see System startup and termination, page 84.
                  Function local static class objects are constructed the first time execution passes through
                  their declaration, and are destroyed when returning from main or when calling exit.
                  3- آیا در تعریف bool start_beep بصورت static مجاز هستیم یا بهتر است که بصورت سراسری تعریف شود ؟
                  4- آیا تعریف توابع برنامه و یا توابع وقفه بعد از تابع main کار درستی می باشد (مشکلات احتمالی بوجود نمی آورد )؟

                  دیدگاه


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

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

                    دیدگاه


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

                      پروژه بصورت C تعریف شده و حتی با تغییر Library Configuration از DLIB به ‍CLIB و تغییر uint_8 به unsigned char و... در تمام پروژه و کتابخانه های اتمل و همچنین #include <stdint.h> جهت رفع خطا،مشکل حل نگردید و اما درمورد بررسی سایز سگمنت های Near_I و Near_z که راهنمایی فرمودید نتایج زیر بدست آمد:


                      1- با مقدار دهی اولیه true به start_beep مشکل حل می گردد :
                      SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
                      ======= ===== ============= =========== ==== ==== =====
                      INTVEC CODE 00000000 - 00000137 138 com 1
                      ?FILL1 CODE 00000138 - 000001E7 B0 rel 0
                      NEAR_F CODE 000001E8 - 00002360 2179 rel 0
                      CODE CODE 00002362 - 00008C49 68E8 rel 1
                      INITTAB CODE 00008C4A - 00008C57 E rel 0
                      NEAR_ID CODE 00008C58 - 00008CAF 58 rel 0
                      ABSOLUTE DATA 00000020 rel 0
                      DATA 00000034
                      DATA 000001C0
                      CSTACK DATA 00002000 - 0000223F 240 dse 0
                      RSTACK DATA 00002240 - 00002433 1F4 dse 0
                      NEAR_I DATA 00002434 - 0000248B 58 rel 0
                      NEAR_Z DATA 0000248C - 000028BC 431 rel 0

                      -------------------------------------------------------------------------
                      NEAR_I
                      Relative segment, address: DATA 00002488 - 0000248B (0x4 bytes), align: 0
                      Segment part 88. Intra module refs: handler_TCC0_OVF_vect
                      LOCAL ADDRESS
                      ===== =======
                      handler_TCC0_OVF_vect::_alarm
                      0000248A
                      handler_TCC0_OVF_vect::beep_time
                      00002488
                      handler_TCC0_OVF_vect::start_beep
                      0000248B


                      2- با مقدار دهی اولیه false به start_beep مشکل برطرف نمیگردد :
                      ISR(TCC0_OVF_vect)
                      {
                      static unsigned int beep_time=0;
                      static unsigned char _alarm=0;
                      static bool start_beep=false;//true false

                      map file:

                      SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
                      ======= ===== ============= =========== ==== ==== =====
                      INTVEC CODE 00000000 - 00000137 138 com 1
                      ?FILL1 CODE 00000138 - 000001E7 B0 rel 0
                      NEAR_F CODE 000001E8 - 00002360 2179 rel 0
                      CODE CODE 00002362 - 00008C49 68E8 rel 1
                      INITTAB CODE 00008C4A - 00008C57 E rel 0
                      NEAR_ID CODE 00008C58 - 00008CAB 54 rel 0
                      ABSOLUTE DATA 00000020 rel 0
                      DATA 00000034
                      DATA 000001C0
                      CSTACK DATA 00002000 - 0000223F 240 dse 0
                      RSTACK DATA 00002240 - 00002433 1F4 dse 0
                      NEAR_I DATA 00002434 - 00002487 54 rel 0
                      NEAR_Z DATA 00002488 - 000028BC 435 rel 0


                      -------------------------------------------------------------------------
                      NEAR_Z
                      Relative segment, address: DATA 000028B8 - 000028BB (0x4 bytes), align: 0
                      Segment part 88. Intra module refs: handler_TCC0_OVF_vect
                      LOCAL ADDRESS
                      ===== =======
                      handler_TCC0_OVF_vect::_alarm
                      000028BA
                      handler_TCC0_OVF_vect::beep_time
                      000028B8
                      handler_TCC0_OVF_vect::start_beep
                      000028BB


                      اگر درست برداشت کرده ام دو متغیر اول همیشه باید در سگمنت Near_z قرار داده شوند ولی در بالا سگمنت آنها با start_beep از Near_z به Near_I و بالعکس تغییر میکند .
                      البته اگر start_beep را global تعریف کنم باز دوحالت فوق در سگمنت ها رخ خواهد داد ولی در هر دو حالت کارکرد(با تعریف global ) اجرایی برنامه صحیح می باشد .

                      دیدگاه


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

                        سگمنت NEAR_Z برای متغیرهای static و global با مقدار اولیه صفر و سگمنت NEAR_I برای همین نوع متغیرها با مقدار اولیه غیر صفر مورد استفاده قرار می گیرند که با تغییر مقدار اولیه از false به true هم بین این دو سگمنت جابجایی اتفاق می افتد. اما در متنی که از فایل map قرار داده اید، به ازای این تغییر 4 بایت در سگمنت ها جابجایی انجام شده که طبیعی به نظر نمی رسد. در همین رابطه میزان مصرف sram ناشی از تعریف متغیرها را با متغیرهای موجود در برنامه خود تطبیق دهید و بررسی کنید که تطابق آن به چه صورت است. یک دلیل احتمالی برای این عملکرد ممکن است قرار دادن سطح optimization در وضعیت high باشد که برای بررسی بهتر آن را در وضعیت None قرار دهید. همچنین در صورتی که این پروژه را قبلا در نسخه های پائین تر IAR نوشته اید و بعد به نسخه های بالاتر ارتقاء داده اید، یکبار پروژه را از نو در نسخه بالاتر تعریف کنید و عملکرد آن را مشاهده کنید.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


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

                          هر دو احتمالی که داده بودید درست بود ( optimization در high بود) پروژه را از نوع در نسحه جدید تعریف کردم optimization را در حالت None قرار دادم نتایج زیر بدست آمد که با تغییر از false به true سگمنت Near_I و Near_Z یک شماره کم یا زیاد می شد ولی در هر دو صورت مشکل قبلی برقرار بود(ضمنا تعداد سگمنت های Near_I در برنامه را شمرده و از تعداد فایل map بیشتر می باشد :

                          [ltr]ISR(TCC0_OVF_vect)
                          {
                          static unsigned int beep_time=0;
                          static unsigned char _alarm=0;
                          static bool start_beep=true;//true false


                          SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
                          ======= ===== ============= =========== ==== ==== =====
                          INTVEC CODE 00000000 - 00000137 138 com 1
                          ?FILL1 CODE 00000138 - 000001E7 B0 rel 0
                          NEAR_F CODE 000001E8 - 00002360 2179 rel 0
                          SWITCH CODE 00002362 - 00002471 110 rel 1
                          CODE CODE 00002472 - 0000B373 8F02 rel 1
                          INITTAB CODE 0000B374 - 0000B381 E rel 0
                          NEAR_ID CODE 0000B382 - 0000B397 16 rel 0
                          ABSOLUTE DATA 00000020 rel 0
                          DATA 00000034
                          DATA 000001C0
                          CSTACK DATA 00002000 - 000021FF 200 dse 0
                          RSTACK DATA 00002200 - 0000238F 190 dse 0
                          NEAR_I DATA 00002390 - 000023A5 16 rel 0
                          NEAR_Z DATA 000023A6 - 0000281A 475 rel 0

                          ****************************************
                          * *
                          * END OF CROSS REFERENCE *
                          * *
                          ****************************************

                          45 799 bytes of CODE memory (+ 176 range fill )
                          2 075 bytes of DATA memory


                          -------------------------------------------------------------------
                          ISR(TCC0_OVF_vect)
                          {
                          static unsigned int beep_time=0;
                          static unsigned char _alarm=0; //(1/F_alarm)/clock_timer
                          static bool start_beep=false;//true false

                          SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
                          ======= ===== ============= =========== ==== ==== =====
                          INTVEC CODE 00000000 - 00000137 138 com 1
                          ?FILL1 CODE 00000138 - 000001E7 B0 rel 0
                          NEAR_F CODE 000001E8 - 00002360 2179 rel 0
                          SWITCH CODE 00002362 - 00002471 110 rel 1
                          CODE CODE 00002472 - 0000B373 8F02 rel 1
                          INITTAB CODE 0000B374 - 0000B381 E rel 0
                          NEAR_ID CODE 0000B382 - 0000B396 15 rel 0
                          ABSOLUTE DATA 00000020 rel 0
                          DATA 00000034
                          DATA 000001C0
                          CSTACK DATA 00002000 - 000021FF 200 dse 0
                          RSTACK DATA 00002200 - 0000238F 190 dse 0
                          NEAR_I DATA 00002390 - 000023A4 15 rel 0
                          NEAR_Z DATA 000023A5 - 0000281A 476 rel 0

                          ****************************************
                          * *
                          * END OF CROSS REFERENCE *
                          * *
                          ****************************************

                          45 798 bytes of CODE memory (+ 176 range fill )
                          2 075 bytes of DATA memory

                          Errors: none
                          Warnings: none[ltr/]

                          اگر optimization را در high یا medium قرار دهم سگمنت های Near_I فایل map از تعداد برنامه بیشتر می شود .(Near_I map =54)

                          دیدگاه


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

                            1- تفاوت استفاده یا عدم استفاده از دستور return چیست ؟
                            2- آیا عملیات pop قبل یا بعد از } تاثیر خاصی دارد ؟



                            ISR(NVM_EE_vect)
                            \ handler_NVM_EE_vect:
                            6091 {
                            \ 00000000 931A ST -Y, R17
                            \ 00000002 930A ST -Y, R16
                            \ 00000004 B71F IN R17, 0x3F
                            6092 /* Disable the EEPROM interrupt */
                            6093 NVM.INTCTRL = (NVM.INTCTRL & ~NVM_EELVL_gm);
                            \ 00000006 910001CD LDS R16, 461
                            \ 0000000A 7F0C ANDI R16, 0xFC
                            \ 0000000C 930001CD STS 461, R16
                            6094 return;
                            \ 00000010 BF1F OUT 0x3F, R17
                            \ 00000012 9109 LD R16, Y+
                            \ 00000014 9119 LD R17, Y+
                            \ 00000016 9518 RETI
                            6095 }

                            //-----------------------------------------------

                            ISR(NVM_EE_vect)
                            \ handler_NVM_EE_vect:
                            6091 {
                            \ 00000000 931A ST -Y, R17
                            \ 00000002 930A ST -Y, R16
                            \ 00000004 B71F IN R17, 0x3F
                            6092 /* Disable the EEPROM interrupt */
                            6093 NVM.INTCTRL = (NVM.INTCTRL & ~NVM_EELVL_gm);
                            \ 00000006 910001CD LDS R16, 461
                            \ 0000000A 7F0C ANDI R16, 0xFC
                            \ 0000000C 930001CD STS 461, R16
                            6094 //return;
                            6095 }
                            \ 00000010 BF1F OUT 0x3F, R17
                            \ 00000012 9109 LD R16, Y+
                            \ 00000014 9119 LD R17, Y+
                            \ 00000016 9518 RETI

                            دیدگاه


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

                              در مورد برقراری مشکل، همچنان می توانید در جزئیات مرحله به مرحله فایل map، مصرف سگمنت ها مختلف را چک کنید که احیانا با هم تداخلی نداشته باشند. در همین رابطه به چه دلیلی سایز RSTACK به این مقدار بزرگ در نظر گرفته شده و مبنای انتخاب CSTACK چیست؟ مسئله بعدی شماره مورد استفاده است که فرض من بر ATXMEGA64A3 است و در صورت استفاده از شماره ای با SRAM دو کیلوبایت (مثلا َATXMEGA16A4) وقوع مشکل حتمی است. در باره دستور return هم در انتهای روتین وقفه، وجود یا عدم وجود آن تفاوتی ندارد و وجود این دستور در مواردی مفید است که در بین دستورات روتین وقفه نیاز به بازگشت باشد. سوال آخر هم تا حدی مبهم است و کامپایلر IAR معمولا برای ذخیره سازی از پشته نرم افزاری استفاده می کند و از push و pop اسفاده نمی کند.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


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

                                سلام دوستان . یک سوال مبتدیانه !
                                من توی IAR از این دستور برای تبدیل Int که با نام Setpoint هست به Char با نام y برای نمایش بر روی LCD استفاده کردم. ولی با اجرای این دستور در برنامه ، اصلا سیستم کار نمی کنه. وقتی این دستور رو بر میدارم همه چیز درست کار میکنه. آیا کتابخانه خاصی باید واسه Sprintf به پروژه افزوده بشه؟
                                sprintf(y,"%d",Setpoint);

                                دیدگاه

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