٨۸۵۴۳۵۶۱-٠٢١

پنج شنبه, 20 -2669 ساعت 00:00

برنامه نویسی تایمر کانتر در میکروکنترلر AVR

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

کارگاه عملی کار با تایمر/کانتر صفر

 


 

در این بخش از کارگاه عملی،کار با تایمر/کانتر شماره صفر را بررسی خواهیم کرد.
 

یادتونه که در قسمت های قبلی عملکرد تایمر/کانتر شماره صفر رو بررسی کردیم،اما در مورد برنامه نویسیش صحبتی نکردیم و الان وقتشه که بریم سراغ برنامه نویسی.

سعی میکنم یه مقدار سطح توضیح دادنم رو حرفه ای تر کنم،اما قول میدم که برای دوستان مبتدی اشکالی پیش نیاد.


طبق معمول یه مسئله مطرح میشه و سعی میکنیم حلش کنیم 

تعریف مسئله :

قصد داریم یه چشمک زن تک لامپی بسازیم که هر 8 میلی ثانیه،چشمک بزنه

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

با فرکانس 16 مگاهرتز،حداکثر زمانی که میتونیم بسازیم 16 میکرو ثانیه است.

اما حالا میخوایم یه زمان 8 میلی ثانیه ای بسازیم،پس میریم سراغ انتخاب ضریب تقسیم مناسب !

در مورد انتخاب ضریب تقسیم در بخش 12 آموزشی وبلاگ توضیحاتی داده شده

یعنی با توجه به اینکه تایمر/کانتر شماره صفر 8 بیتیه و حداکثر میتونه تا 255 رو بشماره،باید حاصل TimerCount فرمولمون در رنج 0-255 قرار بگیره !

فرمولها هم که اینجوری بود :


به جدول زیر هم نگاه کنید :

مشاهده میکنید که رنج مورد نظر ما،تنها در ضریب تقسیم 1024 قابل دستیابیه !

در ضریب تقسیم های دیگر مقدار گام شمارش بیشتر از 255 است و از محدوده شمارش تایمر/کانتر صفر خارج است.

بریم سراغ برنامه نویسی و مقدار دهی رجیسترها :

#include<mega32.h>

void timer0_configuration(){}void main(){}

تابعی تعریف شده با نام timer0_configuration که پیکربندی تایمر/کانتر صفر در اون انجام میشه !

رجیستری داریم تحت عنوان TCCR0 :

با سه بیت اولش ضریب تقسیم تعیین میشه،طبق جدول زیر :

void timer0_configuration(){
TCCR0 |=(1<<CS00)|(1<<CS02);}

یه رجیستر دیگه هم داشتیم به نام TCNT0:

یه رجیستر دیتاست که حاوی مقدار تایمر/کانتر صفره !

برای اطمینان بیشتر،مقدارش رو در ابتدای کار صفر میکنیم !

void timer0_configuration(){
TCCR0 |=(1<<CS00)|(1<<CS02);
TCNT0 |=0;}

LED مون رو هم به پایه B0 میکروکنترلر وصل میکنیم،پس باید B0 به صورت خروجی تعریف بشه !

void main(){
DDRB =0x01;}

خب !

من اول کل کدهای تابع main رو مینویسم،بعد دربارش توضیح میدم :

void main(){

DDRB =0x01;

timer0_configuration();

while(1){

if(TCNT0>=124){

PORTB ^=(1<<PORTB0);TCNT0 =0;}}}

یه دونه حلقه بینهایت تعریف کردیم و داخلش یه شرط گذاشتیم که اگه مقدار شمارش شده به 124 یا احیانا بیشتر از اون رسید پین B0 رو Toggle (خاموش/روشن) کنه !

در پایان هم مقدار تایمر/کانتر صفر رو صفر کردیم تا شمارش مجددا از صفر شروع بشه و به 124 برسه !

پس کل کدها به این صورت میشه :

#include<mega32.h>

void timer0_configuration(){

// Prescale : 1024
TCCR0 |=(1<<CS00)|(1<<CS02);

// Clear Timer/Counter0 Data
TCNT0 |=0;}

void main(){

// Configure B0 As Output
DDRB =0x01;

// Load Timer/Counter0 Configuration
timer0_configuration();

// Start Loopwhile(1){

// Check Timer/Counter Valueif(TCNT0>=124){

// Toggle PORTB0 
PORTB ^=(1<<PORTB0);

// Reset Timer/Counter0 ValueTCNT0 =0; 
 }}}

 

 

بازدید 45165 بار آخرین ویرایش در یکشنبه, 09 آذر 1393 ساعت 12:29