یکی از ویژگی های تایمر/کانتر در میکروکنترلر این است که کارکرد آن مستقل از CPU میکروکنترلر است. یعنی تایمر/کانتر قادر است فعالیتش را موازی با CPU انجام دهد.
همان طور که در بالا نیز به آن اشاره شد برای اینکه تایمر/کانتر بتواند کار کند نیاز به کلاک پالس دارد. تایمر/کانتر می تواند این کلاک پالس را از کلاک سیستم یا تقسیمی از کلاک سیستم یا از یک منبع کلاک خارجی تامین کند. زمانی که تایمر/کانتر از پایه خروجی کلاک دریافت می کند، سیگنال خروجی با فرکانس اسیلاتور CPU سنکرون می شود. بنابر این برای اطمینان از نمونه برداری مناسب بایستی زمان بین دو کلاک خروجی حداقل برابر یک دوره تناوب کلاک CPU داخلی باشد. کلاک خروجی در لبه بالا رونده کلاک داخلی CPU نمونه برداری می شود.
میکروکنترلرهای AVR (بجز MEGA64,MEGA128,MEGA256 و MEGA162 که 4 تایمر دارند) نهایتاً دارای 3 تایمر/کانتر هستند. برخی از آنها دارای عملکرد ساده و برخی دیگر دارای امکانات بیشتر نظیر تولید موج PWM ، حالت مقایسه CTC ، حالت تسخیر، عملکرد غیر همزمان و ... می باشند.
به عنوان مثال میکروکنترلر Atmega16 داری تایمر/کانتر به شرح زیر است:
1- تایمر/کانتر صفر (Timer/Counter0) که یک تایمر کانتر 8 بیتی است یعنی نهایتاً تا عدد 255 می تواند باشد و پس از آن سرریز (Over Flow) می شود. این تایمر/کانتر در دو مد تایمر و کانتر کار می کند.
2- تایمر/کانتر یک (Timer/Counter1) که یک تایمر کانتر 16 بیتی است یعنی نهایتاً تا عدد 65535 می تواند باشد و پس از آن سرریز می شود. از این تایمر/کانتر می توان در مدهای تایمر ، کانتر ، مقایسه ای (Compare) ، تطابق مقایسه (Compare Match) ، تسخیر (Capture) ، مدولاسیون عرض پالس (PWM) به صورت 8 ، 9 و 10 بیتی استفاده کرد.
3- تایمر/کانتر دو (Timer/counter2) که یک تایمر کانتر 8 بیتی است یعنی نهایتاً تا عدد 255 می تواند باشد و پس از آن سرریز (Over Flow) می شود. از این تایمر/کانتر می توان در مدهای تایمر ، کانتر ، مقایسه ای (Compare) ، تطابق مقایسه ای (Compare Match) و مدولاسیون عرض پالس (PWM) به صورت 8 بیتی استفاده کرد.
پیکربندی تایمر و کانترهای میکروکنترلرهای AVR در نرم افزار بسکام:
دستور CONFIG TIMERX :
از این دستور برای معرفی شماره تایمر کانتر به نرم افزار بسکام استفاده می کنیم و به شکل زیر نوشته می شود:
CONFIG TIMERX = TIMER/COUNTER
X : شماره تایمری که می خواهیم استفاده کنیم و می تواند 0 , 1 , 2 , 3 باشد.
TIMER/COUNTER : مشخص می کنیم از تایمر شماره X در مد تایمر استفاده می کنیم یا در مد کانتر.
دستور PRESCAL :
توسط این دستور می توانیم مقدار فرکانس کاری تایمر را مشخص کنیم. به این صورت که ما می توانیم فرکانس سیستم را بر اعداد 1 , 8 , 64 , 256 , 1024 تقسیم کنیم و به عنوان فرکانس کاری تایمر در نظر بگیریم. و به شکل زیر نوشته می شود.
CONFIG TIMERX = TIMER/COUNTER , PRESCALE = 1 | 8 | 64 | 256 | 1024
مثال :
$regfile = "m32def.dat"
$crystal = 8000000
Config Timer0 = Timer , Prescale = 256
در مثال بالا از تایمر صفر به عنوان تایمر استفاده شده و کلاک تایمر براربر است با:
CLK TIMER = 8000000/256 = 31250 HZ
دستور START TIMER و STOP TIMER :
از این دستورات برای شروع و پایان عملیات تایمر استفاده می کنیم.
دستور TIMERX = INITIAL VALUE :
ما می توانیم به تایمر شماره X یک مقدار اولیه بدهیم تا تایمر از آن عدد شروع به شمارش کند. این مقدار اولیه در تایمرهای صفر و 2 می تواند بین 0 – 255و در تایمر یک بین 0 - 65535 باشد.
دستور VAR = TIMERX :
توسط این دستور می توانیم مقدار تایمر X را بخوانیم.
دستور ENABLE TIMERX :
برای فعال کردن وقفه تایمر شماره X از این دستور استفاده می شود.
نکته: همانطور که در قسمت کار با وقفه در نرم افزار bascom avr گفته شد برای فعال کردن هر یک از وقفه ها باید ابتدا وقفه سراسری با دستور ENABLE INTERRUPTS فعال شود.
دستور ON TIMERX label :
با این دستور برنامه هنگام رخ دادن وقفه تایمر شماره X به زیر برنامه وقفه با برچسب label پرش خواهد کرد.
مثال :
$regfile = "m32def.dat"
$crystal = 8000000
Portd.0 = Outpot
Config Timer0 = Timer , Prescale = 256
Enable Interrupts
Enable Timer0
On Timer0 show
Dim A is Byte
Do
Loop
End
Show :
Timer0 = 6
Incr A
If A =125 Then
Toggle Portd.0
A = 0
End If
Return
در مثال بالا برنامه ای نوشته ایم که هر یک led که به portd.0 وصل است چشمک بزند.
ادامه دارد ........