اطلاعیه

Collapse
No announcement yet.

تعداد پالس ساعت استفاده شده برای هر دستور

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

    تعداد پالس ساعت استفاده شده برای هر دستور

    سلام دوستان
    آیا مرجعی هست که بگه هر دستور چند پالس ساعت مصرف می کنه؟
    مثلا من با استفاده از تایمر و کانتر خروجی ها رو 0 و 1 کرده ام. بخشی از کد من:
    کد:
    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    // Place your code here
    i++;
    if (i==7){
    PORTD.0=~PORTD.0;
    PORTD.2=~PORTD.2;
    }
    if (i==14){
    PORTD.1=~PORTD.1;
    PORTD.2=~PORTD.2;
    
    i=0;
    }
    }
    .
    .
    .
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 8000.000 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x09;
    TCNT0=0x00;
    OCR0=0x07;
    که در اون تایمر با کلاک 8 مگ و در مد ctc تنظیم شده و هر 8 تا شمارش توی وقفه می ره و کد های داخل وقفه هم نوشته می شه. می شه برام توضیح بدین هر چند میکرو ثانیه وضعیت پین های خروجی تغییر پیدا می کنه؟
    یعنی عملیات i++ و if و ... در کد بالا چند پالس ساعت زمان می بره؟
    ممنون
    اين که تعداد تشکر هاي اهدايي يه کاربر زياده به اين معنا نيست. که چيزي بلد نيست؛ بلکه نشانه اينه که به تلاش بقيه بچه ها احترام مي گذاره

    #2
    پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

    طبق اینجا:

    http://www.avrfreaks.net/index.php?n...37&start=0

    avr برای اجرای هر دستور به 1 سیکل کلاک نیاز داره و pic هم به 4 کلاک!
    تاپیک رو کامل بخونید. بحث جالبی شده.

    دیدگاه


      #3
      پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

      شما باید کد فوق رو به روش بیسک به اسمبلی تبدیل کنید .در این صورت بصورت خیلی دقیق میتون زمان اجرای برنامه رو حساب کنید . این دقت به دقت کریستال میکرو وابسته است .
      تقریبی بگم
      فرا خوانی تابع 3 پالس ساعت .y=function(x) m
      برگشت از تابع 4 پالس ساعت در مجموع 7 پالس ساعت
      افزایش متغر و مقدار دهی متغر با مقادیر ثابت یک پالس .i++. i=5
      انتساب مقدار یک متغیر به متغیر دیگه 2 پالس ساعت y=x
      خود حلقه ها 5 پالس ساعت .for- while -if -loop
      ضرب 8 بیتی 2 پالس ساعت
      جمع و تفریق 8 بیتی یک پالس ساعت
      پرش 2 پالس ساعت
      نوشتن عدد به حافظه یا io یک پالس ساعت .
      نوشتن حافظه به حافطه یا پورت به پورت 2 پالس ساعت


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

      دیدگاه


        #4
        پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

        البته عدادی که گفتم در بهترین حالت و با هوشمندانه ترین الگوریتم قابل پیاده ساری است .
        مثلا خواندن از حافظه و نوشتن به حافظه y=x وقتی 2 پالس طول میکشه که ریجستر خالی در دست باشه . اگه نباشه ابتدا باید خود ریجستر رو به حافظه خالی کرد بعد عمل انتساب بعد دوباره مقدار قبلی ریجستر رو از حافظه لود کردن
        که شد 4 پالس .
        تنها موردي كه همه آدما يقين دارن خدا در حقش زیاد لطف کرده
        داشتن عقله زيادتر از دیگر آدم ها است

        دیدگاه


          #5
          پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

          ممنون از پاسخ کاملتون
          خود ورود به وقفه توی AVR مثل فراخوانی تابع زمان می بره؟
          مثلا توی آرم ورود و بازگشت از وقفه اگه اشتباه نکنم 11 سیکل زمان می برد.
          اين که تعداد تشکر هاي اهدايي يه کاربر زياده به اين معنا نيست. که چيزي بلد نيست؛ بلکه نشانه اينه که به تلاش بقيه بچه ها احترام مي گذاره

          دیدگاه


            #6
            پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

            نوشته اصلی توسط aliila
            البته عدادی که گفتم در بهترین حالت و با هوشمندانه ترین الگوریتم قابل پیاده ساری است .
            مثلا خواندن از حافظه و نوشتن به حافظه y=x وقتی 2 پالس طول میکشه که ریجستر خالی در دست باشه . اگه نباشه ابتدا باید خود ریجستر رو به حافظه خالی کرد بعد عمل انتساب بعد دوباره مقدار قبلی ریجستر رو از حافظه لود کردن
            که شد 4 پالس .
            سلام
            میگم اینایی که گفتین فقط واسه AVR بود دیگه درسته؟
            میشه یه منبع هم بدین؟ البته اگه جسارت نباشه.
            بعد شما گفتین که به کلاک بستگی هم داره! منظور شما این بود که فقط سریعتر میشه درسته؟ یعنی تعداد کلاک ها کمتر نمیشه؟

            دیدگاه


              #7
              پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

              درواقع مشکل فلسفی من اینه:
              من اگه توی مثال بالا به جای جمله های:
              کد:
              if (i==7){
              if (i==14){
              OCR0=0x07;
              بنویسم:

              کد:
              if (i==31250){
              if (i==62500){
              OCR0=0x255;
              با توجه به این که:
              1=8000000/(256*31250)
              وضعیت خروجی ها هر 1 ثانیه تغییر می کنه(دقت در حدی هست که یک ثانیه مورد قبول باشه)
              اما با مقادیر پست اول، بایستی هر 7 میکرو ثانیه وضعیت خروجی تغییر کنه. چرا که:
              میکروثانیه7=8000000/(7*8)
              حالا هر چند سیکل تاخیر، که در هندلر وقفه وجود داشته باشه، در هر دو حالت بایستی وجود داشته باشه.
              حالا سوالم اینه که چرا یک ثانیه تاخیرش جواب می ده اما 7 میکرو ثانیه نه!
              امیدوارم تونسته باشم منظورم رو بگم!
              اين که تعداد تشکر هاي اهدايي يه کاربر زياده به اين معنا نيست. که چيزي بلد نيست؛ بلکه نشانه اينه که به تلاش بقيه بچه ها احترام مي گذاره

              دیدگاه


                #8
                پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

                نوشته اصلی توسط aliila
                شما باید کد فوق رو به روش بیسک به اسمبلی تبدیل کنید .در این صورت بصورت خیلی دقیق میتون زمان اجرای برنامه رو حساب کنید . این دقت به دقت کریستال میکرو وابسته است .
                تقریبی بگم
                فرا خوانی تابع 3 پالس ساعت .y=function(x) m
                برگشت از تابع 4 پالس ساعت در مجموع 7 پالس ساعت
                افزایش متغر و مقدار دهی متغر با مقادیر ثابت یک پالس .i++. i=5
                انتساب مقدار یک متغیر به متغیر دیگه 2 پالس ساعت y=x
                خود حلقه ها 5 پالس ساعت .for- while -if -loop
                ضرب 8 بیتی 2 پالس ساعت
                جمع و تفریق 8 بیتی یک پالس ساعت
                پرش 2 پالس ساعت
                نوشتن عدد به حافظه یا io یک پالس ساعت .
                نوشتن حافظه به حافطه یا پورت به پورت 2 پالس ساعت


                با این حساب برنامه داخل تابع حدودا 25 پالس طول میکشه .
                سلام دوست عزیز
                متشکرم از پاسختون اما فراخوانی تابع در میکروکنترلر ها ، به حافظه میکروکنترلر بستگی دارد و بین 4 تا 5 پالس ساعت طول میکشد
                برای انتساب مقدار یک متغیر به متغیر دیگه ابتدا باید متغیر از SRAM با دستور LDS یا LoaD Sram به رجیستر های عمومی ریخته بشه ، سپس با دستور STS از رجیستر عمومی به رجیستر دیگری در حافظه ، که در این صورت چهار پالس طول خواهد کشید ،
                من متوجه نشدم دقیقا کدام قسمت حلقه ها 5 پالس ساعت طول خواهد کشید ، این کاملا بستگی به زمانی داره که پروگرم کانتر در حلقه گیر کرده ، چون هر بار باید مقدار متغیر حلقه رو تغییر بده و چک کنه ،
                در بقیه موارد با شما موافقم جز مورد نوشتن حافظه به حافظه که توضیح دادم

                Good Luck

                دیدگاه


                  #9
                  پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

                  سلام دوست عزیز
                  بهترین کار از نظر من اینه که شما برنامه رو با AVR Studio هر ورژنی بود حتی 4.14 ، دیباگ کن ، قبل از ورود به وقفه تایمر (که خود شما باید پرچمش رو از پنجره ی i/o view یک کنی ) مقدار عددی stop watch در پنجره ی processor یادداشت کن ، و در انتهای وقفه هم یادداشت کن ، که چون واحد stop watch به میکروثانیه یا میلی ثانیه یا ثانیه هست میتونی زمان دقیق هر تابع یا زیربرنامه ای رو بفهمی

                  Good Luck

                  دیدگاه


                    #10
                    پاسخ : تعداد پالس ساعت استفاده شده برای هر دستور

                    سلام. دوستان راهی هست که بتونم دقیق بسنجم هر دستور چنتا کلاک طول میکشه؟
                    داخل atmel studio 7

                    دیدگاه

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