آموزش AVRآموزش الکترونیک

آموزش کار با تایمر / کانتر صفر در پروژه ها با میکروکنترلر AVR (آموزش AVR #13)

سلام. آموزش کار با تایمر / کانتر صفر در پروژه ها با میکروکنترلر AVR (آموزش AVR #13) را آماده کردیم.

نحوه استفاده از Timer / Counter 0 در میکروکنترلر های AVR

در قسمت قبلی آموزش AVR ما با استفاده از میکروکنترلر AVR ، آنالوگ به دیجیتال ، سون سگمنت و سنسور LM35 یک دماسنج را ساختیم.

قسمت قبل : آموزش کامل پروژه دماسنج AVR با سنسور LM35 و سون سگمنت (آموزش AVR #12)

در قسمت های قبلی سری آموزش های AVR ما با تایمر کانتر ها به خصوص تایمر کانتر صفر آشنا شدیم. قبل از خواندن این مطلب لطفا قسمت های مربوط به آشنایی با تایمر / کانتر ها و آشنایی با تایمر / کانتر 0 را بخوانید.

در این قسمت از دوره آموزش AVR ما به طور کامل نحوه کار با timer counter صفر را یاد میگریم. توجه داشته باشید ما در قسمت های قبل به طور کامل با بخش تئوریه تایمر کانتر ها آشنا شده ایم و در این قسمت میخواهیم از Timer/Counter صفر در یک پروژه استفاده کنیم.

پروژه AVR برای کار با تایمر / کانتر صفر

در این آموزش هم مانند خیلی از آموزش های قبلی ، با ایجاد یک پروژه مطلب را آموزش میدهیم. ما در این پروژه میخواهیم نحوه ساخت یک ال ای دی چشمک زن که هر 8 میلی ثانیه یک بار روشن و خاموش شود را آموزش دهیم.

در این پروژه از کریستال خارجی 16 مگاهرتز و نرم افزار کدویژن استفاده میکنیم. همانطور که قبلا گفتیم با فرکانس کاری 16 مگاهرتز میتوانیم نهایتا 16 میکروثانیه زمان بسازیم.

با توجه به اینکه تایمر / کانتر شماره 0 ، یک تایمر کانتر با دقت 8 بیتی است، حداکثر میتواند تا 255 را بشمارد پس باید حاصل Timer Count ما در محدوده 0 تا 255 قرار بگیرد.

فرمول ها را که یادتان هست ؟

محاسبه مدت پالس در AVR

اگر میخواهید آردوینو را به صورت اصولی و پروژه محور (ساخت ربات، ارتباط با اندروید، اینترنت اشیا، برنامه نویسی حرفه ای) یاد بگیرید، حتما دوره آموزش آردوینو را مشاهده کنید.

به جدول زیر دقت کنید.

کار با تایمر کانتر 0 در AVR

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

توضیحات کد پروژه

در ابتدا کتابخانه میکروکنترلر Atmega32 را فراخوانی میکنیم.

#include <mega32.h>
void timer0_configuration(){}
void main(){}

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

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

همانطور که در قسمت های قبل گفته شد، رجیستری داریم با نام TCCR0 که با سه بیت اول آن ضریب تقسیم را مشخص میکنیم. (اگر نمیدانید رجیستر TCCR0 چیست حتما قسمت 9 آموزش های AVR را بخوانید!)

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

و رجیستر دیگری نیز داشتیم به نام TCNT0 که مقدار تایمر/کانتر در آن قرار میگرفت. برای اطمینان بیشتر مقدار آن را در ابتدا صفر قرار میدهیم.

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

میخواهیم ال ای دی را به پایه B0 میکروکنترلر Atmega 32 متصل کنیم. پس باید این پایه را به عنوان Output یا همان خروجی تعریف کنیم.

void main(){
DDRB = 0x01;
}

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

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

یک حلقه بی نهایت void main تعریف میکنیم و در داخل آن یک شرط میگذاریم. که اگر مقدار شمارش به 124 یا بیشتر رسید پین B0 را روشن / خاموش کند. در پایان هم مقدار تایمر کانتر را صفر میکنیم تا شمارش از نو آغاز شود.

void main(){
DDRB = 0x01;
timer0_configuration();
while(1){
if(TCNT0>=124){
PORTB ^= (1<<PORTB0);
TCNT0 = 0;  } } }

کد کامل :

#include <mega32.h>
void timer0_configuration(){
TCCR0 |=(1<<CS00)|(1<<CS02);
TCNT0 |=0;
}
void main(){
DDRB = 0x01;
timer0_configuration();
while(1){
if(TCNT0>=124){
PORTB ^= (1<<PORTB0);
TCNT0 = 0; 
 } } }

این آموزش نسبت به آموزش های دیگر کوتاه بود اما لازم بود این مطالب گفته شود. انشالله در قسمت بعدی آموزش در مورد تایمر / کانتر 1 صحبت میکنیم.

قسمت بعد : تایمر / کانتر یک در میکروکنترلر های AVR (آموزش کامل Timer / Counter 1)

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

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. مالکیتی بر مطالب ارائه شده ندارم. اکثر فعالیت بنده در زمینه ترجمه است. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

2 نظر

  1. سلام
    وقتتون بخیر
    اگر بخوایم از 0 تا بینهایتو بشماره و روی نمایشگر نشون بده باید چیکار کنیم؟

    1. سلام. فقط میخواید که روی نمایشگر یک عدد تا بینهایت شمرده بشه؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *