اطلاعیه

Collapse
No announcement yet.

مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

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

    مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

    با سلام
    یه سوال:وقتی کریستال 8000000 و prescale=1024 باشه .مگه فرکانس تایمر نمیشه 7.8125 یا به عبارتی
    مدت زمان شمارش هر پالس میشه 000125. ثانیه؟حالا چطور برای تولید یه ثانیه باید در وقفه شرط گذاشت؟تو یه برنامه در زیر برنامه وقفه تایمر نوشته بود:
    incr a
    if a>30 then
    incr s
    lمیخوام بدونم 30 از کجا اومده؟؟؟؟ :angry:
    فوق کل ذی علم علیم
    مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

    #2
    پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

    هر تایمر دو تا فاکتور تقسیم داره. یکی همون 1024 تایی هست که کلاک اصلی بهش تقسیم میشه تا کلاک کاری تایمر رو مشخص کنه و دیگری مقدار خود تایمر هست که یکی یکی اضافه میشه تا به مقدار سرریز برسه و وقفه رو فعال کنه. احتمالا شما یک تایمر 8 بیتی با مقدار TCNT مساوی با صفر رو جا انداختی که باید با همون فرکانس 7812.5 به اندازه 255 تا جابجا بشه تا وقفه تولید کنه. یعنی در اصل وقفه شما هر 255 / 7812.5 پالس اجرا میشه که میشه همون حدود 30 یا دقیق تر 30.637254901960784313725490196078. این 30 از اینجا میاد.

    دیدگاه


      #3
      پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

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

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

      دیدگاه


        #4
        پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

        بیین عزیز من. تایمر قراره در ساده ترین حالتش بعد از یک میزان زمان مشخص یک وقفه بده. اول کار برای مشخص کردن این زمان بایستی سرعت گذر زمان تعیین بشه. برای اینکار میاییم به عنوان مثال کلاک سیستم رو میگیریم و تقسیم به عددی میکنیم تا یک سرعت گذر زمان بسازیم. اینجا شما اومدی 8000000 رو تقسیم بر 1024 کردی تا سرعتی برابر با 8000000/1024 یا 7812.5 سیکل در ثانیه رو بسازی.
        حالا سئوال اینجاست که با این سرعت پس از طی چه مدت زمانیی باید وقفه فعال بشه؟ شما میایی این مقدار رو به صورت فاصله از مقدار 1 بایتی 255 میسازی. مثلا اگه قرار باشه بعد از 125 سیکل با سرعت فوق (7812.5) عمل ایجاد وقفه اتفاق بیفته باید مقدار 125-255 رو یعنی 130 رو در رجیستر شمارنده تایمر که بهش میگیم TCNT قرار بدی. از این لحظه به بعد تایمر با سرعت 7812.5 سیکل در ثانیه یکی یکی به این مقدار اضافه میکنه تا به مقدار 255 برسه. در این لحظه وقفه تایمر فعال میشه.
        حالا در موردی که شما قید کردی مثل این هست که بخوای بعد از 255 پالس زمانی 7812.5 هرتزی وقفه تایمر صدا زده بشه. پس چه مقداری رو توی TCNT میذاری؟ مسلما 255-255 یعنی صفر رو.
        اگر این کار به صورت پریودیک انجام بشه پس از تقریبا 30 بار صدا زدن وقفه تایمر کل 7650 پالس (با کمی خطا همون 7812.5 میتونه در نظر گرفته بشه) میگذره. که دقیقا میشه حول و حوش یک ثانیه. با 2 درصد خطا.

        البته این مقدار 255 برای تایمر 8 بیتی در نظر گرفته میشه ولی شما میتونی همین کار رو با دقتی بالاتر با یک تایمر 16 بیتی انجام بدی که مقدار عددی که باید در TCNT قرار بگیره میشه 7812-65535 یا 57723 و با میزان خطای 0.006 درصد.

        دیدگاه


          #5
          پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

          ممنون مهندس
          بی جهت همکار علمی نشدی
          ایشالا ستاره هات زیاد شن
          فوق کل ذی علم علیم
          مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

          دیدگاه


            #6
            پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

            ببخشید مطالب خوبتون به لحاظ تئوری قابل قبوله اما در عمل جواب نمیده من با تایمر صفر با کریستال 4000000 که به عبارتی مدت هر پالس 016. ثانیه میشه timer0=256-16=240 گذاشتم تا در هر سرریز یه ثانیه بده اما این اتفاق نیفتاد و خیلی سریع رد میشه تا اینکه مجبور شدم قرار بدم:
            incr a
            if a>15 then
            incr s
            و خیلی بی دلیل برنامه خوب جواب داد به نظرتون اشکال از پروتیوسه؟
            فوق کل ذی علم علیم
            مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

            دیدگاه


              #7
              پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

              نوشته اصلی توسط reza_agha
              بیین عزیز من. تایمر قراره در ساده ترین حالتش بعد از یک میزان زمان مشخص یک وقفه بده. اول کار برای مشخص کردن این زمان بایستی سرعت گذر زمان تعیین بشه. برای اینکار میاییم به عنوان مثال کلاک سیستم رو میگیریم و تقسیم به عددی میکنیم تا یک سرعت گذر زمان بسازیم. اینجا شما اومدی 8000000 رو تقسیم بر 1024 کردی تا سرعتی برابر با 8000000/1024 یا 7812.5 سیکل در ثانیه رو بسازی.
              حالا سئوال اینجاست که با این سرعت پس از طی چه مدت زمانیی باید وقفه فعال بشه؟ شما میایی این مقدار رو به صورت فاصله از مقدار 1 بایتی 255 میسازی. مثلا اگه قرار باشه بعد از 125 سیکل با سرعت فوق (7812.5) عمل ایجاد وقفه اتفاق بیفته باید مقدار 125-255 رو یعنی 130 رو در رجیستر شمارنده تایمر که بهش میگیم TCNT قرار بدی. از این لحظه به بعد تایمر با سرعت 7812.5 سیکل در ثانیه یکی یکی به این مقدار اضافه میکنه تا به مقدار 255 برسه. در این لحظه وقفه تایمر فعال میشه.
              حالا در موردی که شما قید کردی مثل این هست که بخوای بعد از 255 پالس زمانی 7812.5 هرتزی وقفه تایمر صدا زده بشه. پس چه مقداری رو توی TCNT میذاری؟ مسلما 255-255 یعنی صفر رو.
              اگر این کار به صورت پریودیک انجام بشه پس از تقریبا 30 بار صدا زدن وقفه تایمر کل 7650 پالس (با کمی خطا همون 7812.5 میتونه در نظر گرفته بشه) میگذره. که دقیقا میشه حول و حوش یک ثانیه. با 2 درصد خطا.

              البته این مقدار 255 برای تایمر 8 بیتی در نظر گرفته میشه ولی شما میتونی همین کار رو با دقتی بالاتر با یک تایمر 16 بیتی انجام بدی که مقدار عددی که باید در TCNT قرار بگیره میشه 7812-65535 یا 57723 و با میزان خطای 0.006 درصد.
              ببخشید مطالب خوبتون به لحاظ تئوری قابل قبوله اما در عمل جواب نمیده من با تایمر صفر با کریستال 4000000 که به عبارتی مدت هر پالس 016. ثانیه میشه timer0=256-16=240 گذاشتم تا در هر سرریز یه ثانیه بده اما این اتفاق نیفتاد و خیلی سریع رد میشه تا اینکه مجبور شدم قرار بدم:
              incr a
              if a>15 then
              incr s
              و خیلی بی دلیل برنامه خوب جواب داد به نظرتون اشکال از پروتیوسه؟
              فوق کل ذی علم علیم
              مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

              دیدگاه


                #8
                پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                برای تایمرهای 8 بیتی:
                Δt = (256 – X0 )*( Prescale/Fosc)
                برای تایمرهای 16بیتی:
                Δt = (65536 – X0 )*( Prescale/Fosc)
                X0 : مقدار اولیه ی تایمر هست

                برای مثال برای تولید زمان یک ثانیه ، خوب ما برای ایجاد این زمان احتیاج به یک زمان پایه داریم
                تا با تکرار اون بتونیم به زمان مورد نظر برسییم
                خوب اول برای تایمر 8 بیتی مثل تایمر صفر
                فرض کنیم که :
                1- fosc = 8000000
                2- prescal = 8
                خوب اگه دقت کنید ما با این مقادیر حداکثر زمانی که می تونیم داشته باشیم تا یک وقفه سریز تایمر و در
                پی آن تغییری در یک متغیر ، 256 میکرو ثانیه هست
                بدین ترتیب اگه بخواهیم یک زمان پایه مثلا به مقدار 200 میکرو ثانیه داشته باشیم طبق فرمول مقدار اولیه تایمر
                رو 56 قرار می دهیم و هر با که سر ریز رخ داد مقدار اولیه تایمر رو دوباره باید برابر 56 قرار دهید چرا که با هر بار سریز تایمر مقدار اون صفر خواهد شد ، در ضمن تایمر رو در وقفه خاموش هم نکنید و اولین دستور درون وقفه باید همین مقدار اولیه که برابر 56 هست باشه
                خوب ما زمان 200 میکرو ثانیه رو حساب کردیم حالا میگیم که هر 1 ثانیه برابر است با 5000 تا 200 میکرو ثانیه
                خوب شما می تونید یک متغیر از نوع word رو تعریف کنید و اون رو داخل سریز هر بار 1 واحد افزایش دهید
                به این ترتیب با رسیدن اون متغیر به 5000 شما به زمان 1 ثانیه خواهید رسید

                به همین ترتیب شما می تونید این کار رو با تایمر 1 انجام دهید
                $regfile = "m8def.dat"
                $crystal = 8000000
                Config Lcd = 16 * 2
                Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , _
                Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
                Dim I As Word , Saneye As Byte
                Config Timer0 = Timer , Prescale = 8
                Enable Interrupts
                Enable Timer0
                On Timer0 L1
                Stop Timer0
                Timer0 = 56
                Start Timer0
                Cls
                Do
                Locate 1 , 1
                Lcd Saneye
                Loop
                End
                L1:
                Timer0 = 56
                Incr I
                If I = 5000 Then
                I = 0
                Incr Saneye
                End If
                Return

                دیدگاه


                  #9
                  پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                  کلاک 4 مگا هرتزی تقسیم بر 1024 میشه پالس های زمانی 256 میکرو ثانیه ای. بنا براین مقدار اولیه 16-256 برابر میشه با 256 ضربدر 16 که میشه 4096 میکرو ثانیه یا همون 4 میلی ثانیه خودمون. اگر میخوایین باید مقدار رجیستر مقداری برابر با 0 داشته باشه تا تیک های زمانی 65280 میکرو ثانیه ای تولید بشه. و اینجوری هم باید حداقل 15 بار بشمرین تا بشه یک ثانیه.

                  به فازها خوب توجه کنین:
                  1- کلاک اصلی (اینجا 4000000) هرتز تقسیم بر prescale اینجا مثلا همون 1024 خودتون.
                  2- حاصل عبارت فوق (که میشه 256 میکرو ثانیه یکبار) رو برای تایمر 8 بیتی یک فاز تقسیم زمانی دیگه میدیم مثلا 255 که زمان وقفه منتج از این میشه: 255 * 256 میکرو ثانیه یا 65280 میکرو ثانیه.
                  3- این زمان 65280 میکروثانیه زمان بین دو بار وقفه متوالی هست. حالا یک ثانیه یا همون 1000000 میکرو ثانیه میشه چند بار؟ 15.3

                  اگر 15 بگیریم میشه دقیقا 979200 میکرو ثانیه. یا همون یک ثانیه با میزان خطای 2.08 درصد.

                  یه کمی گیج کننده هست. ولی همینجوری یه کمی حلاجی کنین مطمئنم که میگیرین.
                  کلاک اصلی تقسیم بر prescale تا کلاک کاری پایه تایمر ساخته بشه. این کلاک رو با مشخص کردن تعداد شمارشش (تقسیم کننده دوم) برای تولید وقفه استفاده میکنیم. از متغیری که در روال وقفه اضافه میکنیم برای ساختن زمانهای طولانی تر استفاده میکنیم.

                  دیدگاه


                    #10
                    پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                    از دوستان عزیز خصوصا آقا مجتبی گل و آقا رضا یا رضا آقا ممنون آقا رضا جان من prescal رو 256 گرفته بودم نه 1024اما نکته ای که آقا مجتبی هم گفته بودند رو انجام دادم باز نشد که مقدار اولیه تایمر رو تو زیر برنامه وقفه لحاظ کنم
                    اینم کل برنامه:
                    $regfile = "m16def.dat"
                    $crystal = 4000000
                    Config Lcd = 16 * 2
                    Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , _
                    Db4 = Portc.4 , E = Portc.3 , Rs = Portc.2
                    Config Timer0 = Timer , Prescale = 256
                    Dim H As Byte
                    Dim M As Byte
                    Dim S As Byte
                    Dim A As Byte
                    Enable Interrupts
                    Enable Timer0
                    Enable Ovf0
                    H = 0 : A = 0 : M = 0 : S = 0
                    Timer0 = 240
                    On Ovf0 Clock
                    Stop Timer0
                    Start Timer0
                    Cursor Off
                    Cls
                    Do
                    Locate 1 , 1
                    Lcd "h" ; " " ; "m" ; " " ; "s"
                    Locate 2 , 1
                    Lcd H ; " " ; M ; " " ; S
                    Loop
                    End
                    Clock:
                    Timer0 = 240
                    Incr S
                    If S > 59 Then
                    Incr M
                    S = 0
                    End If
                    If A > 59 Then
                    Incr H
                    M = 0
                    End If
                    Return
                    البته همونطور که گفتم اگه زیر برنامه رو اینطور بنویسم جواب میده که نمیدونم چرا:
                    Clock:
                    Timer0 = 240
                    incr a
                    if a>15 then
                    Incr S
                    a=0
                    endif
                    If S > 59 Then
                    Incr M
                    S = 0
                    End If
                    If A > 59 Then
                    Incr H
                    M = 0
                    End If
                    Return
                    فوق کل ذی علم علیم
                    مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

                    دیدگاه


                      #11
                      پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                      با سلام
                      اولا خودت گلی
                      ثانیا با اجازه آقا رضا
                      ثالثا حتما این رو می دونید که در زبان بیسیک بین حروف بزرگ و کوچیک تفاوتی وجود نداره!
                      خوب دوست عزیز امن جور که من توی زیربرنامه های وقفه برنامه شما دیدم شما دارید
                      در زیر برنامه اول: تقریبا هر 1میلی ثانیه ( نه هر 1 ثانیه ) مقدار s رو یک واحد افزایش میدید و بعد از اینکه به 60 رسید M رو یک واحد افزایش می دهید و S رو صفر میکنید و پس از اینکه A به 60 رسید H رو یک واحد افزایش میدید و M رو هم صفر می کنید اما هیچ وقت این اتفاق نمی افته چونکه A همیشه مقدارش صفر هست و هیچ وقت زیاد نمیشه که به 60 برسه و لذا مقدار M همین جور زیاد میشه تا به حداکثر مقدارش یعنی 255 برسه و دوباره صفر شده و...
                      در زیر برنامه دوم : تقریبا هر 1میلی ثانیه ( نه هر 1 ثانیه ) مقدار A(کوچک) رو یک واحد افزایش میدید و بعد از اینکه به 16 رسید( چرا؟) S رو یک واحد افزایش می دهید و A(کوچک) رو صفر میکنید و پس از اینکه S به 60 رسید M رو یک واحد افزایش میدید و S رو هم صفر می کنید و در آخر هم نوشتید که اگر A (بزرگ) به 60 برسه H واحد زیاد و M رو صفر کن که این دو دستور هیچ وقت اتفاق نمی افتند چون که در بالا نوشته شده بود که هر وقت A به 16 رسید A صفر بشه ؛ و اینکه میگید جواب داده درسته اما فقط برای S در مورد M دوباره همون قضیه بالا پیش میاد و H همواره صفر خواهد ماند

                      دیدگاه


                        #12
                        پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                        با سلام ممنون مجتبی جان تو قسمتی از برنامه سوتی داده شده (چون کپی پیست کرده بودم )در واقع برای افزایش h باید M یک واحد افزایش یابد نه Aاما منظورتونو برای عدم تفاوت حروف کوچیک و بزرگ متوجه نشدم.همچنین اینکه چرا برای رسیدن به یه ثانیه12 گذاشتم رو نمیدونم در واقع چون سرعتش زیاد بود سعی و خطا کردم.
                        آقا مصطفی گل (بابا بخدا گل بد نیست!!!) فکر کنم تا موفقیت راهی نمونده تا مشکلم اینه که خوب توضیح بدین چرا و چطوری سررسز در یه میلی ثانیه رخ میده نه 1 ثانیه؟؟؟ ممنون
                        فوق کل ذی علم علیم
                        مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

                        دیدگاه


                          #13
                          پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                          1_هر گاه عدد درون تایمر از 255 به 0 برسد یک وقفه اتفاق می افتد
                          2_اگر عدد256 را منهای عدد درون تایمر کرده ودر زمان پالس های اعمالی به تایمر ضرب کنید زمان هر سرریز بدست می آید.
                          مٍثال
                          clock micro 8000000
                          precaler=8
                          TCNT0=5
                          تایمر به ازای هر 250 میکرو ثانیه سرریز می شود
                          **/nsm\**

                          دیدگاه


                            #14
                            پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                            نوشته اصلی توسط khandani
                            منظورتونو برای عدم تفاوت حروف کوچیک و بزرگ متوجه نشدم.همچنین اینکه چرا برای رسیدن به یه ثانیه12 گذاشتم رو نمیدونم در واقع چون سرعتش زیاد بود سعی و خطا کردم.
                            منظورم اینه که در bascom نرم افزار بین حروف بزرگ و کوچک فرق نمیزاره یعنی هر متغیر چه با حروف بزرگ و چه با حروف کوچک نوشته شود نرم افزار آن را یک متغیر به حساب می آورد برعکس زبان c اگر شما یک متغیر را یک بار با حروف کوچک تعریف کنید و یک بار دیگر با حروف بزرگ نرم افزار این بار دو متغیر رو لود (کلمه دیگه ای به ذهنم نرسید) میکند واین دومتغیر رو از هم منفک می دونه اما در bascom همانطور که گفتم این دو یک متغیر به حساب می آیند
                            و اما این 12 از کجا امد تو برنامه که 16 بود
                            نوشته اصلی توسط khandani
                            آقا مصطفی گل (بابا بخدا گل بد نیست!!!) فکر کنم تا موفقیت راهی نمونده تا مشکلم اینه که خوب توضیح بدین چرا و چطوری سررسز در یه میلی ثانیه رخ میده نه 1 ثانیه؟؟؟ ممنون
                            اولا مصطفی مون سربازی (براش دعا کنید با مدرک دیپلم افتاده یگان ویژه )
                            ثانیا اگر اون چیزی رو که من در مورد تایمر - به همراه مثالی که زدم - در تایپیک بالا گفتم رو دقیق خونده باشی
                            حتما متوجه خواهی شد که چرا سریز در 1 میلی ثانیه رخ می ده
                            موفق باشید

                            دیدگاه


                              #15
                              پاسخ : مشکل در تولید یک ثانیه با میکرو(محاسبات فرکانس)

                              واااای امروز چقدر سوتی میدم: :wow:
                              اولا ایشالا که آقا مصطفی هرجا هست موفق وسرزنده و پیروز باشه که داداش گلی مث مجتبی داره اشکالم در سوتی آخرم در کار با ماشین حساب بود
                              به نظرت باید بیشتر مطالعه کنم یا استراحت؟!!!!!!! :rolleyes:
                              فوق کل ذی علم علیم
                              مهندسین هیچ گاه به بن بست نمیرسند یا راهی پیدا می کنند یا راهی میسازند

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

                              دیدگاه

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