اطلاعیه

Collapse
No announcement yet.

نحوه ایجاد تاخیر با C و اسمبلی

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

    نحوه ایجاد تاخیر با C و اسمبلی

    سلام
    در انجمن جستجو کردم پاسخ مناسبی نگرفتم.

    سوال :

    1-برای ایجاد تاخیر ( مقدارش مهم نیست) ، واسه C و اسمبلی توضیحاتی بدید که چطور تاخیر ایجاد میشه. (به همراه دستورات )

    2- ایجاد فرکانسی با Duyt cycle مشخصی، اونم اگه میشه راهنمایی کنید.
    مثلا رو 1 پینی قراره یه فرکانسی با یه دیوتی سایکل ایجاد کنیم.

    متشکر

    #2
    پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

    سلام:
    در زمینه C میشه برای تاخیر از حلقه FOR استفاده کرد البته من اطلاعات من در مورد برنامه نویسی برای میکرو است
    for (x=0;x>500;x++

    دیدگاه


      #3
      پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

      مثلا تاخیر 1ms (یک میلی ثانیه) را بگید.

      دیدگاه


        #4
        پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

        نوشته اصلی توسط زهــــرا گروســی
        [color=purple]سلام
        سوال :
        1-برای ایجاد تاخیر ( مقدارش مهم نیست) ، واسه C و اسمبلی توضیحاتی بدید که چطور تاخیر ایجاد میشه. (به همراه دستورات )
        2- ایجاد فرکانسی با Duyt cycle مشخصی، اونم اگه میشه راهنمایی کنید.
        با سلام

        برای تاخیر در اسمبلی ، ساده ترین راه استفاده از دستور NOP میباشد .
        دستور دیگر $ jmp
        مثال در 8051 :
        mov r7,#20D
        djnz $,r7
        در خط اول ، مقداری به رجیستر R7 نسبت داده شده
        در خط دوم ، از مقدار ذخیره شده در این رجیستر ، یکی یکی ، کم میشود ، تا مقدار موجود در رجیستر ، صفر شود .

        برای تولید یک فرکانس :
        : start
        mov r5,#100d
        mov r6,#20d
        : high
        setb px.y
        djnz r6,high
        : low
        clr px.y
        djnz r5,low
        ajmp start

        با اجراء این دستورات ، پورت px.y در 100 واحد زمانی ، در وضعیت high و در 20 واحد زمانی ، در وضعیت low قرار میگیرد .

        دیدگاه


          #5
          پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

          سلام ................

          بخش اول سوالتون رو دقیق نمیتونم پاسخ بدم (راه های متنوعی وجود داره ..) اما یک سوال .. کامپایلر شما چه کامپایلری هست؟ در مجموع برای ایجاد تاخیر ما میتونید از سه رو استفاده کنید .. شمارش حلقه ها در چند سیکل(رزولوشن بالایی داره اما بستگی به فرکانس کاری CPU داره ..) ، استفاده از کلاک سخت افزاری بایت fetch برای تولید معادل زمانی و استفاده از وقفه ی زمانی BIOS .. اما برای روش اول میتونید سلسله خطوط NOP یا No OPration در روال برنامه نویسیتون تعریف کنید .. یکی از ایده هایی که در این زمینه وجود داره اینه که شما یه متغییر تعریف کنید و اونرو داخل یه حلقه قرار بدید .. بعد از این مرحله برای حلقتون یه مارنده بذارید و مادامیکه شمارنده ی حلقتون افزایش پیدا میکنه ، به متغییر تعریفی شما هم افزوده بشه .. بعد از این مرحله میتونید برای تاخیر زمانیتون یه محدوده تعیین کنید .. در حقیقت تعداد دفعاتی که حلقه ی شما لوپ میزنه ، روال برنامه کار دیگه ای نمیتونه انجام بده و یه جور Reqursivity برای حلقتون ایجاد میشه .. دقیقا الان مثالی که توی ذهنم مونده مثالی از دستورات اسمبلی هست که براتون در زیر پلود کردم ..
          http://i43.tinypic.com/9gg5m9.jpg


          http://i40.tinypic.com/9pt4c5.jpg


          اما بخش دوم سوالتون به فاکتورهای زیادی مرتبط میشه .. شما فرمودید ایجاد یه Duty Cycle مشخص .. خب شما برای تولید موج مربعی با این ویژگی چند راه کلی دارید که میتونید از اونها استفاده کنید ..

          اولین روشی که الان توی ذهنم هست اینه که شما از آیسی 8038 استفاده کنید .. این آیسی یه تراشه ایه که مثل فانکشن ژنراتور عمل میکنه و میتونید چندین شکل موج رو با اون تولید کنید .. به طبع یکی از اونها هم شکل موج مربعی هست .. با تغییر متغییر هایی که برای اون تعریف شده میتونید موج مورد نظرتون رو تولید کنید ..

          دومین روشی که وجود داره اینه که شما از آیسی 555 استفاده کنید .. این آیسی هم که به آیسی تایمر معروفه، میتونه توی این زمینه خیلی به شما کمک کنه .. روش کار با اون هم خیلی مشکل نیست.. در واقع شما باید دو فاکتور خیلی مهم از اون رو بدونید .. مقدار مقاومتی که بین پایه ی Reset و Discharge قرار میگیره و دومی هم مقدار خازنی هست که یک سر اون به پایه ی Threshold وصله و سر دیگه ی اون هم به زمین متصل هست .. روش کار این آیسی هم به این ترتیبه که با بایاس شدن اون، مقادیر RC تعیین کننده ی پهنای پالس خروجی ما هستن .. تحلیل این قضیه بر میگرده به کل موج خروجی تخلیه ی خازن و تاثیری که بر ترانزیستور NPN داخلی اون در پایه ی dischsrge داره ..

          سومین روشی که میتونید از اون استفاده کنید استفاده از میکرو برای این منظوره .. به نظر من بهترین گزینه ای که میتونید با توجه به کاربردتون، از اون استفاده کنید همین میکرو هست .. بااستفاده از واحد تایمر/کانتر و مد PWM میتونید به راحتی شکل موج خروجیتون رو تولید کنید .. با توجه به مراحلی هم که وجود داره و در همین سایت هم در مورد اونها صحبت شده، میتونید به راحتی پهنای پالستون رو به دست بیارید .. موفق باشید ..

          http://www.eca.ir/forum2/index.php?topic=18164.0
          دوستان! مدتی کمتر به سایت میام ..

          دیدگاه


            #6
            پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

            سلام
            دوستان توضیحات کامل رو دادند.
            برای ایجاد تاخیر ( مقدارش مهم نیست) ، واسه C و اسمبلی توضیحاتی بدید که چطور تاخیر ایجاد میشه. (به همراه دستورات )
            اگه منظورتون استفاده از میکرو هست:
            می شه یه تابع نوشت (مثلا به اسم Delay) که در اون یه تایمر رو راه بندازید.(برای یه تاخیر مرجع)
            بعد از این تابع در حلقه ی For استفاده کنید و هر چقدر خواستید(برای تاخیر های مختلف) این تابع رو فراخوانی کنید.اینجوری تاخیرتون دقیقه.

            دیدگاه


              #7
              پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

              ,واسه تاخیر1میلی ثانیه، این برنامه ایا درسته؟ :question:
              delay:
              cpi R16,200
              Inc R16
              Rjmp delay

              دیدگاه


                #8
                پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

                سلام
                شما برای ایجاد تاخیر باید ابتدا کلاک سیستم را حساب کنید .
                شما برای چه سیستمی می خواهید؟؟؟
                من یک مثال برای 8051 می زنم که به صورت زیر باید عمل شود برای همه ی سیستم ها این مسئله صدق می کند.

                فرمول بدست آوردن کلاک به صورت زیر است:
                فرکانس اسیلاتور=1/12*کریستال مورد استفاده (برحسب مگاهرتز)
                T=1/f
                مثال:
                اگر کریستال مورد استفاده شما 12 مگاهرتز است:
                F=1/12*12=1mHZ
                t=1/f
                کلاک 1 میکروثانیه بدست می آید.
                حالا برای ایجاد تاخیر 10ms باید به صورت زیر عمل کنید:
                10ms=10000uS
                چون رجیستر های 8051 8 بیتی هستند شما باید عدد را تقسیم بندی کنید:
                مثلا
                10000uS=100*100
                برنامه به صورت زیر خواهد بود:
                delay:
                mov r1,#100
                up:
                mov r2,#100
                djnz r2,$
                djnz r1,up
                برنامه بالا هر وقت اجرا شود 100 میلی ثانیه تاخیر ایجاد می شود.

                در مورد دیوتی سایکل باید بگم زمان صفر و یک بودن اگر یکی باشد دیوتی سایکل 50 درصد است.
                مثلا می گویند یک سیگنال با دیوتی سایکل 30 درصد ایجاد کنید یعنی این که 30 درصد از 100 درصد سیگنال یک است و 70 درصد دیگر صفر است یعنی زمان صفر و یک بودن آن یکی نیست.

                دیدگاه


                  #9
                  پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

                  توضیحتون کاربردی بود.
                  من همین فرمون بدست اوردن زمان از خاطرم رفته بود
                  متشکر که گفتید
                  در مورد مفهوم دیوتی سایکل که ایرادی ندارم اما برنامشو نمیدونم چطوری نوشته میشه!!

                  دیدگاه


                    #10
                    پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

                    سلام
                    مثلا برنامه برای 8051
                    مثال:برنامه ای بنویسید که p1.0 به مدت 20 میلی ثانیه یک باشد و 50 میلی ثانیه صفر؟
                    ORG 00H
                    JMP MAIN
                    ORG 030H
                    MAIN:
                    SETB P1.0
                    CALL DELAY_20MS
                    CLR P1.0
                    CALL DELAY_50MS
                    JMP MANI

                    DELAY_20MS:
                    mov r1,#200
                    up:
                    mov r2,#100
                    djnz r2,$
                    djnz r1,up
                    RET

                    DELAY_50MS:
                    mov r1,#500
                    up1:
                    mov r2,#100
                    djnz r2,$
                    djnz r1,up1
                    RET
                    این برنامه یک سیگنال در P1.0 ایجاد می کند البته با فرض این که کریستال 12 مگاهرتز باشد.
                    از ماشین سیکل دستورات صرف نظر میکنم .یک جدولی وجود دارد در کتاب مزیدی هست هر دستور اسمبلی دارای یک ماشین سیکل است مثلا دستور CJNE که دستور مقایسه است 2 ماشین سیکل طول می کشد اجرا شود یعنی با فرص این که کلاک 1 میکروثانیه باشد این دستور 2 میکروثانیه طول می کشد که اجرا شود.
                    ولی چون در حد میکرو ثانیه است در برنامه ها از اون صرف نظر می کنند.

                    دیدگاه


                      #11
                      پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

                      آیا اصلا تاخیر ایجاد کردن چیز خوبیه؟
                      اگه وسط تاخیر شما پورتی تغییر وضعیت بده و شما قرار بود موابظش باشید چی میشه.
                      نوعی از برنامه نویسی وجود داره که تاخیرها در اون ساختار دیگه ای دارند:

                      http://www.eca.ir/forum2/index.php?topic=23170.msg108177#msg108177
                      با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                      دیدگاه


                        #12
                        پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

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

                        دیدگاه


                          #13
                          پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

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

                          آیا زمانی که فکر می کنیم به تاخیر نیاز داریم درست فکر می کنیم. تجربه نشون داده خیلی از دوستان تاخیر ها را در جاهایی استفاده می کنند که نباید.
                          در واقع بجای ساختن زمان از اینتراپت تایمر از تاخیر زمان بخاطر سادگی بهره می برند. و بعد ها که یک برنامه ی کند و غیر قابل توسعه گریبانگیرشان خواهد شد.

                          اینکه ما می خواهیم یک برنامه برای تست و یادگیری بنویسیم با اینکه برنامه ای بنویسیم برای یک پروژه ی واقعی کمی متفاوت است.

                          می خواهم به تاخیر از منظری متفاوت بنگریم (همانگونه که سالها پیش راجع به دستور جنجال برانگیز jumpآ‌ یا goto نگریسته شد)

                          اگه نگاهی به PLC ها بیندازید می بینید که هیچ نوع زمانی در آنها وجود ندارد که سیکل کاری را دچار تاخیر کند. یعنی تاخیرها ساختار مشخصی دارند و همراه تمامی زمانهای دیگر از اینتراپت تایمر اصلی نشات می گیرند.

                          یعنی در هیچ زمانی ما نمی توانیم cpu را از کارهای دیگر بازداریم.

                          نمی دونم تا چه حد تونستم منظورمو بازگو کنم
                          با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                          دیدگاه


                            #14
                            پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

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

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

                            دیدگاه


                              #15
                              پاسخ : نحوه ایجاد تاخیر با C و اسمبلی

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

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

                              مثال بسیار خوبی زدید
                              اما همه ی ما می دانیم در پروژه های واقعی درخواست ها چگونه است و کسی برای یه برنامه ی ساده مزدی به کسی نمی دهد.

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

                              اینکه ما عادت کنیم از این امکانات عالی میکرو استفاده کنیم باعث شده تا اینهمه فک بزنم و سر دوستان را بدرد آورم. امیدوارم بر من ببخشایید
                              با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                              دیدگاه

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