اطلاعیه

Collapse
No announcement yet.

نحوه کار با کانتر و تایمر

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

    نحوه کار با کانتر و تایمر

    با عرض سلام و خسته نباشید خدمت شما.من میخوام که برای اولین بار کار با تایمر کانترها رو در AVR شروع کنم ولی اصلا نمیدونم که چی هست تنها چیزی که میدونم این هست که میکروهای AVR بخشی به نام تایمر کانترها دارند حالا اینکه این تایمر کانترها چی هستن و چیکار میکنند و چه جوری باید ازشون استفاده کرد هیچی نمیدونم.خواهش میکنم که کمکم کنید و یک آموزش کاملی در این رابطه به من بدهید.من از کامپایلر codevision استفاده میکنم.

    #2
    پاسخ : نحوه کار با کانتر و تایمر

    البته اگه می گشتین اطلاعات زیادی توی همین انجمن پیدا می کردید . به هر حال !!!!

    یکی از مهمترین امکانات میکروکنترلر ها همین تایمر / کانتر ها هستند . معمولا میکروهای AVR بین 1 تا 3 عدد تایمر دارند که ممکنه 8 بیتی یا 16 بیتی باشند . حالا این 8 بیت یعنی اینکه بعد از هر 256 = 8^2 پالس ساعت میکرو شما سرریز میشه و باز شروع میکنه از 0 . البته شاید مناسب نباشه اما فرض کن یه ظرف که با 256 قطره پر میشه و با قطره بعدی سرریز میشه . 16 بیت هم یعنی تایمر با 65536 = 16 ^ 2 پالس ساعت سرریز میشه .

    شما باید تایمر رو با استفاده از رجیسترهای کنترلی برنامه ریزی کنی یعنی در واقع چند تا رجیستر 8 بیتی که مربوط به کنترل تایمر هست رو مقدار دهی کنی . بعد از برنامه ریزی ، با خوندن مقدار رجیستر TCNT (که برای تایمر های 8 بیتی ، یک رجیستر 8 بیتی هست و برای تایمر های 16 بیتی 2 تا رجیستر 8 بیتی ) می تونی هر کار میخوای بکنی .

    یه مثال :
    شما میخوای توی هر 100 میکروثانیه ای یه عملی انجام بدی و فرکانس میکرو 8 مگ هست .

    شما رجیستر کنترل رو طوری مقداردهی می کنی که فرکانس میکرو رو برای تایمر تقسیم بر 8 کنه . با این کار فرکانس پالس ساعت تایمر میشه 1 مگ . این یعنی هر 1 میکرو ثانیه 1 عدد به مقدار رجیستر TCNT شما افزوده میشه . شما با چک کردن مقدار TCNT یه شرط میزاری که هر وقت به 100 رسید ( یعنی بعد از 100 تا 1 میکروثانیه ) ، به یک زیر برنامه پرش کنه و اون عملی رو که مدنظرت هست رو انجام بده .

    این بود یه خلاصه . بازم سئوالی بود در خدمتم .

    [glow=blue,2,300]آنقدر به تاريكي لعنت نفرستيد ، يك شمع روشن كنيد. [/glow]

    دیدگاه


      #3
      پاسخ : نحوه کار با کانتر و تایمر

      نوشته اصلی توسط ایمان 88
      البته اگه می گشتین اطلاعات زیادی توی همین انجمن پیدا می کردید . به هر حال !!!!

      یکی از مهمترین امکانات میکروکنترلر ها همین تایمر / کانتر ها هستند . معمولا میکروهای AVR بین 1 تا 3 عدد تایمر دارند که ممکنه 8 بیتی یا 16 بیتی باشند . حالا این 8 بیت یعنی اینکه بعد از هر 256 = 8^2 پالس ساعت میکرو شما سرریز میشه و باز شروع میکنه از 0 . البته شاید مناسب نباشه اما فرض کن یه ظرف که با 256 قطره پر میشه و با قطره بعدی سرریز میشه . 16 بیت هم یعنی تایمر با 65536 = 16 ^ 2 پالس ساعت سرریز میشه .

      شما باید تایمر رو با استفاده از رجیسترهای کنترلی برنامه ریزی کنی یعنی در واقع چند تا رجیستر 8 بیتی که مربوط به کنترل تایمر هست رو مقدار دهی کنی . بعد از برنامه ریزی ، با خوندن مقدار رجیستر TCNT (که برای تایمر های 8 بیتی ، یک رجیستر 8 بیتی هست و برای تایمر های 16 بیتی 2 تا رجیستر 8 بیتی ) می تونی هر کار میخوای بکنی .

      یه مثال :
      شما میخوای توی هر 100 میکروثانیه ای یه عملی انجام بدی و فرکانس میکرو 8 مگ هست .

      شما رجیستر کنترل رو طوری مقداردهی می کنی که فرکانس میکرو رو برای تایمر تقسیم بر 8 کنه . با این کار فرکانس پالس ساعت تایمر میشه 1 مگ . این یعنی هر 1 میکرو ثانیه 1 عدد به مقدار رجیستر TCNT شما افزوده میشه . شما با چک کردن مقدار TCNT یه شرط میزاری که هر وقت به 100 رسید ( یعنی بعد از 100 تا 1 میکروثانیه ) ، به یک زیر برنامه پرش کنه و اون عملی رو که مدنظرت هست رو انجام بده .

      این بود یه خلاصه . بازم سئوالی بود در خدمتم .
      استفاده کردن از تایمر رو بلد نیستم. با یه مثال ساده شروع می کنم:
      یک led رو با یک کلید فشاری A خاموش و روشن میکنم. (که خودش دو سه خط دستور داره و توی حلقه تکرار هست)
      می خوام به موازات این کار، اگه کلید B فشرده شد یه led دیگه پنج ثانیه روشن باشه و پنج ثانیه خاموش.(در واقع میخوام این led چشمک زن، مستقل از اون کلید on-off کار کنه.)
      پس دو تا led داریم که یکی با کلید خاموش و روشن میشه و اون یکی با یک کلید دیگه شروع به چشمک زدن میکنه)
      اگر از delay استفاده کنم، در طول مدت delay پنج ثانیه ای، کلید A کار نمیکنه. شما همین رو برام جواب بدی، میتونم ازش جاهای دیگه استفاده کنم. استادمون برای پروژه خواسته که نور یه واحد مسکونی رو کنترل کنم (در حد روشن یا خاموش شدن چراغ ها). برای مکان های مختلف فرستنده گیرنده مادون قرمز و کلید فشاری و سنسور PIR و... گذاشتم ولی برای تعیین زمان روشن یا خاموش بودن نمیشه از delay استفاده کرد. چه کنم؟

      دیدگاه


        #4
        پاسخ : نحوه کار با کانتر و تایمر

        دوست عزیز
        زمانی که بخوای با میکرو دوکار رو به طور همزمان انجام بدی باید از وقفه استفاده کنی.در مواقعی که میکرو در حال گذروندن delay یا مثلا تایمر در حال شمردنه دیگه نمیتونه کار دیگه ای انجام بده.
        یه سرچ ساده تو انجمن بزنی مطالب زیادی درمورد وقفه ها پیدا میکنی

        دیدگاه


          #5
          مشکل با تایمر

          سلام. درباره ی تایمر ها به یه مشکل کوچیک برخوردم. ممنون میشم کمک کنید. قراره یه led مدت زمان مشخصی روشن باشه و بعد خاموش بشه. من برنامه اشو با تایمر نوشتم. مشکلی که دارم اینه که مثلا وقتی تنظیم میکنم که بعد از 2350 میلی ثانیه خاموش بشه ، بعد از 2358 میلی ثانیه خاموش میشه.
          یعنی دقیقا تو زمانی که تنظیم میکنم خاموش نمیشه. یا کمی زودتر یا کمی دیرتر خاموش میشه.
          کارکرد کلی مدار: یک پوش باتن داریم که وقتی فشار میدیم شمارش شروع میشه و led روشن میشه و وقتی به زمانی که تنظیم کردیم رسیدیم led خاموش میشه. هر لحظه ای که دستمون رو از روی پوش باتن برداریم led خاموش میشه.
          مدت زمانش رو از طریق یک پتانسیومتر که به adc میکرو میتونیم تغییر بدیم.

          http://s5.picofile.com/d/0cf33fe0-1573-49b8-b3e1-8b96dd6273cb/timer_11.rar
          نه تو میمانی و نه اندوه و نه هیچیک ازمردم این آبادی...
          به حباب نگران لب یک رود قسم و به کوتاهی آن لحظه ی شادی که گذشت غصه هم میگذرد ...
          آنچنانی که فقط خاطره ای میماند..
          لحظه ها عریانند ... به تن لحظه ی خود جامه ی اندوه مپوشان هرگز...

          دیدگاه


            #6
            پاسخ : نحوه کار با کانتر و تایمر

            سلام
            من یه سوال کوچولو واسم پیش اومده، من دارم تعداد پالسهای وارد شده به سر کانتر یک atmega128 رو اندازه میگیرم، برای این کار اومدم از لحاظ سخت افزاری اون پالس رو به پایه T1 از اتمگا 128 دارم، کانتر یک رو با کد زیر فعال کردم
            کد:
                // Timer/Counter 1 initialization
                // Clock source: T1 pin Rising Edge
                // Mode: Normal top=0xFFFF
                // OC1A output: Discon.
                // OC1B output: Discon.
                // OC1C output: Discon.
                // Noise Canceler: Off
                // Input Capture on Falling Edge
                // Timer1 Overflow Interrupt: On
                // Input Capture Interrupt: Off
                // Compare A Match Interrupt: Off
                // Compare B Match Interrupt: Off
                // Compare C Match Interrupt: Off
                 TCCR1A=0x00;
                 TCCR1B=0x07;
                 TCNT1H=0x00;
                 TCNT1L=0x00;
                 ICR1H=0x00;
                 ICR1L=0x00;
                 OCR1AH=0x00;
                 OCR1AL=0x00;
                 OCR1BH=0x00;
                 OCR1BL=0x00;
                 OCR1CH=0x00;
                 OCR1CL=0x00;


            و اینتراپت اون رو هم فعال کردم و توی اینتراپت از کد زیر استفاده کردم:
            کد:
            interrupt [TIM1_OVF] void timer1_ovf_isr(void)
            {
             i++;    
             TCNT1=0;
             
              
              if(i==65535)
              { 
               Counter++; 
               i=0;
               }
            
            
            }
            الان توی فرمول باید مقادیر را در 256 ضرب کنم یا 65536؟

            dd = Counter* 65535 * 65535 + i* 65535 + TCNT1

            دیدگاه


              #7
              پاسخ : نحوه کار با کانتر و تایمر

              نوشته اصلی توسط Soheilas
              سلام
              من یه سوال کوچولو واسم پیش اومده، من دارم تعداد پالسهای وارد شده به سر کانتر یک atmega128 رو اندازه میگیرم، برای این کار اومدم از لحاظ سخت افزاری اون پالس رو به پایه T1 از اتمگا 128 دارم، کانتر یک رو با کد زیر فعال کردم
              کد:
                  // Timer/Counter 1 initialization
                  // Clock source: T1 pin Rising Edge
                  // Mode: Normal top=0xFFFF
                  // OC1A output: Discon.
                  // OC1B output: Discon.
                  // OC1C output: Discon.
                  // Noise Canceler: Off
                  // Input Capture on Falling Edge
                  // Timer1 Overflow Interrupt: On
                  // Input Capture Interrupt: Off
                  // Compare A Match Interrupt: Off
                  // Compare B Match Interrupt: Off
                  // Compare C Match Interrupt: Off
                   TCCR1A=0x00;
                   TCCR1B=0x07;
                   TCNT1H=0x00;
                   TCNT1L=0x00;
                   ICR1H=0x00;
                   ICR1L=0x00;
                   OCR1AH=0x00;
                   OCR1AL=0x00;
                   OCR1BH=0x00;
                   OCR1BL=0x00;
                   OCR1CH=0x00;
                   OCR1CL=0x00;


              و اینتراپت اون رو هم فعال کردم و توی اینتراپت از کد زیر استفاده کردم:
              کد:
              interrupt [TIM1_OVF] void timer1_ovf_isr(void)
              {
               i++;    
               TCNT1=0;
               
                
                if(i==65535)
                { 
                 Counter++; 
                 i=0;
                 }
              
              
              }
              الان توی فرمول باید مقادیر را در 256 ضرب کنم یا 65536؟

              dd = Counter* 65535 * 65535 + i* 65535 + TCNT1
              چون تایمر 1 استفاده کردید و این تایمر 16 بیتی هستش باید در 65536 ضرب کنید.
              ---------
              .
              .
              ...........

              دیدگاه

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