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

نحوه کار با تایمر / کانتر 1 در میکروکنترلر AVR (آموزش AVR #15)

سلام. نحوه کار با تایمر / کانتر 1 در میکروکنترلر AVR (آموزش AVR #15) را آماده کردیم. یعنی به طور کامل با Timer / Counter یک آشنا میشویم.

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

در قسمت قبلی سری آموزش های AVR ، ما به طور کامل با تایمر ، کانتر 1 در میکروکنترلر های AVR آشنا شدیم. در این قسمت آموزش ، نحوه کار و برنامه نویسی این timer / Counter را یاد میگریم. اگر قسمت قبلی را نخواندید حتما حتما حتما آن را بخوانید.

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

در این قسمت همچنین از وقفه ها استفاده میکنیم. ما در این آموزش یک پروژه را با زبان C در کامپایلر Codevision برنامه نویسی میکنیم. برای این آموزش از میکروکنترلر مگا 32 استفاده میکنیم. هدف کلی ما این است که تاخیری به میزان 2 ثانیه بسازیم.

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

 #include <mega32.h>

تابعی تعریف میکنیم با نام timer1_configuration که در آن تنظیمات اولیه و پیکربندی تایمر / کانتر را انجام میدهیم.

void timer1_configuration (){ 
TCCR1B |=(1<<CS11); // Prescaler=8 
TIMSK |=(1<<TOIE1); // Enable Timer1 Overflow 
TCNT1=; // Initialize Timer/Counter1 
#asm ("sei"); //فعال سازی وقفه های سراسری 
}

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

void main(){ 
DDRB. = 1; // تنظیم پین B0 به عنوان خروجی
timer1_configuration (); // بارگذاری Timer1 Configuration 
while(1){} // چرخه بی انتها
}

ما میخواهیم به پین b0 ال ای دی را وصل کنیم پس آنرا به عنوان خروجی تعریف میکنیم. در خط بعدی تابع timer1_configuration را فراخوانی میکنیم.

یه متغیری تعریف میکنیم از جنس int ، با نام : overflow . وظیفه این متغیر شمارش تعداد سرریز هایی است که رخ میدهد. همانطور که در قسمت قبل گفتیم ، باید 61 بار سرریز شود تا 2 ثانیه طور بکشد. پس وظیفه این متغیر این است که بفهمد چه زمانی تعداد سرریز ها به 61 میرسد.

int overflow=0;

همچنین مقدار اولیه آن را 0 قرار میدهیم.

حتما ببینید :  آموزش جامع تایمر / کانتر در میکروکنترلر های AVR ( آموزش AVR #8)

تعریف زیرروال مربوط به وقفه

در مورد وقفه ها قببلا به طور کامل توضیح داده ایم برای ادامه باید حتما با وقفه ها آشنا باشید : وقفه چیست ؟ آموزش کامل Interrupt در میکروکنترلر AVR ( آموزش AVR #10)

برای تعریف وقفه از تابع کلیشه ای زیر استفاده میکنیم :

interrupt [Vector Number] void int_expression (void) {
 برنامه سرویس وقفه 
}

به جای عبارت int_expression ، یک نام دلخواه برای تابع وقفه انتخاب میکنیم. به جای [Vector Number] هم عدد وکتور مورد نظر را از روی دیتاشیت انتخاب میکنیم. در مورد Vector Number هم از روی دیتاشیت نگاه میکنیم و عدد مورد نظر رو انتخاب میکنیم و از آن استفاده میکنیم.

نحوه کار با تایمر / کانتر 1 در میکروکنترلر AVR

نکته : در داخل براکت به جای عدد، میتوان از عبارت متناظر در ستون Source جدول بالا نیز استفاده کرد.

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.
interrupt [10] void timer1_int (){}

اینجا هم برای Vector Number عدد 10 را انتخاب میکنیم که مربوط به وقفه Timer/Counter1 Overflow میشود. اسم آن را هم timer1_int انتخاب میکنیم.

interrupt [10] void timer1_int (){ 
overflow++; // افزایش تعداد Overflow
if(overflow>=61){ // چک کردن در صورتی که 2 ثانیه بگذرد
PORTB^=(1<<); // Toggle B.0 
overflow=; // شمارش تعداد Overflow ها
} 
}

با هر بار سر ریز شدن،یک واحد به متغیر overflow اضافه میشود. وقتی که تعداد سرریز ها از 61 یا بیشتر شود ، پین B0 شروع به Toggle میکند.

Toggle شدن = فعال و غیر فعال شدن

در انتها مقدار متغیر overflow را صفر میکنیم تا تایمر/کانتر یک، مجددا اقدام به محاسبه زمان مورد نظر کند.

حتما ببینید :  آموزش راه اندازی PWM با آردوینو Due - جلسه دوم

کد کامل استفاده از تایمر / کانتر 1 در کدویژن AVR

کد کامل این آموزش را در باکس زیر میتوانید مشاهده کنید :

#include <mega32.h> 
int overflow=; 
void timer1_configuration (){ 
TCCR1B |=(1<<CS11);
TIMSK |=(1<<TOIE1);
TCNT1=;
#asm ("sei"); 
} 
interrupt [10] void timer1_int (){ 
overflow++; 
if(overflow>=61){ 
PORTB^=(1<<);
overflow=;
} 
} 
void main(){ 
DDRB. = 1;
Pin timer1_configuration (); 
while(1){}
}

با محاسباتی که در قسمت قبلی آموزش انجام دادیم فهمیدیم که برای ایجاد تاخیر 2 ثانیه ای حدودا 61 بار سرریز تایمر / کانتر یک لازم است. با ایجاد یک تابع به نام timer1_configuration ، پیکربندی تایمر / کانتر را انجام دادیم.در تابع main پین B.0 را به عنوان پین خروجی تعریف کردیم و تابع timer1_configuration را فراخوانی کردیم.

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

تا Timer Counter 1 سرریز کرد ، سریع میرود به برنامه زیرروال timer1_int و آن را انجام میدهد و سپس به محل قبلی برمیگردد. زیر روال به تایمر کانتر دستور میدهد که هروقت سرریز شد ، یک مقدار به متغیر overflow اضافه کند.

سپس یک شرط تعیین کردیم که هر وقت تعداد این سرریز ها 61 شد ، پین B.0 را روشن / خاموش کند.

این آموزش AVR هم تمام شد. انشالله در قسمت بعد با تایمر / کانتر 2 آشنا میشویم.

قسمت بعد : تایمر / کانتر دو 2 در میکروکنترلر AVR (آموزش کامل + مثال) (آموزش AVR #16)

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

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم.

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

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

دکمه بازگشت به بالا
بستن
بستن