اطلاعیه

Collapse
No announcement yet.

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

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

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

    در مورد عملکرد مقایسه کننده آنالوگ در بخش سی و هفتم آموزش AVR توضیح داده شده است:

    http://www.aparat.com/v/o7VAX

    پیاده سازی آشکارساز عبور از صفر هم در AVR182 قابل مطالعه است:

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

    دیدگاه


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

      مرسی از فایل هایی که گذاشتین.سوال دیگه ای که داشتم این بود که در جایی از الگوریتم سیستم منتظر وقفه مقایسه کننده میمونه وقتی وقفه ای اومد با توجه به تعداد کلید های فشرده شده(که توی یک رجیستر ذخیره شده)عدد متناسبی رو از جدولی که تهیه کردم برمیداره و توی رجیستر ocr1axمیریزه تا مدت 1بودن خروجی رو تنظیم کنه.مشکلی که هست اینه که اگه جدول رو با .dbبنویسم چون عددهایی که باید توی رجیستر ocrقرار بگرن از255 بزرگترن(بعضی هاشون)جدول به هم میخوره!یه را ه حلی که هست اینه که میبایستی جدول رو با .dwبنویسم.خب حالا در این صورت چطور باید هرعددی که توی یک سطر قرار میگیره رو توی ocr1al و ocr1ah قرار بدم؟با lpm که نمیشه؟نه؟!

      اضافه شده در تاریخ :
      البته یادم رفت بگم من با atmega8 with 4Mhz clock کار میکنم!

      اضافه شده در تاریخ :
      شاید بهتربود اول این سوال رو میکردم که نحوه دسترسی به جدولی که با .dw تهیه شده چطور هست؟یعنی بعد اینکه آدرس ابتدای جدول رو به ZL ZH دادیم چطوری به بقیه داده ها دسترسی داشته باشیم؟اعدادی که من باید تو جدول داشته باشم عبارتند از 61.124.186.249.311.374و غیره!!میخوام اگه تعداد فشرده شدن کلیدها 1 باشه عدد 61 اگه 2باشه عدد 124 و الی آخر توی رجیستر ocr1a ذخیره بشه. (در ضمن گزینه ویرایش رو الان متوجهش شدم!وگرنه بی خودی سه پیام ارسال نمی کردم.شرمنده :redface

      دیدگاه


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

        اگر در حافظه Flash مقداری را با dw. تعریف کنید، این مقدار حتی اگر کوچکتر از 256 باشد، بصورت دو بایتی ذخیره می شود که بایت بالای آن در این حالت صفر است. به عنوان مثال در اجرای دستورات زیر، در ابتدا مقدار 0x0026 و در مرحله بعد مقدار 0x55aa در OCR1A قرار می گیرد:

        کد:
        ldi		zl,low(table<<1)
        ldi		zh,high(table<<1)
        lpm		r16,z+
        lpm		r17,z+
        out		OCR1AH,r17
        out		OCR1AL,r16
        lpm		r16,z+
        lpm		r17,z
        out		OCR1AH,r17
        out		OCR1AL,r16
        
        ...
        
        table:
        
        .dw		0x26,0x55aa


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

        دیدگاه


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

          خیلی ممنون از پاسختون.از روز سه شنبه بعد از ظهر(تا الان که جمعه هست) دارم روی پروژه ای که قبلا عرض کردم کار می کنم.در طول ترم به لطف استاد محترمی که این درس رو تدریس میکردن چندان از میکرو سردرنیاوردم(در طول ترم مشغول روخوانی دیتا شیت مگا8بودیم همراه با یک مثال از صفحه کلید 4*4 که آخرش هم حاضر نشدن کل برنامه ای که استاد خودشون 15سال قبل نوشته بودن در اختیارمون بذارن!!!)(میخواستم بگم هیچ چیزی متوجه نشدم از میکرو دیدم به استاد کم لطفی میشه!!!)این بحث مقایسه کننده رو هم اصلا تدریس نکردن ولی پروژه ای که دادن میبایستی ازش استفاده بشه!چون وقت مطالعه نداشتم عضو سایت شدم تا سولامو از اساتیدی مثل شما که بی هیچ چشمداشتی علم و بخصوص تجربیات خودشون رو در اختیار بقیه میذارن(تجربیاتی که بیشتر اساتیدی که توی دانشگاه تدریس میکنن با پول هم در اختیار دانشجو نمیذارن چه برسه به اینکه بخوان سر کلاس بگن! !)(البته حرف زیاد دارم در این مورد ولی حیف جای بحثش اینجا نیست که اگر بود قشنک سه چهار صفحه باید مینوشتم که چه میگذره توی این دانشگاه های به ظاهر سراسری ولی در باطن سرانوری!!) بپرسم.ولی چون سیستم سایت بصورت چت نیست و من سوال اخیرم رو دیروز ثبت کرده بودم(وتا ساعت 10امروز جوابی دریافت نکرده بودم)هر طوری شده خودم جواب سوالامو پیدا کردم (دقیقا من تو برنامه خودم از دستوراتی که لطف کردین نوشتین استفاده کرده بودم)و امروز ساعت8بعد از ظهر پروژه رو با شبیه سازیش تموم کردم.ان شاالله در فرصت های بعدی کل فایلها رو دراختیار دوستان میذارم که استفاده کنن(البته بصورت رایگان!!و بعنوان یک شیرینی به خاطر یک اتفاق مهم که امیدوارم واسه من رخ بده)و باز هم از شما جناب طراح و بقیه دوستان تشکر میکنم.امیدوارم همینطور به کارتون ادامه بدین و به نوعی به پیشرفت افراد کمک کنین. :applause: :bye

          دیدگاه


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

            سلام
            قصد دارم از داخل برنامه Application به ابتدای آدرس برنامه بوت لودر jump کنم .
            ابتدای آدرس برنامه بوت 0x3800 است از دستور :
            #asm("jmp $3800&quot
            که به جای دیگه ای پرش میکنه .

            دستور اشتباهه یا مشکل چیز دیگه ای هست ؟

            تشکر
            از جمله ی رفتگان این راه دراز
            باز آمده ای کو که به ما گوید راز
            هان بر سر این دو راهه از روی نیاز
            چیزی نگذاری که نمی آیی باز

            دیدگاه


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

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

              دیدگاه


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

                نوشته اصلی توسط طراح
                آدرس قرار داده شده باید آدرس word باشد. آیا به همین طریق عمل کرده اید؟
                برای تست یک فانکشن نوشتم و آدرس فانکشن را در یک pointer خواندم:
                کد:
                void boot();
                void (*foo)(int);
                foo=&boot;
                مقدار pointer برابر 0x2b است
                و این مقدار را در jmp قرار دادم :
                کد:
                asm volatile ("jmp 0x2b");
                که باز هم به جای دیگه ای جامپ میشه.
                البته mega استفاده میکنم نه xmega

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

                دیدگاه


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

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

                  دیدگاه


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

                    من با IAR آشنا نیستم ولی داخل AS نشد .
                    ممنون میشم اگر با AS هم تست کنید .

                    تشکر
                    از جمله ی رفتگان این راه دراز
                    باز آمده ای کو که به ما گوید راز
                    هان بر سر این دو راهه از روی نیاز
                    چیزی نگذاری که نمی آیی باز

                    دیدگاه


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

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

                      دیدگاه


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

                        در این پست قصد دارم جزئیات نسبتا طولانی یک مشکل مشاهده شده در جریان برنامه نویسی اسمبلی را به عنوان تجربه ای برای مخاطبین محدود این موضوع توضیح دهم.
                        در عملکرد کد مفصلی که به منظور استفاده از حداکثر ظرفیت پردازشی XMEGA با زبان اسمبلی نوشته شده، مشکل عجیبی مشاهده شد به این ترتیب که در ابتدای روز و بعد از اولین بار بعد از روشن کردن برد، ارتباط RS485 با برد برقرار نمی شد و عملکرد آن متوقف می شد. اما با تغییراتی در نرم افزار و تست های مجدد، مسئله ظاهرا حل می شد. با این وجود در روز بعد مجددا بعد از روشن کردن سیستم همین مشکل برقرار بود. در گام اول این مورد به نظر رسید که مشکل ناشی از تغییر فرکانس کلاک سیستم به دلیل تغییر حرارت محیط و سرد شدن هوا در طول شب است. بنابراین منبع کلاک از یک کریستال خارجی و سپس رساندن آن با PLL به فرکانس بالاتر انتخاب شد. اما با عدم رفع مشکل، این مورد به نظر رسید که شاید PLL در سری A به هر دلیلی درست عمل نمی کند. پس سری AU جایگزین آن گردید. با برقرار بودن مشکل این احتمال مطرح شد که شاید اصولا PLL دارای مشکلی در پایداری است. بنابراین بجای فرکانس 32 مگاهرتز، فرکانس کلاک به 16 مگاهرتز با تامین مستقیم از کریستال خارجی کاهش داده شد. اما همچنان در روز بعد ارتباط سریال به درستی برقرار نمی شد. نکته قابل تامل این بود که در زمان جواب دادن برد، با قطع و وصل تغذیه همچنان برد عمل می کرد. اما با گذشت یک روز این مشکل خود را نشان می داد. برای بررسی بیشتر تاثیر دما، از روش قرار دادن برد در فریزر و تست آن استفاده شد که بنا به مشاهدات بعد از هربار قرار دادن برد در فریزر و گذشت مدت زمانی این مشکل خود را نشان می داد. در این مرحله بجای صبر یکروزه برای تست هرگونه تغییرات نرم افزاری و سخت افزاری، امکان تست عملکرد در فاصله زمانی کوتاهتر فراهم شد. مورد بسیار عجیب در این مرحله این بود که بعد از سرد شدن برد و ایجاد مشکل، اگر نرم افزار قبلی مجددا پروگرام می شد، با وجود سرد بودن برد مشکل برطرف می گردید. اما اگر قبل از پروگرام شدن، میکروکنترلر ریست می شد، تاثیری در درست عمل کردن نرم افزار نداشت. در این وضعیت این سوال پیش آمد که آیا ممکن است سرمای موجود باعث پاک شدن محتوای flash شود؟ برای پاسخ به این سوال در وضعیت بوجود آمدن مشکل ناشی از سرما، برنامه verify شد که محتوای flash صحیح بود. سوال مطرح در این شرایط این بود که چرا در بردهای مشابه مبتنی بر AVR چنین مسئله ای مشاهده نمی شود و برای تست یک برد AVR در فریزر قرار داده شد که باز هم به خوبی عمل می کرد. در این مرحله این سوال ایجاد شد که شاید مشکلی در رابطه با خانواده XMEGA در دماهای پائین وجود داشته باشد. برای تست این مسئله برد XMEGA دیگری با سخت افزار و نرم افزار متفاوت در فریزر قرار داده شد. اما هیچ مشکلی در عملکرد آن مشاهده نشد.
                        بعد از صرف زمان بسیار زیاد مشخص شد که این سرما نیست که منجر به بروز چنین وضعیتی می شود. بلکه اگر تمام خازن های موجود روی برد تخلیه شوند، در همان دمای معمول هم عملکرد نادرست فورا خود را نشان می دهد. در نهایت بعد از انجام آزمایش های متعدد و بررسی همه جانبه مشخص شد که همه این مشکلات ناشی از عدم مقداردهی اولیه به یک متغیر تعریف شده در sram است که باعث می شود بر اساس یک دستور IJMP پرشی به یک نقطه نامشخص از flash انجام شود و عملکرد خروجی برنامه مختل شود. با اصلاح این مقداردهی همان سری A هم با فعال کردن PLL با مرجع کریستال خارجی به خوبی جواب داد و هیچ مشکلی در دماهای مختلف هم مشاهده نشد. اما سوال اصلی در این داستان طولانی این است که چرا سیستم در پایان هر روز جواب می داد، اما در روز بعد و یا تخلیه خازن های آن مشکل ایجاد می شد؟ پاسخ تمام سوالات این است که با خاموش ماندن برد در زمان طولانی و یا تخلیه خازن های آن، محتوای sram پاک می شود و دارای مقدار نامشخصی می شود (محتوای sram بعد از reset پاک نمی شود) که باعث بروز مشکل می گردد. اما ظاهرا پروگرام کردن توسط پروگرامر mkii باعث صفر کردن محتوای sram هم می شود که سبب عملکرد درست نرم افزار می شود و در پایان هر روز که برد بدون مشکل عمل می کرد، قبل از آن حتما یکبار پروگرام شده بود و آدرس مورد نظر دارای مقدار صفر شده بود. اما در صبح روز بعد حافظه کلا پاک شده بود و پرش به آدرس غیر مشخص انجام می شد که حاصل آن عمل نکردن خروجی نرم افزار بود.
                        ممکن است این سوال برای برخی مخاطبین مطرح شود که آیا نمی شد به جای استفاده از ابزار برنامه نویس اسمبلی از کامپایلر های سطح بالا برای پیاده سازی مورد نظر استفاده کرد تا چنین مشکلاتی ایجاد نشود؟ پاسخ این سوال منفی است. به این ترتیب که برای انجام منظور مورد نظر چنان بار پردازشی به cpu تحمیل می شود که در صورت لزوم استفاده از XMEGA نمی توان به روش دیگری این برنامه نویسی را انجام داد و تنها چاره کار با فرض استفاده از XMEGA همین شیوه برنامه نویسی بوده است.
                        در هر صورت کل این پروسه حداقل بیش از 50 ساعت کاری از من زمان گرفت و به نظرم رسید شاید نقل آن بتواند برای برخی دوستان خاص مفید باشد.
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


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

                          از روش قرار دادن برد در فریزر و تست آن استفاده شد که بنا به مشاهدات بعد از هربار قرار دادن برد در فریزر و گذشت مدت زمانی این مشکل خود را نشان می داد.
                          یعنی قرار دادن برد در فریزر هم باعث تخلیه خازن ها می شد؟

                          دیدگاه


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

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

                            دیدگاه


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

                              سلام
                              لطفا در مورد عملکرد کد زیر توضیح دهید ، دستور نوشته شده بعد از نقطه ویرگول چه کاری انجام می دهد ؟
                              تشکر .
                              کد:
                              muls	r23, r21		; (signed)ah * (signed)bh

                              دیدگاه


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

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

                                دیدگاه

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