اطلاعیه

Collapse
No announcement yet.

تشخیص مدت زمان در بسکام

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

    تشخیص مدت زمان در بسکام

    سلام یه سوالی دارم
    چطور در بسکام مدت زمان را با تایمر تشخیص بدیم؟؟
    یعنی مثلا میخوایم به مدت 0.5 ثانیه با adc نمونه گیری کنیم . حلقه do-loop رو برای این نمونه برداری مینویسیم حالا چطور باید تشخیص بدیم کی 0.5 ثانیه شده که از حلقه بیرون بیایم ؟؟
    میشه یه نمونه برنامه که بتونه 0.5 ثانیه را تشخیص بده با تایمر بنویسید؟؟؟
    با تشکر

    #2
    پاسخ : تشخیص مدت زمان در بسکام

    کد:
    $regfile = "m32def.dat"
    $crystal = 8000000
    Config Timer1 = Timer , Prescale = 256
    Enable Timer1
    Enable Interrupts
    On Timer1 Timer1_isr
    timer1=49911
    Dim A As Byte
    A = 0
    
    
    Do                             'halghe marboot be nemoone bardari ADC
    
    Loop Until A = 1
    
    
    Do : Loop                          'edamei barname
    
    
    
    End
    
    
    Timer1_isr:
    Timer1 = 49911
    A = 1
    Return
    من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
    آلبرت اینشتین
    منبع: http://fa.wikiquote.org

    دیدگاه


      #3
      پاسخ : تشخیص مدت زمان در بسکام

      نوشته اصلی توسط m.riahi
      سلام یه سوالی دارم
      چطور در بسکام مدت زمان را با تایمر تشخیص بدیم؟؟
      یعنی مثلا میخوایم به مدت 0.5 ثانیه با adc نمونه گیری کنیم . حلقه do-loop رو برای این نمونه برداری مینویسیم حالا چطور باید تشخیص بدیم کی 0.5 ثانیه شده که از حلقه بیرون بیایم ؟؟
      میشه یه نمونه برنامه که بتونه 0.5 ثانیه را تشخیص بده با تایمر بنویسید؟؟؟
      با تشکر
      سلام
      برای بدست اوردن زمان سر ریز شدن تایمر
      فرض کنیم که زمانی که ما لازم داریم تا تایمر سر ریز بشه 0.5 ثانیه باشه
      تایمر های یک و سه در کلیه میکروکنترلر های avr یک تایمر 16 بیتی هستش یعنی از 1 تا 65535 تا می تونه بشماره
      این کد تنظیم تایمر در بسکام هستش
      [code=text]Config Timer1 = Timer , Prescale =1[/code]
      ابتدا از Prescale =1 شروع می کنیم
      عدد Prescale رو تقسیم بر فرکانس کاری میکرو می کنیم فرض کنیم فرکانس کاری میکرو 8000000 هرتز باشه
      1تقسیم بر 8مگا هرتز برابر میشه با 1.25ضربدر ده به توان منفی 7 یعنی 125 نانو ثانیه
      بعد گفتیم که تایمرمون 16 بیتی هستش بنابراین زمانی که بدست آوردم به عدد 65535 ضرب می کنیم تا کل زمانی که تایمر می تونه بشماره بدست بیاد
      پس 125 نانو ضربدر 65535 برابر میشه باتقریبا 8.1918 میلی ثانیه ولی خوب می بینیم که کمتر از زمان 0.5 ثانیه هست پس Prescale رو افزایش می دیم میکنیم 8
      بازم مراحل قبل رو طی می کنیم و مدت زمانی که تایمر با این عدد می تونه بشماره برابر میشه با 0.065535 ثانیه یا 65.53 میلی ثانیه اینم جوابگو نبود دوباره افزایش میدیم البته اعداد زیر مجاز هستند اگه عدد دیگه قرار بدی ارور میگیره
      1 و 8 و 64 و 256 و 1024
      اینبار 64 رو امتحان می کنیم 64 تقسیم بر فرکانس کاری میکرو برابر میشه با 8 میکرو ثانیه
      8 میکرو رو در 65535 ضرب می کنیم مقدار زمانی که تایمر یک با عدد 64 می تونه بشماره میشه 0.52428 ثانیه یا 524.28 میلی ثانیه
      خوب پس می تونیم Prescale رو رو عدد 64 بزاریم بمونه خوب حال چطوری برای نیم ثانیه محاسبه کنیم که سر ریز بشه
      بالا که زمان 8 میکرو ثانیه رو بدست اوردیم اینجا لازم داریم پس مدت زمانی که می خوایم تایمر سر ریز بشه تقسیم بر 8 میکرو ثانیه می کنیم یعنی 0.5 ثانیه تقسیم بر 8 میکرو ثانیه که برابر میشه با 62500 یعنی تایمر که استارت می کنه به شمارش به محض رسیدن به 62500 ، نیم ثانیه دقیقا تکمیل میشه نه کمتر نه بیشتر ولی خوب یه مشکلی هست؟!!! تایمر ها وقتی که شمارش رو کامل می کنند و به عدد صفر که می رسند سر ریز می شند نه 62500 تا
      یعنی غیر عدد صفر سر ریز انجام نمیشه تایمر ما 16 بیتی هستش و بعد از عدد 65535 تایمر میره 0 میشه و سرریز میشه پس تنها کاری که می کنیم اینه عدد 62500 رو از عدد 65535 کم می کنیم که میشه 3035 حال ما تایمر رو در همه حال برابر با 3035 قرار می دیم یعنی وقتی استارت میکنه از این عدد شروع به شمارش میکنه و پس از شمارش کامل و صفر شدن ، تایمر سر ریز شده و به لیبل پرش می کند اونجا هم تایمر رو برابر با 3035 قرار می دیم که باز از این شماره شروع به شمارش کنه و کم و کاستی در زمان به وجود نیاد
      می تونی به جای 64 از 256 و ... استفاده کنی ولی دقت میاد پایین
      می تونی فرکانس کاری میکرو رو یک مگاهرتز قرار بدی و دوباره از اول محاسبه کنی می تونی از تایمر 0 و 2 که 8 بیتی هستند استفاده کنی که از 0 تا 255 می تونه بشماره و بعد اون تایمر سرریز میشه برای مثال اگه زمان ما 8 میکرو ثانیه هست 8 میکرو ضربدر 255 که برابر میشه با 31.37 نانو ثانیه که باید از یک پرسکیل بزرگتر برای بدست آوردن زمانتون استفاده کنید که در نهایت دقتش پایینه بنابراین دقت بالا نیاز به استفاده از تایمر های 16 بیتی و 32 بیتی داره
      برد جوجه کشی:
      مطالعه پست 1 (حتما مطالعه کنید)


      مطالعه پست 2 (برای مطلع شدن از تغییرات برنامه مطالعه کنید)

      دانلود

      توجه:
      این برد نیمه صنعتی و خانگی هست...
      برای صنعتی شدن حتما برد مخصوص خودتون رو بزنید...

      آی دی کانال تلگرامی مربوط به برد جوجه کشی : electr0o0nic@

      دیدگاه


        #4
        پاسخ : تشخیص مدت زمان در بسکام

        نوشته اصلی توسط mohammad...
        سلام
        برای بدست اوردن زمان سر ریز شدن تایمر
        فرض کنیم که زمانی که ما لازم داریم تا تایمر سر ریز بشه 0.5 ثانیه باشه
        تایمر های یک و سه در کلیه میکروکنترلر های avr یک تایمر 16 بیتی هستش یعنی از 1 تا 65535 تا می تونه بشماره
        این کد تنظیم تایمر در بسکام هستش
        [code=text]Config Timer1 = Timer , Prescale =1[/code]
        ابتدا از Prescale =1 شروع می کنیم
        عدد Prescale رو تقسیم بر فرکانس کاری میکرو می کنیم فرض کنیم فرکانس کاری میکرو 8000000 هرتز باشه
        1تقسیم بر 8مگا هرتز برابر میشه با 1.25ضربدر ده به توان منفی 7 یعنی 125 نانو ثانیه
        بعد گفتیم که تایمرمون 16 بیتی هستش بنابراین زمانی که بدست آوردم به عدد 65535 ضرب می کنیم تا کل زمانی که تایمر می تونه بشماره بدست بیاد
        پس 125 نانو ضربدر 65535 برابر میشه باتقریبا 8.1918 میلی ثانیه ولی خوب می بینیم که کمتر از زمان 0.5 ثانیه هست پس Prescale رو افزایش می دیم میکنیم 8
        بازم مراحل قبل رو طی می کنیم و مدت زمانی که تایمر با این عدد می تونه بشماره برابر میشه با 0.065535 ثانیه یا 65.53 میلی ثانیه اینم جوابگو نبود دوباره افزایش میدیم البته اعداد زیر مجاز هستند اگه عدد دیگه قرار بدی ارور میگیره
        1 و 8 و 64 و 256 و 1024
        اینبار 64 رو امتحان می کنیم 64 تقسیم بر فرکانس کاری میکرو برابر میشه با 8 میکرو ثانیه
        8 میکرو رو در 65535 ضرب می کنیم مقدار زمانی که تایمر یک با عدد 64 می تونه بشماره میشه 0.52428 ثانیه یا 524.28 میلی ثانیه
        خوب پس می تونیم Prescale رو رو عدد 64 بزاریم بمونه خوب حال چطوری برای نیم ثانیه محاسبه کنیم که سر ریز بشه
        بالا که زمان 8 میکرو ثانیه رو بدست اوردیم اینجا لازم داریم پس مدت زمانی که می خوایم تایمر سر ریز بشه تقسیم بر 8 میکرو ثانیه می کنیم یعنی 0.5 ثانیه تقسیم بر 8 میکرو ثانیه که برابر میشه با 62500 یعنی تایمر که استارت می کنه به شمارش به محض رسیدن به 62500 ، نیم ثانیه دقیقا تکمیل میشه نه کمتر نه بیشتر ولی خوب یه مشکلی هست؟!!! تایمر ها وقتی که شمارش رو کامل می کنند و به عدد صفر که می رسند سر ریز می شند نه 62500 تا
        یعنی غیر عدد صفر سر ریز انجام نمیشه تایمر ما 16 بیتی هستش و بعد از عدد 65535 تایمر میره 0 میشه و سرریز میشه پس تنها کاری که می کنیم اینه عدد 62500 رو از عدد 65535 کم می کنیم که میشه 3035 حال ما تایمر رو در همه حال برابر با 3035 قرار می دیم یعنی وقتی استارت میکنه از این عدد شروع به شمارش میکنه و پس از شمارش کامل و صفر شدن ، تایمر سر ریز شده و به لیبل پرش می کند اونجا هم تایمر رو برابر با 3035 قرار می دیم که باز از این شماره شروع به شمارش کنه و کم و کاستی در زمان به وجود نیاد
        می تونی به جای 64 از 256 و ... استفاده کنی ولی دقت میاد پایین
        می تونی فرکانس کاری میکرو رو یک مگاهرتز قرار بدی و دوباره از اول محاسبه کنی می تونی از تایمر 0 و 2 که 8 بیتی هستند استفاده کنی که از 0 تا 255 می تونه بشماره و بعد اون تایمر سرریز میشه برای مثال اگه زمان ما 8 میکرو ثانیه هست 8 میکرو ضربدر 255 که برابر میشه با 31.37 نانو ثانیه که باید از یک پرسکیل بزرگتر برای بدست آوردن زمانتون استفاده کنید که در نهایت دقتش پایینه بنابراین دقت بالا نیاز به استفاده از تایمر های 16 بیتی و 32 بیتی داره
        اقا دمت گرم حال دادی خیلی وقته دنبال این اطلاعات دقیق بودم

        ولی یک سوال برای زمان های کم این روش جواب میده ولی اگه ما بخوایم زمان دقیق مثلا 10 یا 100 ثانیه رو اندازه بگیریم چه اشکالی داره بذاریم تایمر چند بار سرریز بشه و با تعداد سر ریز شدنا تایم رو اندازه بگیریم؟یعنی دیگه نیایم حساب کتاب کنیم که تایم سرریز شدن از زمان مورد نیاز ما بیشتر باشه اگه کمتر هم بود تعداد سر ریز شدن ها رو ملاک قرار بدیم

        دیدگاه


          #5
          پاسخ : تشخیص مدت زمان در بسکام

          نوشته اصلی توسط saeedxs
          اقا دمت گرم حال دادی خیلی وقته دنبال این اطلاعات دقیق بودم

          ولی یک سوال برای زمان های کم این روش جواب میده ولی اگه ما بخوایم زمان دقیق مثلا 10 یا 100 ثانیه رو اندازه بگیریم چه اشکالی داره بذاریم تایمر چند بار سرریز بشه و با تعداد سر ریز شدنا تایم رو اندازه بگیریم؟یعنی دیگه نیایم حساب کتاب کنیم که تایم سرریز شدن از زمان مورد نیاز ما بیشتر باشه اگه کمتر هم بود تعداد سر ریز شدن ها رو ملاک قرار بدیم
          سلام
          من کجا گفتم نزار سر ریز شه مگه میشه زمانهای بالا رو بدون سر ریز تایمر بدست اورد نمیشه که من فقط گفتم هر چه از پرسکل کمتر برای بدست اوردن زمان استفاده کنی در نهایت مقدار شمارش بیشتر شده و دقت افزایش می یابد برای 10 ثانیه یا 100 ثانیه شما می تونی با تایمر مدت زمان یک ثانیه درست کنی بعد بشماری و وقتی به 10 یا 100 رسید شرط رو اجرا کنی
          برد جوجه کشی:
          مطالعه پست 1 (حتما مطالعه کنید)


          مطالعه پست 2 (برای مطلع شدن از تغییرات برنامه مطالعه کنید)

          دانلود

          توجه:
          این برد نیمه صنعتی و خانگی هست...
          برای صنعتی شدن حتما برد مخصوص خودتون رو بزنید...

          آی دی کانال تلگرامی مربوط به برد جوجه کشی : electr0o0nic@

          دیدگاه


            #6
            پاسخ : تشخیص مدت زمان در بسکام

            نوشته اصلی توسط S i l i c o n
            کد:
            $regfile = "m32def.dat"
            $crystal = 8000000
            Config Timer1 = Timer , Prescale = 256
            Enable Timer1
            Enable Interrupts
            On Timer1 Timer1_isr
            timer1=49911
            Dim A As Byte
            A = 0
            
            
            Do                             'halghe marboot be nemoone bardari ADC
            
            Loop Until A = 1
            
            
            Do : Loop                          'edamei barname
            
            
            
            End
            
            
            Timer1_isr:
            Timer1 = 49911
            A = 1
            Return
            خیلی ممنون از جوابتون
            میشه برنامتون را توضیح بدین ؟
            Do : Loop در برنامه دقیقا چی کار میکنه ؟؟
            میشه قسمت
            Timer1_isr:
            Timer1 = 49911
            A = 1
            Return
            را توضیح بدین ؟

            دیدگاه


              #7
              پاسخ : تشخیص مدت زمان در بسکام

              نوشته اصلی توسط m.riahi
              خیلی ممنون از جوابتون
              میشه برنامتون را توضیح بدین ؟
              Do : Loop در برنامه دقیقا چی کار میکنه ؟؟
              میشه قسمت
              Timer1_isr:
              Timer1 = 49911
              A = 1
              Return
              را توضیح بدین ؟
              خواهش میکنم
              do:loop همونطوری که گفتم ادامه برنامه هست یعنی شما برنامتون رو در این do:loop قرار بدین
              timer1_isr:
              زیربرنامه مربوط به سرریز شدن تایمر 1 هست
              مقدار تایمر رو مساوی 49911 قرار میدیم چون بر اساس محاسبه برای بدست آوردن زمان 0.5 ثانیه به prescale 256 و مقدار اولیه تایمر 1 برابر 49911 نیاز هست

              روش بدست آوردن مقدار اولیه تایمر به این صورته :

              مدت زمان سپری شده در یک کلاک میکرو با توجه به 8000000 بودن فرکانس میشه:
              1/8000000
              حالا داریم
              x*1/8000000=0.5
              x=4000000
              حالا این x مقداری هست که باید بوسیله prescale و شمارش تایمر باید ایجاد بشه
              با سعی و خطا prescale 256 به ما مقدار روندی میده حالا حاصل تقسیم
              4000000/256 میشه 15625 یعنی تایمر باید اینقدر بشمره تا سر ریز بشه
              بنابراین باید این مقدار رو حد ماکزیمم شمارش تایمر یعنی 65536 کم کنیم که حاصل میشه 49911 که این مقدار اولیه ای هست که باید به تایمر بدیم البته به همراه prescale 256 تا زمان 0.5 ثانیه ایجاد بشه

              مقدار a= 1 قرار میدیم تا در شرط do:loop اول برنامه از حلقه خارج بشه (همانطور که شما خواسته بودین )
              من نمىآ‌توانم فرضیه «بىآ‌اخلاقى انسان» را بپذیرم، و من اخلاق را منحصرا امرى انسانى و متعلق به انسان مىآ‌دانم که هیچ نوع قدرت مافوق انسانى در پشت آن وجود ندارد
              آلبرت اینشتین
              منبع: http://fa.wikiquote.org

              دیدگاه

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