اطلاعیه

Collapse
No announcement yet.

استفاده از تایمر و کانتر

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

    استفاده از تایمر و کانتر

    سلام
    اقا من دارم از timer 0 وcounter1 برا یه کاری استفاده میکنم میخوام تایمر0 1ثانیه بشماره بعد به سراغ کانتر بره و ببینه تو این 1 ثانیه چند تا پالس اومده از سنسوری که counter داره اونو میشماره برنامم اینه مشکلی داره؟

    $regfile = "m16def.dat"
    $crystal = 8000000
    Config Timer0 = Timer , Prescale = 1
    Config Timer1 = Counter , Edge = Rising
    Config Porta = Output
    Dim X As Word
    Enable Interrupts
    Enable Timer0
    Enable Ovf0
    Do
    Timer0 = 1230
    On Ovfo Count
    Loop

    End
    count:
    X = 0
    Counter1 = 0
    Do
    X = Counter1
    Return
    می شه لطفا اشکالات این برنامه رو بگید؟
    از دستور
    enable timer0
    ایراد میگیره!!!!!!!!!

    #2
    پاسخ : استفاده از تایمر و کانتر

    سلام
    لطفا برنامه رو چک کنید و جواب بدید

    دیدگاه


      #3
      پاسخ : استفاده از تایمر و کانتر

      برنامه چند تا اشکال داره.
      --چون از تایمر 0 برای مد تایمر استفاده می کنی ( تایمر 8 بیتی) ، پس نمی تونی مقدار تایمر رو با عددی بزرگتر از 256 پر کنی
      --چرا تو زیر برنامه count از do استفاده کردی؟ ( اونم بدون Loop )

      اینا فقط اشکالات مربوط به Debug کردن بود. اینا رو اصلاح کن و فرم برنامه رو به شکلی که مناسب و صحیحه تغییر بده و اون رو بذار اینجا تا در مورد نتیجه برنامه روش بحث کنیم

      دیدگاه


        #4
        پاسخ : استفاده از تایمر و کانتر

        سلام
        من میخوام با سه تا تایمر ها کار کنم با یکی 1 ثانیه بشمارم که فکر میکنم تایمر صفر مناسبه
        با یکی تعداد پالس های که ماد رو بشمارم که چون ممکنه زیاد شه از تایمر 16 بیتی صفر استفاده میکنم
        با دیگری هم پالس pwm درست کنم
        در اصل میخوام سرعت چرخش یه موتور رو با سنسور هال اندازه بگیرم و نمایش بدم
        این کلیت کار بود حالا برنامه رو میزارم شما لطف کنید ایراداتش رو بگیرید

        دیدگاه


          #5
          پاسخ : استفاده از تایمر و کانتر

          من برنامه زیر رو با کانتر 1 جواب میگیرم اما با کانتر صفر نه چرا؟
          برا کانتر 1 به پین t1 و برا کانتر 0 به پین t0 وصل میکنم
          چرا جواب نمیده؟
          $regfile = "m16def.dat"
          $crystal = 8000000
          Config Timer0 = Counter , Edge = Rising
          Config Portd = Output
          Enable Interrupts
          Enable Timer0
          Dim X As Word
          Counter0 = 0
          Do
          X = Counter0
          If X = 4 Then
          Portd = &B11111111
          End If
          Loop
          End

          دیدگاه


            #6
            پاسخ : استفاده از تایمر و کانتر

            تا اونجایی که من می دونم نباید با هم فرق داشته باشند.
            پایه T0 سالمه؟
            یه چکش بکن

            دیدگاه


              #7
              پاسخ : استفاده از تایمر و کانتر

              اگه با بیسکام کار می کنی که خیلی راحت بدون دسترسی به رجیسترها می تونی این کار رو بکنی.
              فرض کن با تایمر یک می خوای کار کنی و کلاک سیستم 8 مگا باشه.
              اگه مقدار Prescale رو 8 در نظر بگیریم ، فرکانس کاری تایمر میشه 1 مگا هرتز یا به عبارتی 1 میکرو ثانیه. پس برای تولید یک ثانیه باید یک میلیون پالس بگذره.
              اگه مقدار اولیه تایمر یک رو با 64536 پر کنی ، 1000 پالس بعد سر ریز اتفاق می افته وبرنامه به زیربرنامه وقفه میره. حالا اگه تو زیر برنامه وفقه یه متغیر تعریف کنی که هر بار زیاد بشه وقتی به 1000 برسه یک ثانیه گذشته.

              درست تونستم بیان کنم؟
              ببینید اقا حامد اولا با تشکر ممنونم که وقت گذاشتید در ثانی چرا اگه تایمر رو با 64563 پر کنیم 1000 پالس بعد وقه رخ میده؟چرا بعد از 64563 بار وقه رخ نمیده در ضمن من باید از تایمر صفر برا این کار استفاده کنم و چون اون 8 بیتی هست مشکل ایجاد میشه
              از همه این حرفها گذشته من میخوام با تایمر صفر تو حالت کانتر هم کار کنم اما نمیشه برنامه زیر رو ببینید چرا کار نمی کنه؟باید بعد از 4 بار زدن کلید led در پورت d روشن شه که نمیشه

              $regfile = "m16def.dat"
              $crystal = 8000000
              Config Timer0 = Counter , Edge = Rising
              Config Portd = Output
              Enable Interrupts
              'Enable Timer0
              Dim X As Byte
              Counter0 = 0
              Do
              X = Counter0
              If X = 4 Then
              Portd = &B11111111
              End If
              Loop
              End

              دیدگاه


                #8
                پاسخ : استفاده از تایمر و کانتر

                در مورد مقدار تایمر باید بگم که
                اولا 64563 نیست و 64536 باید باشه. حالا چرا؟
                چون از تایمر یک استفاده شده پس 16 بیتیه. یعنی دو به توان 16 پالس کلاک برای وقفه لازمه. حالا اگه مقدار اولیه رو با 64536 پر کنیم ، به ازای هر کلاک پالس یکی به مقدار تایمر اضافه میشه و بعد از هزار پالس یه سرریز اتفاق می افته. این طوری برنامه به زیر برنامه وقفه پرش می کنه.
                حالا اگه می خوای از تایمر صفر استفاده کنی و فرکانس کاری 8 مگا باشه ، اون وقت مثلا با Prescale=8 فرکانس کاری تایمر میشه 1مگا هرتز. یعنی زمان اوون میشه 1 میکرو ثانیه. پس بعد از هر 1 میکروثانیه ،یکی به مقدار تایمر اضافه میشه. پس اگه مقدار تایمر رو مثلا با 6 پر کنیم بعد از 250 پالس یه وقفه اتفاق می افته( یعنی بعد از 250 میکرو ثانیه) . حالا اگه مقدار اون متغیری که تو زیر برنامه وقفه اضافه میشه رو با 4000 مقایسه کنی ، برنامه کامل میشه ( 4000*250میکروثانیه=1ثانیه).



                در مورد برنامه باید بگم که به نظر درست میاد. البته Enable Timer0 رو فعال کن و میکرو رو دوباره چک کن.

                دیدگاه


                  #9
                  پاسخ : استفاده از تایمر و کانتر

                  سلام
                  اقا من هر کاری میکنم نمی تونم با این برنامه بالا کنتر 0 رو فعتل کنم چرا؟

                  دیدگاه

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