اطلاعیه

Collapse
No announcement yet.

Wait واقعی

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

    Wait واقعی

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

    #2
    پاسخ : Wait واقعی

    سلام.
    من فکر می کنم که تنها راه رسیدن به یک تاخیر کاملا دقیق فقط با دستورات اسمبلی امکان پذیره. با دستورات wait و یا delay نمیشه یه تاخیر کاملا دقیق ایجاد کرد.

    دیدگاه


      #3
      پاسخ : Wait واقعی

      با تایمر ها هم فکر کنم بشه wait دقیق درست کرد.چه با اسمبلی و چه با بیسیک و یا c
      www.icesi.ir

      دیدگاه


        #4
        پاسخ : Wait واقعی

        نوشته اصلی توسط میلاد موسوی
        با تایمر ها هم فکر کنم بشه wait دقیق درست کرد.چه با اسمبلی و چه با بیسیک و یا c


        اما اگر قرار باشه از تایمرها استفاده نشه، استفاده از اسمبلی بهترین راهه.

        دیدگاه


          #5
          پاسخ : Wait واقعی

          سلام
          ببنید دوست عزیز هیچ فرقی نمی کنه که از اسمبلی استفاده کنی یا از بیسیک یا c
          چون این دستورات بعد از کامپایل شدن به زبان ماشین که همان اسمبلی باشند تبدیل میشود.
          دستورات برای اینکه اجرا شوند یک مدتی طول می کشد که به آن ماشین سیکل می گویند که این سرعت بستگی به نوع کریستالی که انتخاب می کنی متفاوت است.
          برای پیدا کردن کلاک داخلی میکرو از این فرمول استفاده می کنند:
          کلاک داخلی میکرو = 1/12 * کریستال
          کلاک که بدست آمد جداولی وجود دارد که تعداد ماشین سیکل هایی که یک دستور اسمبلی طول می کشد رو نوشته
          مثلا می گن دستور mov یک ماشین سیکل است با فرض اینکه کلاک بدست آمده یک میکرو ثانیه باشد یعنی یک میکرو ثانیه طول می کشد که این دستور اجرا شود. برای بقیه دستورات به همین ترتیب.

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

          دیدگاه


            #6
            پاسخ : Wait واقعی

            نوشته اصلی توسط Ahp_online
            سلام
            ببنید دوست عزیز هیچ فرقی نمی کنه که از اسمبلی استفاده کنی یا از بیسیک یا c
            چون این دستورات بعد از کامپایل شدن به زبان ماشین که همان اسمبلی باشند تبدیل میشود.
            دستورات برای اینکه اجرا شوند یک مدتی طول می کشد که به آن ماشین سیکل می گویند که این سرعت بستگی به نوع کریستالی که انتخاب می کنی متفاوت است.
            برای پیدا کردن کلاک داخلی میکرو از این فرمول استفاده می کنند:
            کلاک داخلی میکرو = 1/12 * کریستال
            کلاک که بدست آمد جداولی وجود دارد که تعداد ماشین سیکل هایی که یک دستور اسمبلی طول می کشد رو نوشته
            مثلا می گن دستور mov یک ماشین سیکل است با فرض اینکه کلاک بدست آمده یک میکرو ثانیه باشد یعنی یک میکرو ثانیه طول می کشد که این دستور اجرا شود. برای بقیه دستورات به همین ترتیب.

            حالا به نظر من شما اگر زمانت بر حسب ثانیه است بیا کریستال 8 مگاهرتز بزار با این کار wait 1 شما تقریبا یک ثانیه است.البته باید بگم که این دستور شاید یک میکرو ثانیه طول بکشه که اجرا بشه ولی چون زمان بر حسب ثانیه است قابل صرف نظر است.
            سلام.
            شما درست می گویید؛ بعد از کامپایل شدن، کد ها به زبان اسمبلی تبدیل می شوند. اما یک نکته هست که در این تبدیل کد، یکسری کد اضافه هم بوجود می آد! مثلا:

            delay_ms(10);

            1--تبدیل کد رو هم می تونید ببینید: با کریستال 4MHz



            delay_ms(10);

            LDI R30,LOW(10)
            LDI R31,HIGH(10)
            ST -Y,R31
            ST -Y,R30
            CALL _delay_ms

            _delay_ms:
            ld r30,y+
            ld r31,y+
            adiw r30,0
            breq __delay_ms1
            __delay_ms0:
            __DELAY_USW 0x3E8
            wdr
            sbiw r30,1
            brne __delay_ms0
            __delay_ms1:
            ret


            .MACRO __DELAY_USW
            LDI R24,LOW(0x3E8)
            LDI R25,HIGH(0x3E8)
            __DELAY_USW_LOOP:
            SBIW R24,1
            BRNE __DELAY_USW_LOOP
            .ENDM



            2--حالا همین کد رو با اسمبلی می نویسیم: با کریستال 4MHz


            ldi r30,80
            loop1:
            ldi r31,250
            loop2:
            subi r31,1
            brne loop2
            subi r30,1
            brne loop1

            یا

            LDI R30,LOW(0x4e20)
            LDI R31,HIGH(0x4e20)
            loop1:
            SBIW R30,1
            brne loop1


            کلاک داخلی میکرو = 1/12 * کریستال
            کلاک که بدست آمد جداولی وجود دارد که تعداد ماشین سیکل هایی که یک دستور اسمبلی طول می کشد رو نوشته
            مثلا می گن دستور mov یک ماشین سیکل است با فرض اینکه کلاک بدست آمده یک میکرو ثانیه باشد یعنی یک میکرو ثانیه طول می کشد که این دستور اجرا شود. برای بقیه دستورات به همین ترتیب.
            این برای 8051 هست. در AVR اکثر دستورات در یک سیکل انجام می شن.

            حالا اگه حال شمارش داشته باشید، کاملا تفاوت رو خواهید دید

            دیدگاه


              #7
              پاسخ : Wait واقعی

              ببنید دوست عزیز هیچ فرقی نمی کنه که از اسمبلی استفاده کنی یا از بیسیک یا c
              تبدیل به زبان ماسین با همه زبان ها یکسان نیست. یادمه چند وقت پیش یکی از بچه ها تو یه لوپ از دستور Wait استفاده کرده بود. اما زمان خیلی خیلی بیشتری نسبت به برنامه مشابه به زبان اسمبلی داشت.
              در کل اگه زمان یک ثانیه رو می خوای ایجاد کنی بهتره از تایمر2 تو مد آسنکرون و با استفاده از کریستال 32768 هرتز استفاده کنی. تا حد خیلی خیلی زیادی دقتش خوبه.

              دیدگاه


                #8
                پاسخ : Wait واقعی

                بچه ها!
                حالا که بحث دقت اومد وسط،فرض کنید ما به هر ترتیبی اومدیم با میکرو یه تاخیری مثلا 100ms ایجاد کردیم،حالا از کجا بفهمیم که تاخیرش درسته؟(چقدر خطا داره؟)
                مثلا فرض کنید بخوایم از pc برای اینکار استفاده کنیم،برنامه ای میشناسید برای pc که زمان سنجش دقت بالایی(در حد هزارم ثانیه یا حتی ده هزارم ثانیه oo داشته باشه؟؟!
                اونچیزی که در دانشگاه یاد میگیرید، "الفبایی" هست برای نوشتن یک "رمان" !!

                دیدگاه

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