اطلاعیه

Collapse
No announcement yet.

ساخت کرنومتر

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

    ساخت کرنومتر

    با سلام خدمت دوستان محترم

    منم آخر از کار این تایمر در بسکام سر در نیوردم
    می خواستم یک کرنومتر با دقت مثلاً یکصدم ثانیه درست کنم لطفاً راهنماییم کنید

    فکر کنم در حد دو یا سه خط برنامه بشه البته بدون دستور گرفتن کلید استارت و استوپ.

    راهنمایی
    راهنمایی

    راستی تا حالا کسی یک کرنومتر با AVR نساخته ؟
    Time is jewel

    #2
    پاسخ : ساخت کرنومتر

    می خواهی در lcd نمایش بدهی ؟

    من اینکار را با 8051 ساختم با avr می شه با استفاده از تایمر اگر بخواهی با دقت بالا باشه باید از کریستال ساعت استفاده کنی واگر دقت زیاد بالا مطرح نباشه می تونی با مقدار دهی تایمر این زمان را ایجاد کنی

    دیدگاه


      #3
      پاسخ : ساخت کرنومتر

      برای تنظیم تاخیر تایمر از فرمول زیر استاده کنید

      Prescale * (تایمر 8 بیتی *8)(تایمر 16 بیتی * 16) * (یک تقسیم بر فرکانس میکرو)
      برای تشکر از امتیاز + استفاده کنید

      دیدگاه


        #4
        پاسخ : ساخت کرنومتر

        از دوستان بسیار سپاسگذارم

        اگر از کریستال ساعت استفاده کنم با Prescale=128 می تونم 1 ثانیه دقیق رو بدست بیارم، امــا من می خوام تایمرم هر یکصدم ثانیه به وقفه برود و یک واحد اضافه و روی LCD نمایش دهد.
        Time is jewel

        دیدگاه


          #5
          پاسخ : ساخت کرنومتر

          $regfile = "m16def.dat"
          $crystal = 8000000
          Dim Hour1 As Byte
          Dim Min1 As Byte
          Dim Sec1 As Byte
          Dim Milisec As Byte
          Config Timer1 = Timer , Compare A = Disconnect , Prescale = 8 , Clear Timer = 1
          Enable Interrupts
          Enable Timer1
          Enable Oc1a
          On Oc1a Oc1aroutine
          Timer1 = 0
          Compare1a = 1000
          Hour1 = 0 : Min1 = 0 : Sec1 = 0 : Milisec = 0
          Start Timer1

          Do

          Cls
          Lcd Hour1 ; ":" ; Min1 ; ":" ; Sec1 ; ":" ; Milisec

          Loop



          Oc1aroutine:
          Incr Milisec
          If Milisec = 100 Then
            Incr Sec1 : Milisec = 0
                If Sec1 = 60 Then
                  Incr Min1 : Sec1 = 0
                      If Min1 = 60 Then
                        Incr Hour1 : Min1 = 0
                            If Hour1 = 24 Then
                              Hour1 = 0
                            End If
                      End If
                End If
          End If

          Return

          با سیمولاتور تست کردم مشکلی نداره

          دیدگاه


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

            آقا مجید خیلی خیلی ممنونم از همکاریتون

            امــا من M16 ندارم پس برنامه رو یکم تغییر دادم برای M8 و جواب نمیده !
            روی LCD تنها فقط اینو نمایش میده : Time: 0:0:1

            برنامه رو ببینید مشکل کجاست ؟

            مگه مشکل داره با کریستال داخلی 1000000 میکرو M8 کار کنم ؟

            $regfile = "M8def.dat"
            $crystal = 1000000

            Config Lcdpin = Pin , Db4 = Pind.0 , Db5 = Pind.1 , Db6 = Pind.2 , _
            Db7 = Pind.3 , Rs = Pind.4 , E = Pind.5
            Config Lcd = 16 * 2

            Dim Ps As Byte , S As Byte , M As Byte
            Ps = 0 : S = 0 : M = 0

            Cursor Off
            Cls

            Config Timer2 = Timer , Compare A = Disconnect , Prescale = 1 , Clear Timer = 1
            Enable Interrupts
            Enable Timer2
            Enable Ovf2
            On Ovf2 Corno
            Timer2 = 0
            Compare1a = 1000
            Start Timer2

            Do
            Home
            Lcd "Time: " ; M ; ":" ; S ; ":" ; Ps
            Loop
            End 'end program

            Corno:
            Incr Ps
            If Ps = 100 Then
            Ps = 0
            Incr S
            If S = 60 Then
            S = 0
            Incr M
            If M = 20 Then
            M = 0 : S = 0 : Ps = 0
            End If
            End If
            End If
            Return
            Time is jewel

            دیدگاه


              #7
              پاسخ : ساخت کرنومتر

              دوست عزیز

              1-اگر از تایمر 2 میخواهید استفاده کنید پس چرا compare1a را مقدار دهی میکنید؟
              2- با خیال راحت از mega8 و اسیلاتور 1MHz استفاده کنید
              3- در برنامه ای که شما نوشته اید هر 256 میکرو ثانیه یک وقفه اتفاق می افتد . برای اصلاح آن timer2=6 قرار دهید و پس از هر اینتراپت باید دوباره این کار را بکنید .( که باعث خطا هم میشود مگر اینکه محاسبه خطا را کرده باشید) . شما بهتر است از مود compare تایمر استفاده کنید که auto reload هم هست(مثل برنامه ای که براتون نوشتم )

              4- یک cls قبل از lcd بگذارید .

              5-
              If M =60 Then
              M = 0 : S = 0 : Ps = 0
              6- ببینید این برنامه چطوره ؟

              $regfile = "M8def.dat"
              $crystal = 1000000

              Config Lcdpin = Pin , Db4 = Pind.0 , Db5 = Pind.1 , Db6 = Pind.2 , _
              Db7 = Pind.3 , Rs = Pind.4 , E = Pind.5
              Config Lcd = 16 * 2

              Dim Ps As Byte , S As Byte , M As Byte , Gb As Byte
              Ps = 0 : S = 0 : M = 0 : Gb = 0

              Cursor Off
              Cls

              Config Timer2 = Timer , Compare = Disconnect , Prescale = 1 , Clear Timer = 1
              Enable Interrupts
              Enable Timer2
              Enable Oc2
              On Oc2 Corno
              Timer2 = 0
              Ocr2 = 250
              Start Timer2

              Do
              Cls
              Lcd "Time: " ; M ; ":" ; S ; ":" ; Ps
              Loop

              Corno:
              Incr Gb
              If Gb = 4 Then
              Gb = 0
              Incr Ps
              If Ps = 100 Then
              Ps = 0
              Incr S
              If S = 60 Then
              S = 0
              Incr M
              If M = 60 Then
              M = 0 : S = 0 : Ps = 0
              End If
              End If
              End If
              End If
              Return


              دیدگاه


                #8
                پاسخ : ساخت کرنومتر

                دست گل آقا مجید درد نکنه :job:

                آقا مجید کاملاً جواب داد فقط این Gb=4 رو فکر کنم برای تقریب یکصدم ثانیه باید بشه 40 تا اینکه 250*40 = 1000 میلی ثانیه. به هر حال خیلی خیلی ممنونم از مهندس مجید.

                فقط آقا مجید راجع به چند تا خط برنامه یکم برام توضیح بدید :
                1- enable Oc2 ( :redface: !!! من بجای Oc2 گذاشتم Ovf2 امــا برنامه دیگه جواب نداد.!!!)

                2- Ocr2=250 ( :redface:!!! من هر عددی رو به جای 250 گذاشتم جواب نداد اگه ممکنه راجع به این دستور بیشتر توضیح بدید، آخه من این دستور رو اولین بار که می بینم.!!!)

                راستی می تونم همین برنامه رو دقیقاً تو بسکام 8051 بنویسم و نتیجه رو روی میکروی AT89S51 ببینم ؟
                راستی STK200/300 تو محیط بسکام 8051 جواب میده ؟



                Time is jewel

                دیدگاه


                  #9
                  پاسخ : ساخت کرنومتر

                  خواهش میکنم ...

                  خوشحالم که جواب گرفتید.کاملا درسته GB=40 برای اینکه هر 10 میلی ثانیه یک واحد به صدم اضافه بشه

                  1- یعنی compare مربوط به تایمر 2 را فعال کن. وقتی ovf2 را فعال میکنید بعد از هر overflow ( که برای تایمر های 8 بیتی مثل تایمر2 برابر 256 (0 تا 255) است) برنامه به روتین وقفه پرش میکند .
                  2- ocr2 مقدار compare تایمر2 است . یعنی هر وقت تایمر به ocr2=250 رسید به روتین compare 1پرش کن
                  عدد های بین 0 تا 255 را هم قبول میکند . احتمالا عدد شما بیشتر از 255 بوده است

                  3- برای 89s51 باید از مود auto reload و وقفه سرریز (overflow) استفاده کنید بنا بر این برنامه حتما نیاز به بازنویسی خواهد داشت

                  چون 89s51 در مود spi پروگرام میشود احنمالا stk200/300 میتواند آنرا پروگرام کند .

                  موفق و پیروز باشید

                  دیدگاه

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