اطلاعیه

Collapse
No announcement yet.

نکاتی در برنامه نویسی C (کامپایلر IAR)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #31
    پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

    در محل مورد اشاره توسط x هر مقداری که در هنگام پروگرم کردن در آن نوشته شده، قرار دارد (چون اشاره گر به حافظه flash اشاره می کند). آنچه که در پرانتز قرار می گیرد تنها نوع عبارت بعد از خود را تعیین می کند و نباید معنای آن با * قبل از آن اشتباه گرفته شود. مثلا
    کد:
    (unsigned char __flash *) 0x1000

    یعنی 0x1000 آدرس مورد اشاره به یک بایت است و
    کد:
    *(unsigned char __flash *) 0x1000

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

    دیدگاه


      #32
      پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

      با سپاس, پست های قبلی شما(انها را ندیده بودم) بعلاوه توضیحات کنونی را خواندم پاسخ پرسش های قبلی را گرفتم اشتباها فکر میکردم (pgm_read_byte(x مثل یک تابع هر بار در طول برنامه فراخوانی میشه . حالا یک سوال جدید:
      1- امکان نداره (در برنامه lcd کارکتری برد آموزشی xmega) مانند برنامه lcd گرافیکی بجای دستور
      [left] ;(pcc=pgm_read_byte(&pc[i]
      ;(++ LCDSendCommand(a
      (LCDSendData(pcc
      از دستور
      [left];(++ LCDSendCommand(a
      ([LCDSendData(pc[i
      استفاده کرد ؟

      دیدگاه


        #33
        پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

        دیدگاه


          #34
          پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

          با سلام دستور زیر برای اینجانب مبهم است مگر data روی فلش تعریف نشده ؟
          1- چگونه با ++ به محتوای آن که آدرس می باشد اضافه میشود ؟ فلش که قابل تغییر نیست ؟
          2-آیا کامپایلر آن را به داخل رم برده و سپس عملیات روی آن انجام میشود؟ میخواهم بدانم که در عمل ببصورت اسمبلی چه اتفاقی می افتد ؟
          void LCDStringFlash(char __flash *data)
          {
          char k;
          while (k=*data++) LCDSendData(k);
          }


          #include "lcd_0.h"

          char data[]={'0','1'};
          unsigned char __flash backslash[] = {0,0x10,0x08,0x04,0x02,0x01,0,0};
          __flash char xx[]="Test1";
          char x[]="Test2";
          void main()
          {
          OSC_CTRL|=OSC_RC32MEN_bm;
          while(!(OSC_STATUS & OSC_RC32MRDY_bm));
          CCP=CCP_IOREG_gc;
          CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
          LCDInit();
          LCDdefinechar(backslash,0);
          LCDGotoXY(0,0);
          LCDStringFlash(xx);
          LCDGotoXY(0,1);
          LCDStringRam(x);
          LCDGotoXY(0,2);
          LCDStringRam("Test3"
          LCDGotoXY(0,3);
          LCDSendData(0);
          while(1);
          }

          دیدگاه


            #35
            پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

            دیدگاه


              #36
              پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

              با شادباش نوروزی خدمت استاد کی نژاد
              در پروژه اکوی دیجیتال چرا از ISR برای وقفه استفاده کردید ؟ ایا نمی شد از PRAGMA# استفاده کنید ؟

              دیدگاه


                #37
                پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                با درود خدمت استاد کی نژاد ایا جزئیات توابع و ماکرو های مانند زیر را که در کتابخانه های اتمل می باشد را باید یاد گرفت ؟
                void ADC_CalibrationValues_Load(ADC_t * adc)
                {
                if(&ADCA == adc){
                /* Get ADCACAL0 from production signature . */
                adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL0_offset );
                adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL1_offset );
                }else {
                /* Get ADCBCAL0 from production signature */
                adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCBCAL0_offset );
                adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCBCAL1_offset );
                }
                }

                بجز مثال های شما (که واقعا آموزنده هستند ) منبعی برای آموزش کتابخانه ها پیدا نکردم حین برنامه نویسی خصوصا مثال های شما وقتی به کتابخانه های اتمل برخورد میکنم بسیاری از زمان کاری صرف فهمیدن طرز کار با این کتابخانه میشود چند جلد کتاب C دارم ولی نکات و علائم مانند <- را در آنها ندیدم . متاسفانه عادت کردم حین برنامه نویس زیادی وارد جزئیات می شوم و باید جزئیات را کامل متوجه شوم . اگر امکان دارد چند مثال مانند بالا مثلا <- را توضیح دهید یا یک منبع فارسی معرفی کنید سپاسگزار می شوم

                دیدگاه


                  #38
                  پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                  با تبریک متقابل سال نو به شما، با include کردن فایل avr_compiler.h می توان برای وقفه از ISR استفاده کرد که به لحاظ ظاهری ساده تر است، اما در عمل تفاوتی با استفاده از pragma# ندارد.
                  در مورد سوال بعدی هم هرچند نیازی به وارد شدن به جزئیات کتابخانه ها نیست، اما درک آن می تواند برای برنامه نویسی بسیار مفید باشد. چنانکه در مثال مذکور adc * اشاره گری به ساختاری (Structure) از نوع ADC_t است و برای دسترسی به اعضای این ساختار باید از علامت <- استفاده شود. برای مطالعه این مبحث عبارت pointers to structure را جستجو کنید.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #39
                    پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                    اگر بخواهیم مثلا در نیم بایت از اطلاعات LCD گرافیکی تغییرات انجام دهیم با توجه به مشکل سطح منطقی 5 ولت LCD با 3.3 XMEGA که با پیشنهاد شما با قرار دادن مقاومت حل شد ایا از لحاظ اصول حرفه ای برنامه نویسی بهتر است که اطلاعات را ازخود LCD (با توجه به تاخیر خازن داخلی میکرو) خوانده ویراش و دوباره فرستاد یا با توجه به داشتن رم مازاد در میکرو همیشه یک کپی از رم LCD از قبل در رم میکرو داشته و روی آن ویرایش کنم و بعد به LCD بفرستم ؟

                    دیدگاه


                      #40
                      پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

                      دیدگاه


                        #41
                        پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                        با سلام .
                        مدتی است که این سوال در ذهنم است که اگر در یک برنامه از یک تابع ، تابع دیگری فراخوانی شود و از ان تابع بنا به شرطی مجددا تابع اولی فراخوانی شود ،باتوجه به اینکه از تابع دوم بازگشتی صورت نگرفته ، وضعیت stack چگونه خواهد بود و در صورت تکرار این رویه نهایتا برنامه بایستی با مشکل روبرو شود . ایا راهکاری جهت این مسئله وجود دارد ؟ یا برنامه باید به گونه ای طراحی شود که در این شرایط قرار نگیرد . همچنین از این کد می توان بجای WDT استفاده کرد و با پرش به ابتدای برنامه ، stack و رجیستر ها در چه وضعیتی قرار می گیرد . در صورت امکان خود کد رو هم توضیح دهید .

                        ((void (*)(void))0x0000)();

                        دیدگاه


                          #42
                          پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                          بر اساس حداکثر Level های تعیین شده برای RSTACK، فراخوانی توابع از داخل یکدیگر می تواند منجر به سرریز stack شود و فرقی هم در این امر در صدا زدن دو تابع به شکلی که بیان کرده اید نیست. برای جلوگیری از این امر باید به در نوشتن کد به حداکثر ظرفیت پشته توجه کرد.
                          کد زیر:

                          کد:
                          ((void (*)(void))0x0000)();


                          تابعی با ورودی و مقدار بازگشتی از نوع void در آدرس 0x0000 را صدا می زند که اجرای آن موجب فراخوانی و اجرای آدرس 0x0000 در flash می شود. اما این روش اولا ارتباطی به اجرای دستور WDT ندارد و دیگر اینکه با این پرش، مقدار دهی اولیه انجام شده در عملیات Reset به رجیسترها، انجام نمی شود (در خانواده AVR به پشته در متن کد مقدار دهی می شود که با پرش به آدرس صفر این مقداردهی به دلیل اینکه جزئی از برنامه است، انجام می شود).
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #43
                            پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                            با سلام خدمت مهندس کی نژاد ، لطفا توضیحی در مورد sizeof که در پروژه تولید ملودی موسیقی با AVR بکار برده اید چیست ؟ در وب سایت ها تحقیقی کردم و نتیجه ای نگرفتم (این عملگر که عملگر زمان ترجمه نامیده می شود، برای محاسبه طول یک نوع و یا یک متغیر به کار رفته و به صورت زیر استفاده می شود .!!!) اگر امکان دارد با یک مثال در میکرو یا پروژه خودتان توضیح دهید .
                            1- دانستن طول چه فایده ای دارد آ‌؟
                            2- این طول را چگونه متوجه می شویم در فایل list یا .....!؟
                            while(1)
                            {
                            for(i=0;i<sizeof (notes);i+=2)
                            {
                            if (notes[i]!=sil)
                            {
                            #asm("cli"
                            note_f=1;
                            duration=notes[i+1];
                            TCNT1=0;
                            OCR1A=timer1_values[notes[i]-1];
                            #asm("sei"
                            }

                            else
                            {
                            note_f=0;
                            duration=notes[i+1];
                            }
                            while(duration);
                            }
                            }
                            }

                            دیدگاه


                              #44
                              پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                              با سلام
                              من فکر میکنم اینطور باشه ،

                              sizeof طول متغیری که در آرگومانش(البته فکر کنم لفظ آرگومان اینجا درست نباشه ، چون اولا این تابع نیست و یک عملگر هست و همینطور میشه پرانز ها رو هم حذف کرد) نوشته میشه رو بر حسب بایت برمیگردونه . که تو اینجا میاد تعداد بایت های متغیر notes رو برمیگردونه و چون متغیر notes از نوع unsigned char تعریف شده ، عملگر sizeof تعداد درایه های متغیر n درایه ای notes رو برمیگردونه .

                              حالا اینکه چرا از این عملگر، اینجا استفاده شده ، چون میخواهیم تمامی نوت ها اجرا بشن اما اطلاع دقیقی از تعداد اون ها نداریم ، در نتیجه بجای شماردن تعداد نوت ها میاییم از این عملگر استفاده میکنیم.

                              کاربرد این عملگر بیشتر تو کار با رشته ها هست.

                              دیدگاه


                                #45
                                پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

                                دیدگاه

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