چاپ کردن این صفحه
شنبه, 02 فروردين 773 ساعت 00:00

کار با تایمر و کانتر در Bascom avr

نوشته شده توسط 
این مورد را ارزیابی کنید
(2 رای‌ها)

کار با تایمر (timer) و شمارنده (counter) میکروکنترلر avr :

گاهی اوقات نیاز داریم تا یک زمان بندی دقیق برای وظایف میکروکنترلر مشخص کنیم مانند وقتی که می خواهیم یک LED را هر یک ثانیه یک بار خاموش و روشن کنیم یا زمانی که می خواهیم یک ساعت بسازیم و ... ، در این موارد از تایمر میکروکنترلر استفاده می کنیم. اما گاهی اوقات نیز نیاز است تا تعداد رویدادهایی که خارج از میکروکنترلر اتفاق میافتد را بشماریم مثلاً قصد داریم تا تعداد بطری نوشابه هایی که بر روی نقاله در حال عبور است را بدانیم از امکان شمارنده یا کانتر (counter) میکروکنترلر استفاده می کنیم. در واقع بخش تایمر/کانتر چیزی نیست جز یک شمارنده که در داخل میکروکنترلر تعبیه شده است ،همان طور که میدانیم شمارنده ها برای شمارش نیاز به کلاک پالس دارند حالا اگر این کلاک پالس از کلاک داخلی خود میکرو تامین شده باشد ما تایمر خواهیم داشت اما اگر این کلاک پالس از خارج از میکروکنترلر تامین شود ما یک کانتر خواهیم داشت.

یکی از ویژگی های تایمر/کانتر در میکروکنترلر این است که کارکرد آن مستقل از 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 وصل است چشمک بزند.

ادامه دارد ........

بازدید 190029 بار
Super User

آخرین‌ها از Super User

موارد مرتبط