اطلاعیه

Collapse
No announcement yet.

سوال در مورد تایمرها

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

    سوال در مورد تایمرها

    سلام و خسته نباشید.
    من نحوه ی فعال سازی تایمرها و دلیل استفاده رو تو منابع مختلف خوندم.
    مثلا اگر از کلاک داخلی استفاده بشه میشه تایمرو منبع خارجی باشه شمارنده و در حالاتی برای مقایسه کننده یا pwm و...
    و اینکه این تایمرها بصورت مسقل کار می کنند.
    سوالم اینه که مثلا و قتی تو pic basic pro می نویسیم pause 1000 و یک ثانیه وقفه ایجاد می کنیم از کدام تایمرها یا وقفه استفاده می کنه؟
    چرا وقفه ها یی رو که نیاز داریم در خود برنامه نگنجانیم؟مثلا دستورات For و ..؟
    من این از تایمر tmr0 برای pic12f675 استفاده کردم و نحوه محاسبه تایم رو از کتب و مراجع در آوردم ولی نمی دونم اساس استفاده و کاربردش چی هست.
    ممنون میشم راهنمایی بفرمایید.


    define OSCCAL_1K 1
    trisio=0
    option_reg=%00000111
    intcon=%00100000
    cmcon=7
    a1 var byte
    a0 var byte
    tmr0=102
    a1=0
    on interrupt goto vsa
    intcon=%10100000
    go:
    for a0=40 to 200
    pulsout gpio.4,a0
    pause 20
    next a0
    pause 1000
    for a0=200 to 40 step -1
    pulsout gpio.4,a0
    pause 20
    next a0
    pause 1000
    goto go
    disable
    vsa:
    tmr0=102
    a1=a1+1
    intcon.2=0
    resume
    enable
    end
    جدیدترین ویرایش توسط شاهرخ مستقیمی; ۱۴:۰۰ ۱۳۹۵/۰۹/۱۸.

    #2
    پاسخ : سوال در مورد تایمرها

    نوشته اصلی توسط vpic نمایش پست ها
    سوالم اینه که مثلا و قتی تو pic basic pro می نویسیم pause 1000 و یک ثانیه وقفه ایجاد می کنیم از کدام تایمرها یا وقفه استفاده می کنه؟
    چرا وقفه ها یی رو که نیاز داریم در خود برنامه نگنجانیم؟مثلا دستورات For و ..؟
    من این از تایمر tmr0 برای pic12f675 استفاده کردم و نحوه محاسبه تایم رو از کتب و مراجع در آوردم ولی نمی دونم اساس استفاده و کاربردش چی هست.
    ممنون میشم راهنمایی بفرمایید.
    سلام.
    در این حالت از هیچ تایمری استفاده نمیشه، بلکه CPU مشغول اجرای دستور NOP میشه (No Operation) و هیچ کاری انجام داده نمیشه تا اون تاخیر تموم بشه.
    مثلا شما میخواین یه پالس نسبتا دقیق ایجاد بکنین روی پایه ی x، (پایه ی غیر PWM) تایمر رو مقدار دهی میکنین که شروع کنه به شمارش و وقتی سر ریز شد، یه اینتراپت بده. بعد CPU مشغول انجام یه کار دیگه میشه (مثلا ارسال سریال یا اسکن کیبرد یا خوندن یه پتانسیومتر یا....) حالا وقتی وقفه ی تایمر اومد، CPU میره تو زیربرنامه ی وقفه؛ اونجا مثلا نوشتی پایه ی فلان رو NOT کن. اینجوری با حداقل دخالت CPU یه پالس روی پایه ی دلخواهت ایجاد کردی.
    یه کاربرد دیگه ش مثلا برای اندازه گیری فرکانس هست که اون رو واگذار میکنم به خودتون تا تحقیق کنین چطوری میشه اینکار رو کرد؟

    دیدگاه


      #3
      پاسخ : سوال در مورد تایمرها

      با سپاس فراوان.
      واقعا سردرگم شدم.
      یه سوال پیش میاد.
      وقتی تایمر سرریز میشه و cpu میهزتو زیر برنامه وقفه شاید یه طوری باشه که هر 10 میلی ثانیه سر ریز بشه.حالا میکرو میرسه که هم برنامه خودش(main( رو اجرا کنه و هم بره تو زیر برنامه وقفه؟
      من یه مواردی رو میگم اگر جایی اشتباه بود تصحیح بفرمایید.
      با کلاک داخلی 4 مگ با میکروی(12f675) ,تایم سیکل 64 میکرو ثانیه میشه و اگر ما مثلا 1 ثانیه رو بخوایم باید tmr0=194 قرار بردیم که بعد از 61 اینتراپت بده و یک ثانیه حساب بشه.
      حالا cpu با هر اینتراپت میپره تو زیر برنامه وقفه یا تا tmr0 به 255 نرسه زیر برنامه وقفه رو اجرا نمی کنه؟

      چطوری می تونم به جای دستور pause از تایمر استفاده کنم؟
      یک مثال ساده led چشمک زن کار منو راه می اندازه.
      این برنامه رو هم نوشتم ولی متاسفانه لامپ همیشه روشنه.
      define OSCCAL_1K 1
      a1 var byte
      a1=0
      cmcon=7
      trisio=0
      option_reg=%10000101
      intcon=%10100000
      tmr0=194
      on interrupt goto vsa
      go:
      if a1=255 then toggle gpio.1
      goto go
      disable
      vsa:
      a1=a1+1
      tmr0=194
      intcon.2=0
      resume
      enable
      end
      ممنون میشم راهنمایی بفرمایید.

      دیدگاه


        #4
        پاسخ : سوال در مورد تایمرها

        سلام.
        برنامه ای که نوشتین اصلا واضح نیست.
        نوشته اصلی توسط vpic نمایش پست ها
        وقتی تایمر سرریز میشه و cpu میهزتو زیر برنامه وقفه شاید یه طوری باشه که هر 10 میلی ثانیه سر ریز بشه.حالا میکرو میرسه که هم برنامه خودش(main( رو اجرا کنه و هم بره تو زیر برنامه وقفه؟
        بله، چرا نرسه؟! cpu مشغول کار خودش هست، هر 10 میلی ثانیه هم میاد یه سر به وقفه تایمر میزنه و میره. اشکال در کجا میتونه به وجود بیاد؟
        محاسبات سرریز تایمر رو درست انجام ندادین.
        4مگ کریستال، تقسیم بر 4 (ثابت در تمام PICها) میشه 1 مگ. پریود هم میشه 1میکرو. حالا باید ببینی prescale تایمر رو روی چه عددی تنظیم کردی؟ مثلا نسبت 1:2 تنظیم کردی. خب این یعنی اینکه به ازای هر دو سیکل از کلاک ورودی، تایمر 1 دونه میشماره. خب حالا چقدر طول میکشه تا سر ریز بشه و وقفه بیاد؟
        2میکرو (به خاطر نسبت prescale) ضرب در 256 ( ظرفیت تایمر) میشه 512 میکرو ثانیه طول میکشه تا سرریز بشه و وقفه بیاد. چقدر زمان میخوای؟ 10 میلی ثانیه. خب 10 میلی تقسیم بر 512 میکرو میشه 19.53 .
        کافیه که تو زیربرنامه ی تایمر، یه متغیر رو به ازای هر وقفه افزایش بدی، وقتی به 19 تا سر ریز رسید، رجیستر tmr0 رو مقدار 127 بدی تا اون 0.5 از 19 هم درست بشه.
        بعد از وقفه ی 20ام، زمان 10 میلی ثانیه ی مورد نظر شما ساخته شده.

        دیدگاه

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