اطلاعیه

Collapse
No announcement yet.

timer0 میکرو AVR و ثانیه شمار ساده با کریستال داخلی میکرو

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

    timer0 میکرو AVR و ثانیه شمار ساده با کریستال داخلی میکرو

    سلام دوستان.من میخوام یه پروژه دارم که میخوام توش یه ثانیه شمار هم باشه و میخوام از timer0 یا timer2 میکرو ATmega32 استفاده کنم و نمیتونم از کریستال خارجی استفاده کنم خب به اون دقت هم نیاز ندارم.البته من این کار را انجام دادم اما چیزی که بلد نیستم اینه که نمیدونم چه رابطه ای بین کلاک میکرو و Clock Value تایمر وجود داره و چطور باید تنظیم کنم.مثلا اگه میکرو من با فرکانس 1مگا هرتز کار کنه Clock Value تایمر0 باید رو چند تنظیم بشه و Timer Value باید چقدر باشه؟حالا اگه فرکانس میکرو 4 یا 8 مگاهرتز شد این فیلد ها باید چطور تنظیم بشن تا ثانیه شمار دقیق داشته باشم.آیا فرمولی وجود داره؟؟لطفا کمکم کنید.راستی من از CodeVision و زبان C استفاده میکنم.کلا اگه در باره ی گزینه های این عکس توضیح بدید واقعا ممنون میشم.

    #2
    پاسخ : timer0 میکرو AVR و ثانیه شمار ساده با کریستال داخلی میکرو

    خلاصه اینه که:

    تایمر روتینی است که قرار است پس از یک زمان از پیش تعیین شده اجرا شود. پس به یک ثابت زمانی احتیاج داریم. این ثابت زمانی میتواند از یک منبع مثلا کلاک سیستم تامین گردد. ولی ممکن است این ثابت زمانی برای ما بسیار سریع باشد پس بایستی بتوان آنرا بر یک مقدار اولیه تقسیم کرد تا ثابت دلخواه یا بهتر بگوییم تا حد ممکن دلخواه ایجاد شود. مثلا m32 برای تایمر صفر میتواند دارای فاکتور تقسیم بر 1 یا 8 یا 64 یا 256 باشد. بنا بر این ثابت زمانی ما در فرکانس کاری 16 مگا هرتزی میتواند در سرعت های 16000000/1 و 16000000/8 و 16000000/64 و 16000000/256 یا مقادیر نشان داده شده در منوی codevision یعنی 16000.000 و 2000.000 کیلو هرتز و غیره کار کند.
    خوب حالا ما احتیاج به زمانبندی برای ثابت زمانی یک میلی ثانیه داریم. این زمان را میتوان با هر ثابت زمانی پایه ای ایجاد کرد ولی برای کم کردن کار کلی سیستم پایین ترین سرعت قابل قبول که بر 1000 میکرو ثانیه قابل تقسیم باشد را انتخاب میکنیم. مثلا 250.000 کیلو هرتز. اما این میزان یعنی تایمر ما پس از 4 میکرو ثانیه اجرا میشود.

    حل مشکل:
    1- وقتی تایمر را استارت میکنیم تایمر پس از زمان مشخص شده متوقف میشود. بنا براین میتوان تایمر را در حالتی که متوقف میشود دوبار راه اندازی کرد تا به صورت پریودیک اجرا شود. اما برای استفاده از زمانبندی آن وقفه سرریز یا overflow آنرا فعال میکنیم و در روتین مربوطه تایمر را دوباره استارت میکنیم. در این حالت ما یک فرکانس 250 کیلو هرتزی مجازی ایجاد کرده ایم.

    2- با استفاده از یک متغیر داخلی در روتین تایمر هر 250 بار اجرا را شمرده تا در پایان آن روتین مورد نیاز 1 میلی ثانیه را اجرا کنیم. اما چون این شمردن منجر به اجرای کد نرم افزاری میگردد از یک مکانیسم مشابه استفاده میکنیم و مقداری را به صورت سخت افزاری برای تایمر مشخص میکنیم که تایمر پس از سرریزی آن روتین وقفه اش را اجرا کند. برای تایمرهای 8 بیتی این مقدار 255 یا FF مبنای هگز و برای 16 بیتی ها 65535 یا FFFF هگز است.

    پس چون تایمر ما 8 بیتی است و میخواهیم پس از 250 پالس ساعت مجازی خود روتین تایمر اجرا شود مقدار این عدد را برایر با 256 منهای 250 یعنی 6 میگذاریم.

    پس از این مسئله میتوانیم مطمئن باشیم که روال وقفه ما در بازه های زمانی 1 میلی ثانیه ای اجرا خواهد شد.

    اما راجع به دقت:
    در زمانی که روال وقفه در حال اجراست تا زمانی که تایمر دوباره شروع به کار کند زمان همچنان میگذرد پس در طول زمان ما مقداری زمان داریم که قابل محاسبه نیست. این میزان باعث عدم دقت زمانبندی میشود. برای پرهیز از این مسئله مثلا در هنگام نگهداری تاریخ و ساعت سیستم معمولا از یک ثابت زمانی بسیار کند خارجی مثلا یک کریستال 32768 هرتزی (تاکید میکنم "هرتز&quot استفاده میکنیم تا ثانیه ها درست شمرده شوند ولی حالا بین دو ثانیه اولی 999 و دومی 1001 میلی ثانیه شد مهم نیست.

    بقیه اش هم طلبت!

    دیدگاه


      #3
      پاسخ : timer0 میکرو AVR و ثانیه شمار ساده با کریستال داخلی میکرو

      سلام.آقا رضا از توضیحات کاملی که دادی واقعا ممنونم.اما من یه سوال برام پیش اومد:در قسمت حل مشکل بند 2 که از مکانیسم تنظیم سخت افزاری استفاده میکنیم یعنی به رجیستر TCNT0 مقدار میدیم؟
      اما من یه نمنونه طبق آموزش شما انجام دادم میخوام ببینم درسته یا نه؟اول فرکانس کاری میکرو را رو 4مگاهرتز تنظیم کردم.در Clock Value تایرمر0 مقادیر4000و500و62.5و15.625و3.906 کیلوهرتز بدست اومد و من 62.5 را انتخاب کردم.حالا 4000/62.5=64 میشه ویعنی تایمر من بعد از 64 میکرو ثانیه اجرا میشه!!!مفهوم این را نمیدونم چیه؟«طفا توضیح بدید.خب حالا اومدم و 256-62.5=193.5 و مقدار C1 هگر که این رو دادم به Timer Value کدویژن و در واقع به TCNT0. حالا کدی را که تو روتین وقفه نوشتم براتون میزارم ببینید کل کارهایی که انجام دادم درسته یا نه؟اما اجرا که گرفتم از برنامه ثانیه شمار کار میکرد اما کمی سرعتر از ثانیه شمار واقعی!!!!!!!!!!!!!اگه غلطه یه مثال برا 4 مگاهرتز بزنید.متشکرم.
      کد:
      int sec,min;
      // Timer 0 overflow interrupt service routine
      interrupt [TIM0_OVF] void timer0_ovf_isr(void)
      {
      // Reinitialize Timer 0 value
      TCNT0=0xC1;
      // Place your code here
      sec++;
      if(sec==1000)
       {
       min++;
       sec=0;
       }
      }
      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: 62.500 kHz
      // Mode: Normal top=FFh
      // OC0 output: Disconnected
      TCCR0=0x03;
      TCNT0=0xC1;
      OCR0=0x00;


      راستی یه سوال دیگه:آیا فعال بودن این تایمر روی سرعت کار میکرو تاثیر داره؟
      من یه آزمایشی انجام دادم.یه تابع به صورت زیر نوشتم
      کد:
      void beep()
      {
      
       while (n<900)
         {
         PORTB.4=!PORTB.4;
         delay_us(130);
         n++;
         }
      }

      کارش اینه که بوق بزنه و از تابع main که داخلش یه while( 1)بود صداش زدم و بعد از 5 ثانیه تایمر را غیر فعال کردم.تن صدای بوق قبل و بعد از کار تایمر با هم فرق داره و فکر میکنم وقتی تایمر خاموش صدای واقعی بو شنیده میشه!!
      به نظر شما راه حل چیه؟

      دیدگاه


        #4
        پاسخ : timer0 میکرو AVR و ثانیه شمار ساده با کریستال داخلی میکرو

        چرا کسی جواب نمیدههههههههههههههههههههههه؟ :angry: :cry: :cry: :sad: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2: :cry2:

        دیدگاه

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