اطلاعیه

Collapse
No announcement yet.

برنامه نویسی به زبان اسمبلی

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

    #31
    پاسخ : برنامه نویسی به زبان اسمبلی

    بستگی به فرکانس PWM و Resolution آن دارد. شما باید تعیین کنید که حداقل چند سطح برای نور LED ها جوابگوی کار شماست. از آنجایی که این تعداد خروجی PWM را باید به صورت نرم افزاری بسازید، هرچه فرکانس PWM را بتوان پائین آورد به نحوی که LED حالت چشمک و Flicker نداشته باشد و هرچه پله تغییرات در خروجی های PWM قابل کم شدن باشد، پیاده سازی آن از نظر سرعت CPU، امکان پذیرتر خواهد بود. همچنین بهتر است برای این صورت مسئله از LATCH استفاده شود تا Shift Register. زیرا گزینه دوم برای update شدن خروجی هایش نیاز به اجرای یک روتین با 64 کلاک برای ورودی Shift Register دارد و این امر درعمل باعث Load شدن برنامه و CPU می شود و روش اول در زمان بسیار سریعتری می تواند کل خروجی ها را update کند.
    جای خوشحالی است که برای برخی دوستان مانند شما، صورت مسئله هایی مانند این مطرح است تا لزوم استفاده از حداکثر سرعت CPU برای شما موضوعیت پیدا کند. اگر مورد سوال شما یک صورت مسئله جدی است که قصد انجام آن را دارید، جزئیات بیشتری را از مواردی که عرض کردم بیان کنید و اگر هم این یک مسئله دنباله دار است که لازم است خارج از موضوع این تاپیک در مورد آن بحث شود، صورت مسئله را در تاپیک مستقلی در بخش AVR مطرح بفرمائید تا بتوان بهتر در این مورد چاره اندیشی نمود.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #32
      پاسخ : برنامه نویسی به زبان اسمبلی

      دسترسی به SRAM:

      خواندن اطلاعات از SRAM با آدرس دهی مستقیم توسط دستور LDS و با آدرس دهی غیر مستقیم توسط دستورات LD و LDD انجام می شود. نوشتن اطلاعات به SRAM با آدرس دهی مستقیم توسط دستور STS و با آدرس دهی غیر مستقیم توسط دستورات ST و STD انجام می شود. این دستورات به طور خاص در خانواده XMEGA کاربرد بیشتری دارند. زیرا اکثر رجیسترهای کنترل کننده سخت افزار در ناحیه ای از SRAM هستند که دسترسی به آنها از طریق دستورات IN و OUT میسر نیست و بنابراین استفاده از دستورات اخیر برای این رجیسترها امری گریزناپذیر است. در AVR های معمولی هم که دارای سخت افزار های گسترده تری هستند( مانند Mega128)، یک بخش از رجیسترهای کنترل کننده ساخت افزار باید بوسیله همین دستورات مورد دسترسی قرار بگیرند. در آدرس دهی غیر مستقیم، رجیسترهای X و Y و Z می توانند به عنوان اشاره گر به حافظه عمل کنند. یک امکان مهم در استفاده از این رجیسترها امکان انجام عملیات Pre decrement و Post increment این رجیسترهاست. در عملیات Pre decrement ابتدا یک واحد از مقدار pointer کم می شود و سپس عملیات نوشتن یا خواندن حافظه انجام می شود. در عملیات Post increment ابتدا خواندن یا نوشتن حافظه انجام می شود و سپس یک واحد به Pointer مورد نظر اضافه می شود. وجود این امکان در مجموعه دستورات اسمبلی موجب کوتاه تر شدن کد و صرفه جویی در زمان می گردد.
      مثال. در روتین زیر 100 بایت از یک جدول در Flash خوانده می شود و به 100 بایت متناظر در SRAM کپی می شود. نکته قابل توجه این است که در استفاده از LPM باید آدرس ابتدای جدول دو برابر شود، اما در مورد آدرس SRAM اینگونه نیست. از رجیستر R16 به عنوان شمارنده حلقه استفاده شده است:

      LDI ZL,LOW(FLASH_TABLE * 2)
      LDI ZH,HIGH(FLASH_TABLE * 2)
      LDI YL,LOW(SRAM_TABLE)
      LDI YH,HIGH(SRAM_TABLE)
      CLR R16
      LOOP:
      LPM R17,Z+
      ST Y+,R17
      INC R16
      CPI R16,100
      BRNE LOOP
      …

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

      دیدگاه


        #33
        پاسخ : برنامه نویسی به زبان اسمبلی

        Stack:

        پشته یا Stack ناحیه ای از SRAM است که آدرس برنامه در هنگام وقوع وقفه و یا پرش به آدرس یک زیربرنامه در آن بصورت خودکار ذخیره می شود و در هنگام بازگشت از وقفه یا زیربرنامه بصورت خودکار بازیابی می شود.این ناحیه در AVR های معمولی باید در خطوط برنامه تعریف شود و در XMEGA این عمل لازم نیست و بصورت خودکار انجام می پذیرد. با توجه به اینکه پشته از ادرس های بزرگتر به سمت آدرس های کوچکتر گسترش می یابد، در AVR این ناحیه در آخرین نقطه SRAM تعریف می شود و در XMEGA هم همین عمل انجام می شود. تعریف مکان پشته از طریق مقدار دهی به رجیستر 16 بیتی SP که مخفف Stack Pointer است انجام می شود.
        برای درک بهتر مفهوم پشته فرض کنید که در هنگام اجرای یک دستورالعمل، تقاضایی برای وقفه ایجاد شود. در اینحالت CPU آدرس دستورالعمل بعدی را در پشته بصورت خودکار ذخیره می کند و به آدرس روتین وقفه پرش می کند. بعد از انجام روتین وقفه و رسیدن به دستور RETI، آدرس مذکور مجددا توسط CPU از حافظه خوانده می شود و محل اجرای دستور بعدی بازیابی می شود.در مورد دستورات RCALL و CALL و ICALL و EICALL هم عملکرد به همین صورت است و بعد از رسیدن به دستور RET به آدرس بازگشت پرش می شود.
        علاوه بر ذخیره سازی آدرس بازگشت، در روتین های وقفه و زیر برنامه ها و هر نقطه دلخواه برنامه، می توان از پشته برای ذخیره سازی رجیسترهایی که احتمال تغییر آن وجود دارد، استفاده کرد. انجام این عمل برای رجیستر SREG در روتین های وقفه الزامی است و به جز موارد بسیار خاص، عدم انجام آن منجر به عملکرد نادرست برنامه خواهد شد. زیرا پرش های شرطی که روی SREG عمل می کنند در صورت عدم ذخیره آن به اشتباه عمل می کنند و عملکرد برنامه مختل می شود. ذخیره سازی در پشته توسط دستور PUSH و بازیابی توسط دستور POP انجام می شود. ترتیب انجام POP باید درست برعکس PUSH باشد و هر رجیستری که آخر PUSH شده باید ابتدا POP شود.
        به عنوان مثال اگر در روتین وقفه ای، احتمال تغییر R16 و R17 وجود داشته باشد، در ابتدا و انتهای وقفه باید به ترتیب زیر عمل شود.

        در ابتدای وقفه:

        PUSH R16
        IN R16,SREG
        PUSH R16
        PUSH R17


        در انتهای وقفه:

        POP R17
        POP R16
        OUT SREG,R16
        POP R16
        RETI


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

        دیدگاه


          #34
          پاسخ : برنامه نویسی به زبان اسمبلی

          ممنون جناب طراح واقعا لطف میکنید.
          پشته در XMEGA ها به طور خودکار در بالاترین آدرس SRAM تعریف میشه؟ بعد به وسیله همون SP جاش رو میشه تغییر داد یا راه دیگری داره؟
          ممنون
          از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
          هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
          اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
          اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
          شاد و موفق باشید

          دیدگاه


            #35
            پاسخ : برنامه نویسی به زبان اسمبلی

            نوشته اصلی توسط Study
            ممنون جناب طراح واقعا لطف میکنید.
            پشته در XMEGA ها به طور خودکار در بالاترین آدرس SRAM تعریف میشه؟ بعد به وسیله همون SP جاش رو میشه تغییر داد یا راه دیگری داره؟
            ممنون
            در XMEGA مقدار CPU_SP در زمان Reset در بالاترین آدرس SRAM بصورت خودکار تعریف می شود. اما با تغییر این رجیستر می توان پشته را در ناحیه دلخواه تعریف کرد.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #36
              پاسخ : برنامه نویسی به زبان اسمبلی

              پرش های شرطی:

              هوشمندی عملکرد یک پردازنده، با امکان اعمال "اگر" یا IF امکان پذیر می شود و این کار از طریق پرش های شرطی میسر می شود. ملاک اول برای پرش های شرطی، رجیستری به نام SREG است ( CPU_SREG در XMEGA) که نتیجه عملیات ریاضی و منطقی باعث تغییر بیت های مختلف آن می شود. به این طریق می توان تصمیم گیری و دوراهی هایی را در برنامه ایجاد کرد که بنا به شرایط مختلف باعث حرکت در خطوط متفاوت برنامه شوند. دو بیت Z به عنوان صفر بودن نتیجه عملیات و C به عنوان Carry حاصل از عملیات از جمله مهمترین بیت های SREG هستند که اکثر پرش های شرطی را پشتیبانی می کنند. دستورات TST و CPI و CP و CPC برای مقایسه یک یا دو رجیستر و درنتیجه Update شدن SREG هستند و هیچ تغییری هم روی رجیسترهای مورد تست انجام نمی دهند. مثلا دستور CPI R16,100 مقدار رجیستر R16 را با عدد 100 مقایسه می کند و نتیجه این مقایسه که در واقع یک تفریق مجازی است، بیت های مربوط به SREG و از جمله Z و C را Update می کند. بنابراین با اجرای پرش های شرطی متناظر هر Flag در SREG، میتوان روی خاصیت مورد نظر قضاوت کرد و خطوط برنامه مورد نظر را وادار به اجرا کرد. برای جزئیات رجیستر SREG و فهرست پرش های شرطی، باید به مجموعه دستورالعمل های خانواده AVR مراجعه شود.
              دستورات SBRS و SBRC روی بیت های رجیسترهای R0-R31 و دستورات SBIS و SBIC روی بیت های 32 بایت اول فضای I/O قضاوت می کنند و قدرت خوبی را برای قضاوت بر اساس محتوای یک بیت فراهم می کنند.

              مثال1. روتینی که مقدار ورودی به PORTA را می خواند و در صورتی که برابر صفر بود به خروجی PORTB عدد 0X55 و در صورتی که برابر 0XFF بود، ورودی خوانده شده از PORTC و در غیر اینصورت خود عدد خوانده شده را به خروجی PORTB می فرستد:

              IN R16,PINA
              TST R16
              BRNE TEST_FOR_FF
              LDI R16,0X55
              RJMP UPDATE_PORTB
              TEST_FOR_FF:
              CPI R16,0XFF
              BRNE UPDATE_PORTB
              IN R16,PINC
              UPDATE_PORTB:
              OUT PORTB,R16
              …

              مثال 2. روتینی که عدد 16 بیتی خوانده شده از PORTB:PORTA را با 0X1234 مقایسه کند و در صورت بزرگتر یا مساوی بودن با آن روتین A و در غیر اینصورت روتین B را اجرا کند.

              IN R16,PINA
              CPI R16,0X34
              IN R16,PINB
              LDI R17,0X12
              CPC R16,R17
              BRSH ROUTINE_A
              RJMP ROUTINE_B
              …

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

              دیدگاه


                #37
                پاسخ : برنامه نویسی به زبان اسمبلی

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

                دیدگاه


                  #38
                  پاسخ : برنامه نویسی به زبان اسمبلی

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

                  دیدگاه


                    #39
                    پاسخ : برنامه نویسی به زبان اسمبلی

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

                    دیدگاه


                      #40
                      پاسخ : برنامه نویسی به زبان اسمبلی

                      نوشته اصلی توسط طراح
                      یکی از مواردی که می تواند برای اثبات توانایی برنامه نویسی اسمبلی مورد ارزیابی قرار بگیرد، مسئله اندازه گیری دقیق عرض پالس یا فرکانس است. مثلا دقیق ترین اندازه گیری ممکن با SMT160 یا دقیق ترین فرکانس متر ممکن را که بتواند بالاترین فرکانس را اندازه بگیرد، می توانند به عنوان صورت مسئله مطرح شوند.
                      سلام استاد :smile:
                      من یه بار برای اندازه گیری عرض پالس SMT160 از Capture تایمر استفاده کردم که اندازه گیریم حداکثر یک و نیم سیکل کلاک سیستم خطا داشت و اون هم به خاطر مدار Synchronizer پورت بود. فرکانس هم فکر میکنم بالاترین مقدار 2/3 فرکانس کلاک CPU رو میشه اندازه گرفت.
                      There is nothing so practical as a good theory. — Kurt Lewin, 1951

                      دیدگاه


                        #41
                        پاسخ : برنامه نویسی به زبان اسمبلی

                        سرعت عملکرد ماژولهای سخت افزاری درون میکرو که بیشتر سخت افزاری هست تا نرم افزاری، به نظر من اگر بخوایم سرعت اسمبلی رو نشان بدیم باید یک الگوریتم نرم افزاری رو مورد بررسی قرار بدیم نه عملکرد ماژول داخلی میکرو که بیشتر کارش به صورت سخت افزاری انجام میشه.
                        به علاوه فکر میکنم بهتر برای پیگیری این موضوع تاپیک جداگانه درست بشه که این بحث برنامه نویسی اسمبلی هم نا منظم نشه.
                        از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                        هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                        اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                        اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                        شاد و موفق باشید

                        دیدگاه


                          #42
                          پاسخ : برنامه نویسی به زبان اسمبلی

                          نوشته اصلی توسط Study
                          سرعت عملکرد ماژولهای سخت افزاری درون میکرو که بیشتر سخت افزاری هست تا نرم افزاری، به نظر من اگر بخوایم سرعت اسمبلی رو نشان بدیم باید یک الگوریتم نرم افزاری رو مورد بررسی قرار بدیم نه عملکرد ماژول داخلی میکرو که بیشتر کارش به صورت سخت افزاری انجام میشه.
                          به علاوه فکر میکنم بهتر برای پیگیری این موضوع تاپیک جداگانه درست بشه که این بحث برنامه نویسی اسمبلی هم نا منظم نشه.
                          بله دقیقا همینطوره چون Peripheral کارش رو مستقل از برنامه و به طور سخت افزاری انجام میده.
                          There is nothing so practical as a good theory. — Kurt Lewin, 1951

                          دیدگاه


                            #43
                            پاسخ : برنامه نویسی به زبان اسمبلی

                            نوشته اصلی توسط رضا سپاس یار
                            سلام استاد :smile:
                            من یه بار برای اندازه گیری عرض پالس SMT160 از Capture تایمر استفاده کردم که اندازه گیریم حداکثر یک و نیم سیکل کلاک سیستم خطا داشت و اون هم به خاطر مدار Synchronizer پورت بود. فرکانس هم فکر میکنم بالاترین مقدار 2/3 فرکانس کلاک CPU رو میشه اندازه گرفت.
                            نوشته اصلی توسط Study
                            سرعت عملکرد ماژولهای سخت افزاری درون میکرو که بیشتر سخت افزاری هست تا نرم افزاری، به نظر من اگر بخوایم سرعت اسمبلی رو نشان بدیم باید یک الگوریتم نرم افزاری رو مورد بررسی قرار بدیم نه عملکرد ماژول داخلی میکرو که بیشتر کارش به صورت سخت افزاری انجام میشه.
                            به علاوه فکر میکنم بهتر برای پیگیری این موضوع تاپیک جداگانه درست بشه که این بحث برنامه نویسی اسمبلی هم نا منظم نشه.
                            با سلام به شما

                            در صورت مسئله های مطرح شده، هدف اندازه گیری عرض یک پالس و یا محاسبه فرکانس از روی یک سیکل نوسان است. هیچ یک از این دو کار را را نمی توان به تنهایی به عهده سخت افزار گذاشت و حتما سرعت نرم افزار در حداکثر دقت ممکن تاثیر دارد. در اندازه گیری فرکانس از روی یک پالس، دو وقفه متوالی در دو لبه همسان ایجاد می شود که نرم افزار باید قادر باشد قبل از وقفه دوم، مقدار Capture register را از حالت قبل بخواند و ذخیره کند تا قبل از Overwrite شدن، مقدار آن از دست نرود. در فرکانس های بالا، سرعت نرم افزار در انجام این عمل است که حداکثر فرکانس را تعیین می کند. در مورد اندازه گیری عرض پالس و به تبع آن Duty cycle مسئله مشکل تر است و به محض ایجاد وقفه ناشی از یک لبه، باید input capture edge select تغییر کند تا لبه بعدی از دست نرود. بنابراین همان الگوریتم نرم افزاری است که در اینجا حرف اول را می زند و سخت افزار به تنهایی نمی تواند تمام بار قضیه را به دوش بکشد.
                            در مرحله ای بالاتر فرض کنید که در یک سیستم پردازش سیگنال، علاوه برآنکه محاسبه حداکثر فرکانس یا عرض پالس مورد نظر است، زمان نهایی محاسبه این مقادیر هم مهم باشد و مقدار زمان از لحظه تمام شدن پالس تا لحظه حاضر شدن جواب نهایی هم یک امر time critical باشد. ممکن است ذهنیت ما از محاسبه فرکانس نهایتا یک LCD باشد که هر یک ثانیه یکبار عدد فرکانس را نشان بدهد. اما در سیستم های پردازش سیگنال ممکن است اصلا قضیه به این سادگی نباشد و میکروثانیه ها در نهایی شدن نتیجه محاسبات اهمیت داشته باشد.
                            بنابراین ضمن اینکه با تشکیل یک تاپیک جدید در این مورد موافق هستم، از دوستان درخواست می کنم که صورت مسئله را از منظری که بیان شد بررسی کنند تا با نمونه کد و عدد و رقم دقیق به مقایسه نتایج پرداخته شود. برای انجام این کار باید یک سخت افزار مشترک تعریف شود تا آزمایش ها بتواند روی آن انجام شود.

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

                            دیدگاه


                              #44
                              پاسخ : برنامه نویسی به زبان اسمبلی

                              سلام، فرمایش شما درسته، ضمن اینکه Latency وقفه هم باید لحاظ بشه چون از لحظه ای که وقفه ی Capture درخواست میشه چندین سیکل طول میکشه تا ISR اجرا بشه که این هم باعث محدود شدن حداکثر فرکانس فرکانس و حداقل عرض پالس قابل اندازه گیری میشه. اما به نظر من در بیشتر کاربردهای کنترلی این امکان هست که مقدار رجیستر ICR موقتاً ذخیره بشه و بعداً محاسبات به صورت Offline انجام بشه مگر اینکه کاربرد پردازشی باشه که اصولاً میکروکنترلر برای این کار مناسب نیست.
                              There is nothing so practical as a good theory. — Kurt Lewin, 1951

                              دیدگاه


                                #45
                                پاسخ : برنامه نویسی به زبان اسمبلی

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

                                دیدگاه

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