اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط freedom_truth
    با سلام
    از دوستان خوب "طراح" و "study" به خاطر بحث شیرینی که باز کردن ممنونم.منتها یه پیشنهاد دارم و اونم اینکه در این مرحله به جای چونه زدن روی یک بایت از حافظه یا نیم میکرو ثانیه از زمان بیان روی مباحث کاربردی تری صحبت کنیم.
    نظر بنده رو ایناست: طراحی فلوچارت و تابع بندی و انشعابات برنامه، استفاده از اشاره گر های داده در فلش و رم، مدیریت متغیر ها، عملیات ریاضی روی عددهای بزرگ و ممیزی و ...

    با تشکر
    با تشکر از شما

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

    دیدگاه


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

      با سلام خدمت اساتید گرامی
      من خدای ناکرده قصد جسارت نداشتم. :cry2: در این که مدیریت منابع حافظه و کدنویسی بهینه از نظر زمانی اهمیت زیادی داره شکی نیست و کاملاً حق با شماست . بنده فقط بحثم ترتیب مطالب بود. یعنی میگفتم اول اینا بعد اونا... :mrgreen:
      به هر حال هر چی شما بگین.
      ممنون

      دیدگاه


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

        یک پین مشخص میکروکنترلر برحسب کنترل نرم افزاری می تواند به سخت افزارهای مختلفی متصل شود و مجموعه 8 بیتی از این پین ها به عنوان یک پورت میکروکنترلر نامیده می شود. ساده ترین وظیفه هر پین یک پورت، صفر و یک شدن به عنوان خروجی و خواندن وضعیت منطقی پین به عنوان ورودی است. تمام پورتها بصورت پیش فرض بصورت ورودی هستند و هیچ Pull up یا Pull down(در XMEGA) فعال نیست. در اینجا لازم است توضیحی راجع به مفهوم فضای I/O داده شود. در خانواده AVR های معمولی، رجیسترهای R0-R31 در فضای SRAM داخلی تعریف شده اند که از آدرس 0X00 شروع می شود. از آدرس بعد از R31 یعنی 0X20، به عنوان فضای I/O تعریف می شود که هر مکان دو آدرس دارد. یکی آدرس واقع در SRAM که از همان 0X20 شروع می شود و می تواند با آن به عنوان یک نقطه از SRAM رفتار شود. دومین آدرس که به عنوان I/O برای هر نقطه وجود دارد و از 0X00 شروع می شود و عملا 32 واحد با آدرس SRAM آن نقطه تفاوت دارد. حال این تعریف چه فایده ای به دنبال دارد؟
        در مجموعه دستورالعمل های AVR برای محدوده ای با آدرس 0x00 تا 0x3F در فضای I/O، دستورات IN و OUT تعریف شده که زمان اجرا و حجمی که در حافظه Flash اشغال می کنند نصف دستورات LDS و STS است که برای دسترسی عادی به SRAM مورد استفاده قرار می گیرند. در شماره های ضعیف تر AVR مانند سری Tiny یا mega8 و mega16 و mega32، کلیه رجیسترهای کنترل کننده سخت افزار در همین محدوده 0X00-0X3F قرار دارند و بنابراین می توان از این دستورات IN و OUT برای تغییر سریع آنها استفاده کرد. اما در خانواده هایی مانند mega64 و mega128، به دلیل اینکه رجیسترهای کنترل کننده سخت افزار از 64 عدد بیشتر هستند، بخشی از آنها در خارج از این محدوده واقع می شوند و باید توسط دستورات LDS و STS مورد دسترسی قرار بگیرند. همچنین وجود دستورات CBI و SBI برای صفر و یک کردن بیت های رجیسترهای I/O که در آدرس 0X00-0X1F واقع شده اند، امکان تغییر سریع در بیت های این رجیسترها را بدون دخالت R0-R31 فراهم می کنند. دستورات SBIC و SBIS هم امکان قضاوت و پرش های شرطی روی محتوای همین محدوده آدرس0X00-0X1F را بدون استفاده از رجیسترهای R0-R31 فراهم می کنند. این امکانات به برنامه نویس امکان می دهد که در کمترین زمان ممکن، محتوای آدرسهای ذکر شده را تغییر دهد و یا روی آنها قضاوت کند و به همین دلیل اکثر رجیسترهای کنترل پورت در AVR های معمولی در همین محدوده از آدرس واقع هستند.
        اما در مورد XMEGA آدرس رجیسترهای کنترل کننده سخت افزار به کلی متفاوت است. به گونه ای که هیچ رجیستر کنترل کننده مستقیم پورت در این محدوده از آدرس ها قرار ندارد. چه راه حلی و چاره ای برای این مسئله در نظر گرفته شده تا بتوان از این امکان تغییر سزیع محتوای پورت استفاده کرد؟ راه حل این مسئله در مفهومی به عنوان Virtual port است که در بخش بعد توضیح داده خواهد شد.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


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

          ممنون از توضیحات شما، به نظر من توی AVR ها ارتباط با SRAM ضعیف هست، اگر برنامه کمی بزرگ بشه و ما شروع کنیم از محدوده بعد از فضای I/O در RAM استفاده کنیم مجبور هستیم برای هر بار نوشتن یا خواندن در RAM از STS و LDS استفاده کنیم که opcode اونها 4 بایتی هست و با استفاده از این دستورات کلی از حافظه رو از دست میدیم به علاوه اگر بخوایم یک عمل روی داده های درون اون آدرس انجام بدیم باز هم باید اول اونها رو لود کنیم در رجیسترهای R بعد عمل رو انجام بدیم و نتیجه رو برگرذانیم سرجاش که این به نظر من جالب نیست و وقتی با ضعف LDS و STS دست به دست هم میدن گندش رو بالا میارند. دوست دارم ببینیم در XMEGA ها راه حلی برای اینکار وجود داره یا نه!!
          از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
          هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
          اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
          اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
          شاد و موفق باشید

          دیدگاه


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

            نوشته اصلی توسط Study
            ممنون از توضیحات شما، به نظر من توی AVR ها ارتباط با SRAM ضعیف هست، اگر برنامه کمی بزرگ بشه و ما شروع کنیم از محدوده بعد از فضای I/O در RAM استفاده کنیم مجبور هستیم برای هر بار نوشتن یا خواندن در RAM از STS و LDS استفاده کنیم که opcode اونها 4 بایتی هست و با استفاده از این دستورات کلی از حافظه رو از دست میدیم به علاوه اگر بخوایم یک عمل روی داده های درون اون آدرس انجام بدیم باز هم باید اول اونها رو لود کنیم در رجیسترهای R بعد عمل رو انجام بدیم و نتیجه رو برگرذانیم سرجاش که این به نظر من جالب نیست و وقتی با ضعف LDS و STS دست به دست هم میدن گندش رو بالا میارند. دوست دارم ببینیم در XMEGA ها راه حلی برای اینکار وجود داره یا نه!!
            در AVR کمترین فضایی که یک دستورالعمل در حافظه Flash اشغال می کند، دو بایت است. برای انجام عملیات مداوم روی SRAM بهتر است از دستورات LD و ST استفاده شود که با تعریف یک Pointer در رجیسترهای X یا Y یا Z، علاوه بر دسترسی به SRAM می توان مقدار Pointer را هم در همان دستور افزایش یا کاهش داد. دستورات LD و ST حداقل فضا را به میزان 2 بایت در Flash اشغال می کنند. قرار دادن هر دیتای مورد نظر برای عملیات در رجیسترهای R0-R31 یا نظیر آن هم جزئی از ساختار RISC است و اختصاص به AVR ندارد. در این ساختار در عوض این عملیات اضافه، زمان اجرای دستورالعمل ها کوتاهتر می شود.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


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

              به هر حال این Pointer هم خودش اول نیاز به مقدار دهی داره که اون مقدار دهی هم باید به طور مجزا انجام بشه، یعنی زمانی که به یک نقطه خاص از RAM نیاز داشته باشید عملا هیچ فرقی نمیکنه که شما از LDS استفاده کنید یا اینکه اول بیاید اون آدرس رو توی رجیستر مثلا X بریزید بعد از LD استفاده کنید، در هر دوحالت همون فضای حافظه رو از دست میدید،ST و LD در جاهایی میتونند یک نوع توجیه برای رفع این مشکل به حساب بیاند که ما طوری متغیرهامون رو قرار بدیم که هر متغیری که میخوایم استفاده کنیم کنار متغیری باشه که قبلا استفاده کردیم که همچین چیزی عملا در خیلی اوقات امکان پذیر نیست و ما مجبور هستیم از چند نقطه متفاوت از RAM داده بخوانیم یا بنویسیم که کنار هم قرار ندارند، یعنی اینکه یا مجبوریم دوباره Pointer رو با مقدار آدرس جدید پر کنیم یا اینکه از همون LDS و STS استفاده کنیم.
              اینکه میفرمایید قرار دادن دیتای مورد نظر در روی درون انباره جزئی از معماری RISC هست رو هم قبول ندارم، میکروهای PIC هم دارای مغماری RISC هستند اما مثلا در یک میکروی PIC18 بدون اینکه داده رو از RAM منتقل کنیم بیشتر عملیات رو فقط با یک دستور انجام میدیم و نتیجه هم در همون دستور درونش قرار میگیره، حتی در آدرس دهی غیر مستفیم هم میشه عمل روی داده انجام داد و از لحاظ صرفه جویی در حافظه به مراتب بهتر هست، از لحاظ زمان اجرا هم با توجه به اینکه در معماری AVR باید داده رو اول وارد رجیستر ها بکنیم که این خودش حداقل 2 سیکل میخواد و بعد هم دوباره بر گردانیم که این هم خودش 2 سیکل میخواد، چند سیکل هم که برای انجام عمل مورد نظر نیاز هست، عملا اون سرعت اجرا به هیچ دردی نمیخوره چون همه این کارهارو توی یک میکرویی مثل PIC با یک دستور انجام میدیم، هم سرعت بیشتر هست هم حافظه کمتر صرف میشه هم برنامه بیخودی شلوغ نمیشه و برنامه نویس بنده خدا بیخود خسته نمیشه. مثلا شما فرض کنید میخاید یک داده که در RAM قرار داره رو یکبار به سمت راست بچرخوانید، در AVR باید اول این داده رو از RAM بیارید توی رجیسترهای R که این خودش حداقل دوسیکل زمان میخواد، بعد باید دستور چرخواندن به راست رو انجام بدید که این هم خودش یک سیکل زمان میخواد، بعد باید دوباره اون رو برگردانید همونجا که بوده که این هم باز خودش 2 سیکل نیاز داره، یعنی روی هم رفته 5 سیکل نیاز دارید، اما توی PIC18 فقط با یک دستور همه این کارها رو انجام میدید که یک سیکل بیشت زمان نمیبره، از لحاظ مصرف حافظه 3 برابر بهتر هست از لحاظ سرعت اجرا هم از اونجا که هر سیکل در PIC18 در حالت عادی 4 پالس هست کلا با 4 تا پالس اینکار انجام میشه در حالی که توی AVR همین کار حداقل 5 سیکل زمان نیاز داره، یعنی عملا معماری AVR در ارتباط با RAM اینقدر ضعیف هست که نه تنها 3 برابر بیشتر حافظه مصرف کرده بلکه با وجود اینکه هر سیکل ماشینش یک پالس ورودی هست ولی باز هم سرعت انجام اینجور عملیات روی داده های RAM از میکرویی که 4 پالسش یک سیکل ماشین رو میسازه آهسته تر هست، به همین خاطر هست که عرض میکنم AVR در ارتباط با RAM و انجام عملیات روی داده ها ضعیف هست. تازه من حداقل دستورات و سیکل ها رو برای AVR حساب کردم، البته همونطور که قبلا عرض کردم بنده مدتی هست با AVR کار نکردم و زیاد ریزه کاریهاش یادم نیست و ممکن هست اشتباه کنم، شما اگر راه بهتری برای انجام این کار با AVR میدونید لطف کنید و اصلاح بفرمایید )
              از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
              هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
              اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
              اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
              شاد و موفق باشید

              دیدگاه


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

                ضمن تشکر از شما به خاطر مواردی که به آن اشاره کردید.در مورد قوت یا ضعف خانواده AVR در کار با SRAM می توان اینطور قضاوت کرد که اگر معماری داخلی AVR بگونه ای بود که دسترسی به SRAM در یک سیکل و با طول دستورالعمل به میزان یک word انجام می شد، از وضعیت فعلی بسیار بهتر بود. اما مقایسه ای که در این مورد با خانواده PIC18 انجام داده اید از جهات مختلف محل مناقشه است. در ابتدا عرض کنم که من با PIC کار نمی کنم اما " PIC کارها را دوست دارم" و قبلا هم عرض کرده ام که حساسیت خاصی روی AVR و XMEGA ندارم. اما مواردی که ذکر کرده اید در یک شرایط و چارچوب بخصوص می تواند به عنوان مزیت تلقی شود و از دیدگاه دیگر می تواند به عنوان یک ایراد برای خانواده PIC18 به حساب آید.
                این درست است که دسترسی به یک آدرس در RAM برای عملیاتی مانند چرخش می تواند در یک دستورالعمل انجام شود. اما آیا این امکان در راستای محدود کردن مقدار RAM در PIC18 به 4 کیلوبایت بدست نیامده است؟ تا جایی که اطلاع دارم معماری این خانواده به گونه ای است که سقف RAM داخلی آن بیشتر از 4 کیلو بایت نیست و به همین دلیل از طریق تقسیم حافظه به 16 بانک رجیستر 256 بایتی، نوع خاصی از امکان دسترسی برای انجام برخی عملیات فراهم شده است. اما در خانواده AVR و XMEGA اصلا چنین محدودیتی تعریف نشده و شماره های فعلی تا سقف 32 کیلوبایت( یعنی 8 برابر نسبت به PIC18) حافظه SRAM دارند. نکته دیگری که شما باید صحت آنرا تائید کنید این است که اگر بخواهیم در هر دسترسی به آدرسی در یک بانک متفاوت از بانک قبلی مراجعه کنیم،مگر نباید ابتدا این تغییر بانک انجام شود ؟ و اگر این مسئله صحت دارد، تعداد و طول دستورالعمل لازم برای این تغییر بانک حداقل چقدر است؟ و مورد بعدی اینکه برای عملیاتی مانند جمع و تفریق و مقایسه و ضرب و OR و AND و XOR در AVR تعداد 32 رجیستر بصورت مجزا در دسترس هستند. اما در PIC18 همیشه یک طرف این عملیات ظاهرا رجیستر WREG است و بنابراین برای انجام هر عملیاتی باید یکبار به این رجیستر مقدار دهی جدید شود. در مثالی که شما مطرح کردید عملیات چرخش بصورت مستقیم می تواند روی SRAM انجام شود. اما اگر مثلا بخواهیم عملیات جمع را انجام دهیم، آنگاه نیاز به مقدار دهی به WREG به میان می آید که که هر بار باید انجام شود. اما در AVR به دلیل اینکه 32 گزینه برای انجام اینگونه عملیات وجود دارد، لازم نیست در یک عملیات مکرر هربار این مقداردهی انجام شود و این کار می تواند فقط یکبار صورت بپذیرد. به عنوان مثال اگر بخواهیم در شرایط مختلف محتوای SRAM را با 8 مقدار مختلف جمع کنیم، این 8 مقدار می تواند یکبار در رجیسترهای R0-R7 ریخته شود و هربار عملیات جمع با آنها انجام شود و احتیاجی هم به مقدار دهی مجدد نیست.
                (ادامه در پست بعد)
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


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

                  (ادامه از پست قبل)
                  بنابراین با لحاظ کلیه موارد و حداکثر 20MIPS سرعت برای AVR و 32MIPS برای XMEGA و اکثرا 10MIPS و حداکثر 16MIPS برای PIC18 نمی توان تنها با ذکر یک مثال خاص به این نتیجه رسید که مثلا دسترسی به SRAM در خانواده AVR بسیار ضعیف است و مواردی از این قبیل. اگر لازم باشد می توانم مثال هایی از دسترسی به SRAM برای انجام یک مجموعه از عملیات که چندین رجیستر R0-R31 با هم در عملیات شرکت دارند را ذکر کنم و زمان اجرای آن را به ازای حداکثر سرعت AVR یا XMEGA هم محاسبه کنم و شما هم همان روتین را برای PIC18 برای حداکثر سرعت پیاده کنید تا دید بهتری نسبت به توانایی هر یک از دو خانواده در حوزه برنامه نویسی اسمبلی حاصل شود.
                  خارج از این مسائل تصور می کنم مقایسه AVR با خانواده دیگری که از معماری متفاوتی برخوردار است و قوت و ضعف های خاص خود را دارد، تنها منجر به سردرگمی کسانی که با آن خانواده آشنا نیستند می گردد و بحث را از روند اصلی خود خارج می کند. این مقایسه می تواند در تاپیک مستقلی که برای این منظور تشکیل می شود، انجام بپذیرد و من هم قطعا از آن استقبال می کنم. به خاطر دارم که در سایت AVRFreaks مطلبی را مطالعه می کردم که در بحثی راجع به توانایی های خانواده XMEGA، فردی با مثال هایی از یک خانواده دیگر وارد بحث شده بود و در نهایت اعضای انجمن به او اعتراض کردند که ما به دلیل آشنایی و تسلط به خانواده AVR و کدهایی که برای آن نوشته ایم و ابزارهایی که برای آن آماده کرده ایم، علاقه مند هستیم که در این مورد بحث کنیم و ذکر مثال از خانواده دیگری که با آن آشنا نیستیم، وجهی در این مباحث ندارد. این اعتراض به نظر وارد می آید و در اینجا هم فرض بر این است که افرادی که وارد این تاپیک می شوند به هر دلیلی علاقه مند به اطلاع از اسمبلی AVR و XMEGA هستند و بهتر است مطالب در همین چارچوب باشند.
                  بنابراین همان جمله ابتدای پست را دوباره تائید می کنم که اگر معماری داخلی AVR بگونه ای بود که دسترسی به SRAM در یک سیکل و با طول دستورالعمل به میزان یک word انجام می شد، از وضعیت فعلی بسیار بهتر بود. اما مقایسه با امکانات یک خانواده دیگر و بررسی صحت و سقم آن را خارج از بحث های مشمول برنامه نویسی اسمبلی خانواده AVR می بینم که در چارچوب این تاپیک نمی گنجد.اگر زمان و گرفتاری هااجازه بدهد، در مورد این مقایسه در تاپیک دیگری می توانم در خدمت شما و سایر دوستان باشم.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


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

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

                    دیدگاه


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

                      Virtual port یا پورت های مجازی در محدوده ای قرار دارند که دستورات IN و OUT می توانند روی آن عمل کنند. پورت های واقعی قابل نسبت داده شدن به پورتهای مجازی هستند و هر عملی که روی پورت مجازی انجام شود، روی پورت واقعی نسبت داده شده تاثیر می گذارد. تعداد 4 پورت مجازی در خانواده XMEGA وجود دارند.
                      قبل از ادامه مباحث لازم است نرم افزار AVR Studio به عنوان یک فضای برنامه نویسی و شبیه سازی و پروگرام کردن AVR و XMEGA با زبان اسمبلی و C ( با اضافه کردن winavr)، معرفی شود. به دوستان علاقه مند به برنامه نویسی اسمبلی توصیه می شود نسخه های 4.16 و بالاتراین نرم افزار را برای تست و پیاده سازی برنامه های مورد نظر خود تهیه کنند. در بخش شبیه سازی این نرم افزار امکان مشاهده تغییرات رجیسترها و فلگ ها و مانند آن وجود دارد که به اشکال زدایی و درک عملکرد برنامه کمک زیادی می کند.
                      برای شروع برنامه نویسی اسمبلی باید رجیسترهای کنترل کننده سخت افزار را به خوبی بشناسیم و عملکرد آنها را درک کنیم و از آنجایی که تفاوت اساسی بین رجیسترهای داخلی AVR با XMEGA وجود دارد، عملا با شناخت دو گروه میکروکنترلر مختلف روبرو هستیم که وجه مشترک آنها در مجموعه دستورالعملهای اسمبلی آنهاست. با توجه به اینکه تمرکز این تاپیک بیشتر روی دستورالعمل های اسمبلی است، بیشتر دستورات در قالب عملیات روی پورت ها بیان می شود و خیلی به جزئیات رجیسترها در اینجا پرداخته نمی شود.

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

                      دیدگاه


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

                        در صورت مسئله عبارت "روتین" بکار رفته و منظور این است که کل برنامه از ابتدا تا انتها مورد نظر نیست و فقط عملیاتی که در سوال آمده، مورد نظر بوده است. به همین دلیل فرض بر این است که قبل و بعد از دستورالعملها هم کدهای دیگر وجود دارند. از جمله اینکه PORTC باید در مکان مناسب قبلا به عنوان خروجی تعریف شده باشد.

                        حل مثال برای AVR:
                        بخش مشترک روتین ها
                        IN R16,PINA
                        IN R17,PINB
                        الف-
                        ADD R16,R17
                        OUT PORTC,R16
                        ب-
                        CP R16,R17
                        BRSH LABEL1
                        OUT PORTC,R17
                        RJMP CONTINUE
                        LABEL1:
                        OUT PORTC,R16
                        CONTINUE:

                        ج-
                        CP R16,R17
                        BRNE LABEL1
                        OUT PORTC,R16
                        RJMP CONTINUE
                        LABEL1:
                        OUT PORTC,R17
                        CONTINUE:

                        د- اصلاح صورت مسئله به قدرمطلق تفاضل دو ورودی
                        CP R16,R17
                        BRSH LABEL1
                        SUB R17,R16
                        OUT PORTC,R17
                        RJMP CONTINUE
                        LABEL1:
                        SUB R16,R17
                        OUT PORTC,R16
                        CONTINUE:

                        ه-
                        CBR R16,0X0F
                        CBR R17,0XF0
                        ADD R16,R17
                        OUT PORTC,R16
                        راه دوم
                        ANDI R16,0XF0
                        ANDI R17,0X0F
                        ADD R16,R17
                        OUT PORTC,R16
                        بجای دستور ADD از OR هم می شد استفاده کرد.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


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

                          دستور LPM:

                          برای خواندن محتوای اطلاعاتی که در حافظه Flash ذخیره شده، از دستور LPM استفاده می شود. استفاده از این دستور برای بازیابی محتوای Lookup tables و اطلاعات از پیش محاسبه شده ای است که موقع برنامه ریزی IC در حافظه Flash ذخیره می شوند. از جمله بسیاری از محاسبات ریاضی را می توان یکبار انجام داد و نتیجه را بصورت جدول هایی در حافظه برنامه ریزی کرد و در زمان مورد نیاز تنها از نتیجه این محاسبات از پیش انجام شده استفاده کرد. به عنوان مثال اگر در یک برنامه، محاسبه سینوس یک مقدار مورد نظر باشد، می توان یک جدول سینوسی را از قبل محاسبه و در حافظه Flash برنامه ریزی کرد و در زمان مورد نیاز این مقدار سینوس را از طریق دستور LPM از حافظه برنامه بازیابی کرد.
                          رجیستر Z به عنوان اشاره گر به حافظه مورد نظر باید از قبل مقداردهی شود. دستور LPM مقدار خوانده شده را در رجیستر R0 قرار می دهد. به غیر از R0 می توان با دستور LPM Rd,Z حاصل را در هریک از رجیسترهای R0-R31 قرار داد. همچنین در این دستور امکان افزایش رجیستر Z بعد از خواندن از حافظه وجود دارد که بصورت زیر نوشته می شود.
                          LPM Rd,Z+


                          نکته مهم: آدرس قرار گرفته در رجیستر Z باید دو برابر آدرس جدول مورد نظر در حافظه Flash باشد.

                          مثال: یک مبدل BCD به 7SEGMENT که عددی را از PINB می خواند و اگر 4 بیت پائین آن در محدوده 0-9 بود کد معادل 7SEGMENT و در غیر اینصورت کد معادل کاراکتر – را در خروجی PORTC قرار می دهد. خروجی PORTC به ترتیب به gfedcba متصل است و بیت هفتم هم به جایی متصل نیست.

                          IN R16,PINB
                          CBR R16,0XF0
                          RCALL BCD_7SEG
                          OUT PORTC,R16
                          …
                          BCD_7SEG:
                          LDI ZL,LOW( TABLE * 2)
                          LDI ZH,HIGH( TABLE * 2)
                          ADD ZL,R16
                          CLR R16
                          ADC ZH,R16
                          LPM R16,Z
                          RET
                          TABLE:
                          .DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ; 0 - 9
                          .DB 0X40,0X40,0X40,0X40,0X40,0X40 ; A - F
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


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

                            ممنون جناب طراح
                            راهی وجود داره که .DB رو یکبار بیشتر ننویسم؟ ( با وجود چندین خط داده ) منظورم این هست که مثلا 20 خط برای نوشتن اطلاعات 8 بیتی در ROM وجود داره، به جای اینکه 20 بار .DB رو اول هر خط بنویسیم راهی هست که فقط یکبار بنویسیم؟
                            از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
                            هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
                            اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
                            اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
                            شاد و موفق باشید

                            دیدگاه


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

                              نوشته اصلی توسط Study
                              ممنون جناب طراح
                              راهی وجود داره که .DB رو یکبار بیشتر ننویسم؟ ( با وجود چندین خط داده ) منظورم این هست که مثلا 20 خط برای نوشتن اطلاعات 8 بیتی در ROM وجود داره، به جای اینکه 20 بار .DB رو اول هر خط بنویسیم راهی هست که فقط یکبار بنویسیم؟
                              Help نرم افزار AVR STUDIO را برای سوال شما نگاه کردم. اما راهی در این مورد مشاهده نکردم و ظاهرا در هر خط باید یک DB. گذاشته شود.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


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

                                سلام جناب طراح

                                می خواستم بدونم بنظر شما امکان pwm روی 64 عدد led با avr وجود داره
                                مثلا با شیفت ریجستر
                                زندگی یه فرصته

                                دیدگاه

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