توی میکرو AVR ما سه تا تایمر داریم تایمر 0 و 2 و 1
که 0و2 هشت بیتی هستن و 1 تایمر 16 بیتی هست
هر کدومشونم بخوای می تونی توی یکی از چهار تا مد (normal، ctc،PWM،correct phase pwm) استفاده کنی.
هر کدوم این تایمرها سه تا رجیستر اصلی دارن
مثلا تایمر صفر سه تا رجیستر 8 بیتی داره به اسم (TCNT0 ـ TCCR0 ـ OCR0)
تایمر دو هم به همین ترتیب فقط شماره هاش تبدیل میشه به 2 مثلا TCCR0
تایمر یک چون 16 بیتی هست رجیسترهاش اینطوری نامگذاری میشه: TCCR1A برای هشت بیت بالایی و TCCR1B برای هشت بیت پایینی OCR1AH و OCR1AL و OCR1BH و OCRB1L
حالا دو تا رجیستر هم هستن که بین این سه تا تایمر مشترک هستن که برای کار کردن با سرریز وقفه های تایمرها و بیت های فلگ یا همون پرچم تایمرهاست بنام های TIFR و TIMSK
رجیستر TCCR برای پیکیر بندی تایمر هست یعنی با تنظیم کردن بیتهاش میتونی مشخص کنی تایمر توی چه مدی کارکنه با چه تقسیم کلاکی و در حالت مقایسه تغییر وضعیت بده یا نه.
رجیستر TCNT برای ذخیره عددی تایمرت هست که مثلا با توجه به فرکانسی که داری باید محاسبه کنی و عددی که میخوای اگه تایمر به اون عدد رسید شروع به شمارش کنه توی این رجیستر میریزی.
رجیستر OCR هم زمانی استفاده میکنی که بخواهی از مقایسه تایمرت استفاده کنی.
مثلا به ما گفتن یه برنامه بنویسید که موج مربعی با دوره تناوب T=512us روی پورت A تولید کنه؟
خوب ما میخواهیم با تایمر کانتر 0 اینکارو بکنیم. میدونیم که 8 بیتی هشت یعنی 2 به توان 8 که میشه 256 یعنی تایمر ما از 0 تا 256 باید بشمره بعد که به 255 رسید اینجا برنامه ما باید یکبار اجرا بشه.
حالا دوره تناوب ما 512 میکرو ثانیه است پس باتوجه به عدد بالا چون موج مربعی میخواهی باید مدت 256 میلی ثانیه صفر باشه و 256 میلی ثانیه 1 باشه تا یه موج مربعی 512 را تولید کنه. حالا برنامه زیر را ببین.
کد:
[align=left]
void delay(){
TCCR0=0b00000010; // fclk/8
while (!TIFR & 0x01); // تاوقتیکه بیت TOV0 یک نشده باشه اینجا وایمیسته
TIFR = TIFR | 0b00000001;
TCCR0=0x00;
}
DDRA=0xFF;
PORTA=0x00;
TCCR0=0x00; // مقدار اولیه تایمر 0 داده
TCNT0=0x00; // مقدار اولیه تایمر از 0 شروع کنه به شمارش
while(1){
PORTA.0=1;
delay();
PORTA.0=1;
delay();
}
}
[/align]
اما ممکنه دوره تناوبت را کاهش بدن مثلا بگمی با دوره تناوب 200 میکرو ثانیه خوب این از عدد 256 کمتر هست پس باید یه منها بکنی
256-200=56 عدد 56 عددی هست که باید توی TCNT ریخته بشه و تایمر از این عدد فعال میشه و شروع به شمارش میکنه پس میبریش به هگز میشه 0x38 و برنامت میشه این:
کد:
[align=left]
voide delay()
{
TCNT0=0x38;
TCCR0=0b00000010;
while (! TIFR & 0x01);
TIFR = TIFR | 0b00000001;
TCCR0=0x00;
}
[/align]
حالا اگه بهت فرکانس را بده از روی همون دوره تناوبو را بدست میاری
میدونی که دوره تناوب و فرکانی عکس هم هستن یعنی T=1/F و F=1/T
اگه بخواهی توی مد های دیگه غیر از نرمال استفاده کنی فرمول داره که میتونی فرمولشو از دیتاشیت میکرو پیدا کنی مثلا توی مد CTC فرمولش اینه : Fosc=Fclk/2*N*(1+OCR0
Fosc که همون فرکانس اسیلاتور هست مثلا اگه بگه موج مربعی با فرکانس 5KHZ میشه 5 * 10^3=5000 هرتز
Fclk= معمولا چون کریستالمون 8mhz هست میشه 8 * 10^6
و چون رجیستر OCR0 هشت بیتی هست توی تایمر0 پس N ه میمشه 8
حالا باید با این اطلاعات عددی را بدست بیاری ک هتوی OCR0 ریخته میشه
حالا میخواهی یه موج مربعی بسازی با فرکانس 5khz روی پین OC0 فکرکنم میشه پین PB3 میکرو
طبق فرمول داری :
5*10^3=((8*10^6)/2*8*(1+OCR0))
که حاصل هست عدد 99 دسیمال معادل 0x63 هگز که این عدد OCR هست
برنامه این میشه :
کد:
[align=left][align=left]
void main(void){
DDRB=0xFF;
PORTB=0x00;
TCNT0=0x00[align=left];[/align]
TCCR0=0b00011010;
OCR0=0x63;
while(1);
}
[/align][/align]
وسلام