به طور کلی از تایمر برای اندازه گیری فواصل زمانی استفاده می شود.به طور مثال میخواهید یک وسیله هشدار دهنده برای یک چای ساز بسازید که بعد از گذشت مدت زمان معینی که توسط ما جهت اطمینان از داغ شدن آب تعیین شده سیستم هشدار دهنده که توسط ما برنامه ریزی شده وارد عمل شود و از طریق هشدار های صوتی به ما خبر بدهد.
ساختار کلی تایمر های به کار رفته در میکروکنترلر avr مطابق شکل زیر می باشد.
تایمر چیزی نیست جز یک کانتر و اساس کار تایمر شمارش لبه های بالا رونده یا پایین رونده یک سیگنال است که این سیگنال می تواند یک سیگنال خارجی یا کلاک میکرو باشد.پس میتوان گفت کاربرد دیگر تایمر های میکرو شمارش پالس های یک سینگال خارجی می باشد.
در اینجا ما قصد داریم تایمر هایی میکروکنترلر ATMEGA32 را بررسی کنیم.
درون یک میکروکنترلر atmega 32 سه تایمر با نام های timer0,timer1,timer2 وجود دارد.
عمکرد تایمر ۲ کاملا مشابه تایمر ۰ است با این تفاوت که تایمر ۲ فقط تایمر است و قادر به شمارش لبه های بالارونده یا پایین رونده سیگنال های خارجی نیست.
معرفی ساختار تایمر ها
تایمر صفر یک کانتر ۸ بیتی می باشد که در یک دوره کاری قادر است ۲۵۶ پالس را شمارش کند.این رقم در تایمر یک به ۶۵۵۳۷ می رسد.برای هر تایمرحداقل ۳ رجیستر وجود دارد که برای کنترل یا مشاهده محتوای شمارش شده به کار گرفته می شوند.
TCCRn – Timer/Counter Control Register timer n
TCNTn – Timer/Counter Register timer n
OCRn – Output Compare Register timer n
که n شماره تایمر است .البته نوع نام گذاری رجیستر های تایمر ۱ به دلیل ۱۶ بیته بودن ریجستر های مربوط به این تایمر به شکل زیر است:
OCR1A – Output Compare Register A
OCR1B – Output Compare Register B
TIFR – Timer/Counter Interrupt Flag Register
TCCR1A – Timer/Counter1 control Register A
TCCR1B – Timer/Counter1 control Register B
و شکل ساختاری تایمر ۱ نیز به صورت زیر است
همان طور که از نام رجیستر ها مشخص است رجیستر های TCCRn رجیستر های کنترلی تایمر ها هستند و برنامه نویس با مقداری دهی آن ها میتواند نحوه کارکرد تایمر را مشخص کند.رجیستر های TCNTnمحتوای در حال شمارش را نگه داری میکنند.
فرض کنید از تایمر میخواهیم برای ما ۱۰ ثانیه اندازه بگیرد و پس از پایان با دادن یک پالس خروجی ما را مطلع سازد.
اگر فرض کنیم که کانتر مربوط به تایمر صفر در حال شمارش سیگالی پریودیک با دوره تناوب ۲ ثانیه باشد پس باید کانتر ۵ پالس را بشمارد تا به زمان مد نظر ما برسد .
پس محتوای در حال شمارش مد نظر ما عدد ۵ میباشد. اگر ما عدد ۵ را درون OCR0 ذخیره کنیم و یک مقایسه گر میان دو رجیستر OCR0 ,TCNT0 قرار دهیم بعد از گذشت زمان ذکر شده فلگ خروجی مقایسه گر که همه فلگ ها در رجیستر
TIFR – Timer/Counter Interrupt Flag Register
قرار دارند یک می شود . حال کاربر میتواند با ۲ شیوه intrrupt یا polling از این موضوع آگاه شود.
TCCR0
با مقدار دهی این رجیستر نحوه کارکرد تایمر ۰ مشخص میشود.این رجیسنر یک رجیستر ۸ بیتی می باشد و چیدمان بیت های مختلف آن به صورت زیر است:
WGM00,WGM01 نحوه شمارش کانتر را مشخص میکنند .
در حالت نرمال کانتر از ۰ تا ۲۵۵ شمارش میکند و برای یکبار فلگ را Timer OverFlow Flag(TOV) یک می کند.
در حالت CTC (Clear timer on compare match) هر وقت که TCNTn =OCRn برای یک بار فلگ OCFn را یک میکند.
دو مد PMW,FAST PWM برای ایجاد سیگنال های پریودیک به کار میروند.
همان طور که مشخص است با مقدار دهی ۳ بیت ابتدایی رجیستر کنترلی کلاک سورس تایمر را مشخص میکنیم. انتخاب کلاک مناسب در رنج تایمر تاثیر مستفیم دارد.
همچنین اگر بخواهیم لبه های بالارونده یا پایین رونده یک سیگنال خارجی را با تایمر های AVR بشماریم باید سورس تایمر آن سیگنال مشخص باشد که در میکروکنترلر ATMEGA32 پایه هایT0,T1 برای این منظور در نظر گرفته شده اند.
TCCR1
با مقدار دهی این رجیستر نحوه کارکرد تایمر ۱ مشخص میشود.این رجیسنر یک رجیستر ۱۶ بیتی می باشد و چیدمان بیت های مختلف آن به صورت زیر است:
در برنامه ساده زیر بعداز ۶ بار overflows شدن تایمر ۰ خروجی پورت PD4 معکوس میشود.