اطلاعیه

Collapse
No announcement yet.

زمان تلف شده برای تایمر

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

    زمان تلف شده برای تایمر

    سلام
    توی یه پروژه برای خواندن یه سری داده، از تایمر یک ATmega16 استفاده کردم.
    پروژه رو با بسکام نوشتم. Prescale = 1 قرار دادم و با کریستال 10MHz کار میکنم. یعنی هر شمارش باید در 10000000/1 ثانیه (100nS) انجام بشه.
    اما در هر بار که وقفه تایمر رخ میده، یه تأخیر اضافی بوجود میاد.

    اگه عدد 100 رو برای تایمر قرار بدی، به جای 10uS = 100*100nS اعمال وقفه بعد 17uS رخ میدهد.
    و این 7uS همیشه به طور ثابت به زمان وقفه اضافه میشود. (حتی اگه تعدا شمارش رو تغییر بدی.)
    مشکل چیه؟

    #2
    پاسخ : زمان تلف شده برای تایمر

    سلام
    اگه بخوای به اندازه 100 تا 100ns بشمری و چون تایمر 1 رو استفاده می کنی باید 65535 رو منهای 100 کنی و عدد 65435 رو هر دفعه تو تایمر قرار بدی. برای عملکرد بهتر هم خوبه که بدنه وقفه تایمر رو خیلی کوچک طراحی کنی تا تو زمان اجرای بدنه وقفه، مجدد زمانش سر نرسه. دیگه اینکه بهتره کدت رو هم بذاری تا بیشتر روش بحث کنیم.
    موفق باشی

    دیدگاه


      #3
      پاسخ : زمان تلف شده برای تایمر

      عدد 100 رو به عنوان مثال گفتم. عددهایی که میخوام به تایمر بدم از 100 تا 40000 هست. بنابر این مجبور شدم از تایمر یک استفاده کنم.
      در مورد زمان لازم برای اجرای زیر برنامه وقفه تایمر هم باید بگم که این مورد رو هم چک کردم. حتی در مورد شمارش طولانی(مثلا 40000) هم همین تأخیر وجود داره.
      با اینکه در ابتدای زیربرنامه وقفه، مقدار تایمر رو دوباره توی timer1 میذارم، اما باز هم این تأخیر بوجود میاد.

      دیدگاه


        #4
        پاسخ : زمان تلف شده برای تایمر

        سلام
        عدد 10MHz برای برنامه بسکام رو بدرستی مشخص کردی یا نه؟ برنامه رو هم بذار تا بهتر بشه روش بحث کرد؟
        موفق باشی

        دیدگاه


          #5
          پاسخ : زمان تلف شده برای تایمر

          سلام
          برنامه زیر برای تولید یه موج مثلثی با فرکانس 100Hz به کار میره.
          با تغییر عدد Period میتوان فرکانس موج مثلثی رو کم و زیاد کرد.
          مشکلی رو که قبلا گفتم، با اضافه کردن خط (***) برطرف کردم.

          سوال اینه که چرا باید عدد 68 اضافه بشه؟
          یعنی اگه نشه این 68 رو حذف کرد، نمیشه فرکانس خروجی رو از یه حدی کمتر کرد.

          پورت D توسط یه ADC هشت بیتی، خروجی مثلثی رو تولید میکنه.

          $regfile = "m16def.dat"
          $crystal = 10000000


          Config Portd = Output
          Config Porta = Output
          Config Portc = Output
          Config Portb = Input
          Portb = 255

          Config Timer1 = Timer , Prescale = 1
          Stop Timer1
          On Timer1 Timer1_int
          Enable Timer1
          Enable Interrupts


          Dim Tmr1_value As Word
          Dim Index As Integer
          Dim Direct As Bit
          Dim Period As Word
          Period = 200
          Index = 0
          Direct = 1

          Tmr1_value = 65535 - Period
          Tmr1_value = Tmr1_value + 68 (***)
          Timer1 = Tmr1_value
          Start Timer1

          Do
          'Nothing
          Loop
          End



          Timer1_int:

          Timer1 = Tmr1_value
          If Direct = 1 Then
          Incr Portd
          If Portd = 250 Then
          Direct = 0
          End If
          Else
          Decr Portd
          If Portd = 0 Then
          Direct = 1
          End If
          End If

          Return
          ' End of Timer1_int

          دیدگاه


            #6
            پاسخ : زمان تلف شده برای تایمر

            سلام دوست عزیز

            برنامه شما رو خوندم :nice:
            مشکل شما از برنامه نیست از کامپایلر است :angry: :angry: :angry:
            کامپایلر Bascom برای اینتراپت تایمر در زمانهای کوتاه مناسب نیستچون این کامپایلر زمانی را برای ذخیره و بازیابی اطلاعات از روی Stack تلف می کنه
            برای همین برای زمانهای کوتاه ، یه زمان معین به دوره اینتراپت اضافه میشه
            طول این دوره قابل محاسبه است. فکر کنم در حدود 100 میکرو ثانیه باشه (البته بستگی به تعداد متغیر های تعریف شده در برنامه، طول برنامه و ... دارد)
            پس اینتراپت تامر در کامپایلر Bascom برای زمانهای بالای مثلا 100 میکرو ثانیه دقیق ولی برای زمانهای کمتر از 100 میکرو ثانیه بدون دقت میشه :smile:
            اکر میخوای زمان دقیق بدذست بیاری باید با زبون Assambly برنامه بنویسی
            موفق باشی

            دیدگاه


              #7
              پاسخ : زمان تلف شده برای تایمر

              سلام
              شما بیان کردی که:
              برنامه زیر برای تولید یه موج مثلثی با فرکانس 100Hz به کار میره.
              ولی برنامه ای که نوشتی دوره ای که تولید می کنه تقریبا 500 برابر کوچکتره به همین تناسب فرکانسش 500 برابر بزرگتره. اگر عدد 100Hz درسته پیشنهاد می کنم Prescale تایمر رو زیاد کنی. اگر مورد تولید برنامه درسته پیشنهاد می کنم که فرکانس میکرو رو زیاد کنی بعد محاسباتت رو بر اون اساس مجدد انجام بدی.

              behi88 عزیز اشکال از کامپایلر نیست شما ممکنه مثل همین مثال میزان افزایش تایمر رو با فرکانس سیستم دقیقا یکی کنی.
              کد:
              Config Timer1 = Timer , Prescale = 1
              یعنی با توجه به ادعای Atmel با اجرای هر دستور در هر سیکل کلاک متناظرش یکی به مقدار تایمر اضافه بشه. حالا حالتی رو فرض کن که فقط سه شمارش تایمر رو لازم داشته باشی ولی شما تو بدنه اینتراپتی که با اسمبلی حتی داری می نویسی 4 دستور گذاشته باشی. مسلمه که تو اجراهای پی در پی اینتراپت ها رو از دست خواهی داد. بنابر این وظیفه برنامه نویسه که مراقب تناسب سرعتهای سیستمش با کاری که داره پیاده سازی می کنه باشه. همیشه توصیه می شه که در بدنه اینتراپتها کم ترین کارها انجام بشه. تو این برنامه میشه این جوری هم رفتار کرد که یه Flag ی رو تو بدنه اینتراپت تایمر Set کرد، بعد اونو تو Do-Loop کاملا کنترل کرد. مقایسه های بالا رو هم که در بدنه اینتراپته به Do-Loop منتقل کرد.
              موفق باشی.

              دیدگاه


                #8
                پاسخ : زمان تلف شده برای تایمر

                سلام

                ولی برنامه ای که نوشتی دوره ای که تولید می کنه تقریبا 500 برابر کوچکتره به همین تناسب فرکانسش 500 برابر بزرگتره. اگر عدد 100Hz درسته پیشنهاد می کنم Prescale تایمر رو زیاد کنی.
                اگر دقت کنید میبینید که برای تولید موج مثلثی از 250 پله صعودی و 250 پله نزولی استفاده کرده ام. یعنی برای هر سیکل کامل موج، به 500 تا شمارش تایمر نیاز دارم. یعنی همون 100Hz.

                حالا حالتی رو فرض کن که فقط سه شمارش تایمر رو لازم داشته باشی ولی شما تو بدنه اینتراپتی که با اسمبلی حتی داری می نویسی 4 دستور گذاشته باشی. مسلمه که تو اجراهای پی در پی اینتراپت ها رو از دست خواهی داد. بنابر این وظیفه برنامه نویسه که مراقب تناسب سرعتهای سیستمش با کاری که داره پیاده سازی می کنه باشه.
                یه بار دیگه تکرار میکنم: زیر برنامه وقفه زیر 10 سیکل انجام میشه. تست کردم و دیدم که توی زمان اجرای زیر برنامه وقفه، تایمر سرریز نمیشه.

                فرکانس کریستال رو هم نمیخوام تغییر بدم. چوت انتخاب 10MHz برای این بوده که تقسیمات زمانی برای سرریز تایمر با Prescale = 1 دقیق بدست بیاد.

                از راهنمایی تون درباره Flag ممنونم.

                اما من هم فکر میکنم مشکل از کامپایلر باشه.
                و شاید هم تنظیمات فیوز بیتها رو باید عوض کنم. چون دقیقا نمیدونم برای استفاده از کریستال 10MHz چه کدی رو باید توی فیوز بیت میکرو قرار داد.

                دیدگاه


                  #9
                  پاسخ : زمان تلف شده برای تایمر

                  سلام خدمت همه دوستان
                  منم تقریبا همین مشکل رو دارم ولی تو اینتراپت
                  تو مدارم یه وسیله اندازه گیری طول(digimatic indicator) استفاده شده که با وارد شدن یه پالس به پایه req این وسیله دیتای اندازه گرفته شده رو به صورت سریال توسط پایه data میفرسته (البته یه پایه کلاک هم داره)
                  برنامم به این ترتیب که با زدن یه کلید پالس به پایه req داده میشه و با هر کلاکی روی پایه برنامه به اینتراپت میره و دیتا رو از پایه میکرو دریافت میکنه حالا مشکل اینه گاهی میکرو چند تا بیت اول رو از دست میده و باعث غیر معتبر شدن دیتا میشه یعنی میکرو تا بره به اینتراپت و دیتا رو دریافت کنه 2 تا 3 بیت از دست میره
                  طبق دیتا شیت این وسیله اندازه گیری بعد از دریافت پالس req از 0 تا 95 میلی ثانیه طول میکشه اولین کلاک با دیتای متناظرش فرستاده بشه حالا وقتی این تایم کم میشه مشکلی که گفتم پیش میاد
                  فرستادن پالس REQ تو روتین اصلی برنامه هست
                  ممنون میشم راهنماییم کنید
                  چه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله

                  دیدگاه


                    #10
                    پاسخ : زمان تلف شده برای تایمر

                    سلام
                    با عرض پوزش بنده زیاد به کد توجه نکردم. حق با شماست. ولی یک نکته. اولین بار که از مقدار 200 استفاده کرده بودین من محاسبه کردم درست بود. الان با اضافه کردن مقدار 68 اگر همه چیز درست باشه دوره موج شما 0.0134 محاسبه می شه که فرکانس حدودی 74Hz رو تولید میکنه پس از لحاظ تئوری اینکار اشتباهه. مطمئن هم باشید کامپایلر اشتباهی نداره. ولی به نظرم مشکل از تنظیم منبع کریستال باشه چون شما گفتی که
                    و شاید هم تنظیمات فیوز بیتها رو باید عوض کنم. چون دقیقا نمیدونم برای استفاده از کریستال 10MHz چه کدی رو باید توی فیوز بیت میکرو قرار داد.
                    از لحن صحبت شما اینطور متوجه شدم که شما اصلا از کریستال خارجی استفاده نکردی. اگه اشتباه می کنم بگین. می دونید که کریستال داخلی میکروکنترلر حداکثر تا 8MHz بیشتر نیست. اگر اینطور باشه که کریستال داخلی رو 8MHz باشه و شما برای کامپایلر 10MHz مشخص کردید که خوب کامپایلر رو به اشتباه انداختید و محاسبات مسلما کندتر انجام خواهد شد. برای استفاده از کریستال خارجی تویه لیست پروگرامر بسکام بدنبال EXT. Oscillator باشید که مقدار رجیستر رو رویه 1111 تنظیم می کنه. حالا برنامه رو بدون سرریز 68 آزمایش کنید ببینید چی میشه؟
                    موفق باشید.

                    دیدگاه


                      #11
                      پاسخ : زمان تلف شده برای تایمر

                      سلام
                      من از کریستال خارجی 10MHz استفاده کرده ام و مقدار کریستال رو هم توی برنامه 10MHz داده ام. پس از این لحاظ مشکلی نیست.
                      محاسبات زمانی بدون در نظر گرفتن 68 این نتیجه رو میده که فرکانس باید دقیق باشه. اما توی شبیه سازی و توی عمل، زمان تلف شده اضافی مشاهده میشه.

                      چیزی که برای فیوز بیتها گفتم در مورد کد اون بود. کدهای 1001 تا 1111 برای کریستال خارجی استفاده میشن. اما من باید کدوم رو انتخاب کنم؟

                      مطمئن هم باشید کامپایلر اشتباهی نداره.
                      اتفاقا به نظر من اشکال باید از کامپایلر باشه.

                      دیدگاه


                        #12
                        پاسخ : زمان تلف شده برای تایمر

                        سلام
                        گفتم که روی 1111. مطمئن هم باش که کریستال دقیق 10MHz باشه. (منظور از اون 6 صفرها باشه). باز هم نظرم اینه که کامپایلر مشکلی نداره.
                        به هر حال تنظیم کریستال رو روی 1111 بذارید امیدوارم مشکل حل بشه.
                        موفق باشی

                        دیدگاه

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