تایمرهای میکروکنترلر

saalek110

Well-Known Member
تایمرهای میکروکنترلر



سالک : برای اینکه خوانایی بوجود بیاید ، تایم های ۱۶ بیتی را در تاپیک جدا بحث کردم.
بهتر است مقداری از مطالب این تاپیک را بخوانید ، بعد مقداری آشنایی به تاپیک ۱۶ بیتی بروید.



تایمر ۱۶ بیتی در
avr


 
آخرین ویرایش:

saalek110

Well-Known Member
تایمر مانند یک رجیستر است که مقادیر آن به صورت اتوماتیک کم و زیاد میشود. میکروکنترلر AVR دارای تایمر بسیار دقیقی است. نحوه کار تایمر / کانتر به این صورت است که اغلب از صفر شروع میکند به شمارش و ترتیب میشمارد تا به مقدار حداکثری که برای آن تعریف شده است برسد.

بعد از این که به مقدار ماکزیمم رسید Overflow میشود و اعلام مکیند شمارش مورد نظر انجام شده است.

انواع تایمر کانتر در میکروکنترلر AVR​

در میکروکنترلرهای AVR دو نوع تایمر/کانتر وجود دارد :

  1. تایمر/کانتر 8 بیتی
  2. تایمر/کانتر 16 بیتی
مفهوم 8 بیتی و 16 بیتی را در قسمت قبلی به طور کامل توضیح دادیم. و به طور خلاصه : در نوع 8 بیتی طول داده ها 8 بیت است و در نوع 16 بیتی طول داده ها 16 بیت است.

در تایمر 8 بیتی شمارش از 0 شروع میشود و تا 255 میتواند ادامه پیدا کند. و در تایمر 16 بیتی شمارش از 0 شروع میشود و تا 65535 میتواند ادامه پیدا کند.




سالک: در سایت بالا توضیحات زیادی داده شده ولی من نقل نکردم.
نقل نمی کنم چون دارم سایت هارا بررسی می کنم ، ببینم چطور باید مطلب را بیان کرد.
ولی اگر کسی دوست داشت می تواند خودش نگاهی به این آموزش ها بیاندازد.
 
آخرین ویرایش:

saalek110

Well-Known Member

Duty Cycle (سیکلِ وظیفه)​

در یک شکل موج (که تنها دو حالت صفر و یک دارد) نسبت زمان یک بودن سیگنال به پریود سیگنال را Duty Cycle می گویند و بر حسب درصد بیان می کنند.

Duty Cycle= t/T × 100 (%)

1-duty-cycle.png


duty2.png

 

saalek110

Well-Known Member

موج PWM چیست؟​

PWM (Pulse Width Modulation) به معنای مدولاسیون پهنای پالس است. شکل موج PWM، یک شکل موج با پهنای پالس متغیر است. یعنی Duty Cycle آن متغیر است.

pwm3.png
 

saalek110

Well-Known Member

توضیحات جالب و خوبی این سایت در مورد تایمرها داده. ممنون از نویسنده اش جناب رضا اسدی.
 
آخرین ویرایش:

saalek110

Well-Known Member

واحد Timer-Counter چیست؟



واحد Timer-Counter یکی از امکانات جانبی Cpu است و در همه ی میکروکنترلرهای AVR موجود است.این واحد از نظر سخت افزاری متشکل از یک شمارنده ی اصلی و چندین رجیستر برای تنظیمات می باشد.

با اعمال تنظیمات کاربرد های آن نیز تغییر میکند. از مهم ترین کاربردهای این سخت افزار میتوان به تایمر(زمان سنج)، شمارنده(کانتر)، Real Time Clock(زمان سنج حقیقی) و PWM (مدولاسیون عرض پالس) اشاره کرد.

TimerCounter-8.png



از Timer-Counter زمانی استفاده میشه که نیاز به شمارش با سرعت بالا و یا برنامه ریزی میکرو برای انجام کارها تعیین شده طبق زمان خاص و دقیق هستش.

اما برای کار با این واحد نیاز که با بخش های مختلف آن و نیز یک سری مفاهیم کاربردی آشنا شویم.



سالک: پس مفهوم تایمر و کانتر را فهمیدیم.. تایمر که زمان سنج است و کانتر شمارشگر است.
 

saalek110

Well-Known Member
TimerCounter-3.jpg


سالک: من هنوز قصد ورود به بحث را نداشتم ، ولی این عکس قشنگی بود و نتوانستم ازش بگذرم.
اون حرف n شماره کانتر است ، معمولا میکروکنترلر ۳ تا کانتر دارد ، پس n میشه صفر و یک و دو....

این یک رجیستر(چند بیت حافظه) است که تنظیمات تایمر میشه بهش گفت. بعدا بحث میشه ، اسمهای ۸ بیت را ببینید ، مثلا wgm00 و wgm01 . از این اسامی در کدنویسی استفاده می شود.
بعدا بیشتر بحث می کنیم.
 

saalek110

Well-Known Member

بیت های ( CS00 , CS01 , CS02 ):

این بیت ها مطابق جدول زیر منبع کلاک تایمر/ کانتر را مشخص میکنند.

TimerCounter-2.png




سالک: در پست قبل ۳ بیت با نامهای cs00 و cs01 و cs02 داشتیم، در این جدول طرز استفاده از این سه بیت را می فهمیم. منبع کلاک مشخص می شود. بعدا توضیح بیشتری داده می شود ، فقط در این پست خواستم بدانید اون ۳ بیت اول چه چیزی را تنظیم می کنند ، که حالا فهمیدیم منبع کلاک را تامین می کنند.
 

saalek110

Well-Known Member

Out Compare For Timer)TCNT n​


TimerCounter-4.png


این رجیستر در خود تعداد پالس مربعی وارد شده به این واحد تایمر را نگه میدارد.



برای مثال با وارد شدن هر پالس مربعی به واحد Timer0 این شمارنده یک واحد افزایش می یابد تا به عدد 255 برسد. عدد 255 معادل دسیمال عدد باینری 11111111 است، در واقع به این مفهوم که تمام خانه های حافظه ی 8 بیتی ما دارای عدد 1 شده اند.

حالا می دانیم که مقدار شمارشگر در کجا ذخیره می شود. اما تا وقتی که تایمر را فعال نکنیم، این رجیستر نیز فعال نیست. بنابراین نیاز است که ابتدا تایمر را تنظیم کنیم.

 
آخرین ویرایش:

saalek110

Well-Known Member

Timer-Counter Register For Timer)OCR n​



این رجیستر خواندنی و نوشتنی بوده و حاوی مقداری است که دائما با مقدار رجیستر TCNT مقایسه میشود. در صورت برابری با آن می تواند به کمک واحد تولید موج، برای تولید خروجی مورد نظر در پایه ی OC0 مورد استفاده قرار گیرد.

از این رجیستر بیشتر در ایجاد سیگنال های PWM و مد مقایسه ای استفاده شده و در حالت مد نرمال برای زمان سنجی استفاده میشود.

لازم بذکر که محتوای این رجیستر مقدار TOP را در مد CTC و مبنای مقایسه را در مدهای PWM مشخص میکند.

? از تطابق این دو رجیستر برای تولید وقفه خروجی یا تولید یک شکل موج روی پایه OC x میتوان استفاده کرد.
 

saalek110

Well-Known Member

Timer-counter Interrupt Mask Register ) TIMSK​

وقفه های تایمر را میتوان به صورت جداگانه توسط این رجیستر فعال یا غیر فعال کرد.و از این رجیستر هم برای تنظیم وقفه در هنگام سرریز شدن تایمر/ کانتر و یا وقفه ای که در هنگام تطبیق مقایسه (compare Match)مورد استفاده قرار میگیرد.

TimerCounter-9.png
از مهم ترین بیت های این رجیستر،بیت ششم است که برای فعال کردن وقفه سرریز تایمر کاربرد دارد.

از همان منبع نقل شده.
 

saalek110

Well-Known Member

TIFR (Timer-counter Interrupt Flag Register)​

این رجیستر به عنوان رجیستر پرچم نیز شناخته میشود. زمانی بیت TOV 0 در این رجیستر 1 میشود که، یک TO سرریز در تایمر یا کانتر رخ داده باشد.


Tifir-768x112.png
 

saalek110

Well-Known Member
سالک: اسم رجیسترها را یاد گرفتیم و کمی شرح کارشان هم گفته شد. بعدا با بحث های مفصل تر ، موضوع را یاد خواهیم گرفت.
 

saalek110

Well-Known Member

PHP:
/*
 * ATmega16_Servo_Motor
 * http://www.electronicwings.com
 */

 #include <mega16a.h>
#include <delay.h>        /* Include Delay header file */

 
 
void main(void){
int timerOverflowCount=0;
     DDRD=0xff;         //configure PORTD as output
     TCNT0=0x00;
     TCCR0 = (1<<CS00) | (1<<CS02);
 
    while(1)
    {        
         while ((TIFR & 0x01) == 0);
          TCNT0 = 0x00;
          TIFR=0x01; //clear timer1 overflow flag                  
         timerOverflowCount++;      
         if (timerOverflowCount>=6)
         {
             PORTD ^= (0x01 << PORTD4);          
             timerOverflowCount=0;
         }      
    }
}

سالک: کد بالا از سایت ذکر شده را تست کردم. Led را روشن خاموش می کند. با تایم حدود یکی دو ثانیه.
عدد صفر نشان دهنده تایمر اول است مثل TCCR0 و TCNT0 .
کد زیر:
TCCR0 = (1<<CS00) | (1<<CS02);
طبق جدول پستهای قبل ، میشه تقسیم بر ۱۰۲۴.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک: بعد نوشتن یک برنامه ، باز مروری بر رجیسترها بد نیست، اون کلمات آبی را من به متن اضافه کردم تا کمک به فهم رجیسترها بشود.

معرفی اجمالی رجیستر های واحدهای تایمر/کانتر ۸ بیتی​

این رجیسترها که نام آنها در همه واحد های تایمر/کانتر اعم از ساده ، پیشرفته ، ۸ بیتی یا ۱۶ بیتی یکسان هستند و به طور اتوماتیک توسط کدویزارد مقدار دهی می شوند ، به شرح زیر می باشد :

رجیستر کنترل تایمر/کانتر ( TCCRX ) : تنظیمات

این رجیستر که مخفف Timer Counter Control Register است ، وظیفه کنترل کلیه تنظیمات واحد تایمر کانتر را بر عهده دارد . این تنظیمات که در کد ویزارد نیز انجام می شود ، به شرح زیر است :

  1. فعال یا غیر فعال بودن واحد
  2. مشخص کردن حالت کار تایمری یا کانتری ( منبع کلاک )
  3. تنظیم عدد تقسیم کلاک ورودی واحد در حالت تایمری
  4. مشخص کردن نوع رخداد در حالت کانتری
  5. تنظیم حالت های مختلف کاری واحد ( PWM ، CTC و … )
  6. فعال یا غیر فعال کردن خروجی واحد ( پایه های OCX )
رجیستر تایمر/کانتر ( TCNTX ) : شمارنده

این رجیستر ۸ بیتی ، مقدار شمارنده در هر لحظه را به صورت اتوماتیک در خود ذخیره می کند . این رجیستر امکان دسترسی مستقیم برای خواندن و نوشتن در شمارنده را فراهم می کند. به طوری که این رجیستر هنگام خواندن مقدار شمارش شده رو برمیگرداند و به هنگام نوشتن مقدار جدید را به شمارنده انتقال می دهد.

رجیستر مقایسه خروجی ( OCRX ) : مقایسه با شمارنده

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

رجیستر پوشش وقفه تایمر/کانتر ( TIMSK ) : وقفه

این رجیستر برای تنظیمات وقفه در هنگام سر ریز شدن تایمر/کانتر یا در هنگام تطبیق مقایسه ( Compare Match ) مورد استفاده قرار می گیرد .

رجیستر پرچم سر ریز تایمر/کانتر ( TIFR ) : سر ریز

که در این رجیستر بیت TOV0 زمانی یک می شود که یک سر ریز در تایمر یا کانتر صفر رخ داده باشد و بیت های دیگر … که همه توسط کدویزارد تنظیم می شوند.

 

saalek110

Well-Known Member

معرفی و تشریح تایمر/کانتر ساده ۸ بیتی​


8Bit_simple_TC.png

همانطور که در شکل فوق مشاهده می کنید ، شمارنده دارای ۸ بیت ورودی می باشد که به کمک آن میتوان عدد دلخواه را در هر لحظه در طول برنامه روی شمارنده ( رجیستر TCCNT ) بارگذاری نمود . همچنین خروجی شمارنده نیز ۸ بیت می باشد که با آمدن هر یک رخداد ، یک واحد به آن اضافه می گردد تا اینکه مقدار شمارنده به حداکثر مقدار خود یعنی ۲۵۵ برسد . بعد از اینکه مقدار شمارنده به ۲۵۵ رسید با آمدن رخداد بعدی ، بیت سر ریز ۱ می شود و همزمان مقدار شمارنده نیز ریست می گردد یعنی همه خروجی ها ۰ می شود .

در کنار شمارنده ، واحد کنترل و تقسیم فرکانس وجود دارد . این واحد وظیفه کنترل منبع کلاک ورودی را دارد که در حالت تایمری ، کلاک داخلی انتخاب می شود و در حالت کانتری نیز کلاک خارجی انتخاب می شود . همچنین در این واحد در صورت انتخاب کلاک داخلی میتوان تقسیمی از آن را به عنوان کلاک شمارنده انتخاب و به شمارنده داد که به آن پیش تقسیم کننده ( Prescaler ) گویند به طوری که توسط این واحد یکی از Cclk ، Cclk/8 ، Cclk/64 ، Cclk/256 و Cclk/1024 را میتوان انتخاب نمود .

نکته : در حالت استفاده از کلاک خارجی ( کانتر ) باید توجه داشت که حداقل زمان بین دو رخداد Cclk می باشد ( Cclk همان فرکانس کاری میکروکنترلر می باشد )


 

saalek110

Well-Known Member
PHP:
/*
 * ATmega16_Servo_Motor
 * http://www.electronicwings.com
 */

 #include <mega16a.h>
#include <delay.h>        /* Include Delay header file */

 
 
void main(void){
int timerOverflowCount=0;
     DDRD=0xff;         //configure PORTD as output
     TCNT0=0x00;
     TCCR0 = (1<<CS00) | (1<<CS02);
 
    while(1)
    {     
         while ((TIFR & 0x01) == 0);
          TCNT0 = 0x00;
          TIFR=0x01; //clear timer1 overflow flag               
         timerOverflowCount++;   
         if (timerOverflowCount>=20)
         {
             PORTD ^= (0x01 << PORTD4);       
             timerOverflowCount=0;
         }   
    }
}


PHP:
      if (timerOverflowCount>=20)

سالک: در پستهای قبل اون ۲۰ قبلش ۶ بود. من افزایش دادم.


این طوری led دیرتر روشن میشه.
 

saalek110

Well-Known Member
داشتم یک راهنمای اتمل استودیو را مرور می کردم ، در تاپیک زیر ، که کمی کدهای تایمر هم در تاپیک زیر بحث شد.....
البته سینتکس اون تاپیک برای اتمل استودیو است ولی مفاهیم فرق نمی کنه ، اون تاپیک را هم ببینید تا کدهای اون را هم ببینید. شاید بعضی کدها را نشود به کدویژن تبدیل کرد ولی روش استفاده از رجیسترها یکیه. اگر مفاهیم کار اون ناپیک را یاد بگیرید ، کد کدویژن اش را هم بعدا ممکن است پیدا کنید یا بتوانید خودتان بنویسید ، یا شاید خودم اون کدها را بعدا تبدیل به سینتکس کدویژن کدم و در تاپیک حاضر زدم.

 

جدیدترین ارسال ها

بالا