اطلاعیه

Collapse
No announcement yet.

یه برنامه با TMR0

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

    یه برنامه با TMR0

    چه طوری میشه با TMR0 یه برنامه نوشت که دقیق هر 1000 میلی ثانیه وارد یه لوپ بشه و یه سری کار انجام بشه؟
    فقط از راه استفاده از سرریز تایمر و قرار دادن یه کانتر نباشه که دقیق نیست!

    اضافه شده در تاریخ :
    می خوام یه تابع بنویسم که فرکانس رو روی پین خاصی اندازه بگیره.(توو CCS)
    برای این کار مسلماً از دستورات while , if مثلاًً i++,++j, باید استفاده کنم.
    می خواستم ببینم این دستورات چند سیکل رو تلف میکنه و چون TIMER0 همیشه در حال کارکردن هست مطمئناً چند درصدی خطا به وجود میاره.
    میشه در صد این خطا رو به صفر رسوند؟

    #2
    پاسخ : یه برنامه با TMR0

    فقط از راه استفاده از سرریز تایمر و قرار دادن یه کانتر نباشه که دقیق نیست!

    میشه در صد این خطا رو به صفر رسوند؟

    (با برنامه پرو...کسی نمیشه نقل قول گزاشت ...)


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

    دیدگاه


      #3
      پاسخ : یه برنامه با TMR0

      سلام
      با تایمر 0 نمی تونید این کارو کنید . چون تایمر 0 از کلاک داخلی میکرو استفاده می کنه که در اینصورت 2 مشکل پیش میاد :
      1 - اسیلاتور اصلی میکرو باید دقیق تو فرکانس مورد نظر کار کنه که معمولا این کار کمتر قابل اجرا هست (چون معمولا از اسیلاتور XT یا HS استفاده میشه که کریستال به کار برده شده تو اونها فقط تا محدوده کیلو هرتز دقیق عمل می کنه) .
      2 - در صورتی که اسیلاتور هم دقیق باشه ، اعداد محاسبه شده برای زمان سر ریز و ... به صورت غیر صحیح هستند که باز هم دقت کار رو میارن پائین .

      به جای تایمر 0 می تونید از تایمر 1 استفاده کنید که امکان استفاده از اسیلاتور LP خارجی واسه خودش رو داره و اگه تو اسیلاتور تایمر 1 از کریستال ساعت استفاده کنید ، تایمر هر 2 ثانیه یکبار سر ریز میشه . حالا اگه تایمر رو با نصف مقدار بارگزاری کنید ، تایمر هر 1 ثانیه یکبار سرریز میشه (ایجاد RTC) .
      هر دو تایمر هم امکان وقفه دادن به میکرو رو دارن و اگه با وقفه انجام بدید ، دیگه نیازی به محاسبه تعداد سیکل و ... نیست .
      به دلیل رعایت نکردن قوانین ، امضا ویرایش شد.

      دیدگاه


        #4
        پاسخ : یه برنامه با TMR0

        نوشته اصلی توسط (حامد مظاهری)irmicro
        سلام
        با تایمر 0 نمی تونید این کارو کنید . چون تایمر 0 از کلاک داخلی میکرو استفاده می کنه
        پس چه طور PIC BASIC PRO با استفاده از دستور COUNT به راحتی این کار رو می کنه (حتی با 16F84 وبا استفاده از TMR0) .

        دیدگاه


          #5
          پاسخ : یه برنامه با TMR0

          اسیلاتور داخلی معمولا مقاومت خازنی هست ... درسته که تغییرات زیادی نداره (اما نصبت به کریستال به دما حساس تره و ... ) اما خود فرکانس اسنی رو نمیده ... یعنی مثلا وقتی میگین داخلیه 8 مگ .. جای 8000000 پالس به فرض 7800000 تا میده ... این خودش تغییره زیادی نداره اما طبق قانون دهم یازدهم نیوتن (نمی دونم تا چند توو SMS ها اومده ... ) از هر میکرو به میکروی دیگر تغییر میکند ...
          یعنی اینکه وقتی شما میکرویی رو خریدین،اول اون رو به فرض باهاش توو یکی از تایمر ها تولید 1 پانیه بنویسین(طبق گفته شما خطا دیده خواهد شد اما مقدارش کمکی ثابت و قابل استفادست ...)آ‌ اون رو با فرکانس متر بررسی کنین ... ببینین مثلا این میکروی خواص چند مگ میده ... بعد با اون به جای 8مگ محاسبات رو انجام بدین ... خطای اولیه کریستال کمتره ...

          مشکل شمارش نیست ... درصد خطای rc داخلیه ...

          دیدگاه


            #6
            پاسخ : یه برنامه با TMR0

            با این اوصاف می تونیم تابع COUNT رو خودمون بنویسیم؟(با PIC BASIC PRO هم شد اشکال نداره)

            دیدگاه


              #7
              پاسخ : یه برنامه با TMR0

              خوب شما گفتید که دقیق هر 1000 میلی ثانیه .
              دستوراتی که تو pic basic pro هست تقریبا دقیق هست نه کاملا . به عنوان مثال شما یه ساعت با دستور pause بساز . بعد از مثلا 20 دقیقه ببین چقدر خطا داره .
              مثلا واسه تایمر 0 ، وقتی از کریستال 4 مگ استفاده کنید ، کلاک داخلی فرکانسش 1 مگ میشه که زمان تناوب هر سیکل 1 میکرو ثانیه میشه . حالا اگه بخواین با تایمر 0 تاخیر ایجاد کنید ، در حالت حداکثر پرسکالر ، تایمر بعد از 65536 کلاک داخلی سر ریز میشه . یعنی زمان 65.535 میلی ثانیه به دست می یاد . حالا اینکه زمان رندی نیست یه طرف و اینکه کریستالی که شما استفاده می کنید دقیق همون 4 مگ رو نمیده هم یه طرف .
              واسه همین تایمر 1 رو پیشنهاد می کنم .
              و یه چیز دیگه اینکه تایمر 0 از شبکه rc داخلی کلاک نمی خوره و از خود کلاک اصلی میکرو استفاده می کنه . wdt از rc استفاده می کنه :redface:
              به دلیل رعایت نکردن قوانین ، امضا ویرایش شد.

              دیدگاه


                #8
                پاسخ : یه برنامه با TMR0

                اولا وقتی می نویسین PAUSE بقیه زمانها رو حساب نمی کنین!!!آ‌ یعنی مگه جمع اعداد و ... زمان بر نیستن؟ پس نوشتن یه چیز مثل :
                10:
                pause 1
                s=s+1
                if s=60 then
                s=0
                m=m+1
                .
                .
                .

                اشتباهه ... به جز PAUSE بقیه چی ؟آ‌!!!
                زمانهای اینها الکی که نیست!!!آ‌ یک عالمه برنامه نوشته شده ...

                دوما تایمر رو توو سر ریزش با مقداری پر میکنن ، یعنی مثلا توو هر سر ریز میشه رجیسترش رو با 5536 پر کرد،حالا 60000 پالس بعد دوباره سر ریز میشه..

                دیدگاه


                  #9
                  پاسخ : یه برنامه با TMR0

                  اولا خود pause سوای باقی دستورات دقیق نیست ، چون بر مبنای فرکانس دقیق 4000000 هرتز یا ... طراحی شده و کریستال های معمول تو این رنج معمولا تا 4000XXX دقیق هستند .
                  دوما واسه ایجاد یه تاخیر 1 ثانیه اونم کاملا دقیق باید تایمر 0 ، هر ثانیه 20 بار سر ریز بشه که میشه هر بار که تایمر سرریز شد اونو با مقدار 15536 بارگزاری اولیه کرد . اما بازم دقیق نیست چون کلاک داخلی دقیق نیست .
                  به دلیل رعایت نکردن قوانین ، امضا ویرایش شد.

                  دیدگاه

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