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

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

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

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

" نویز رسانه ای است برای آموزش آسان مفاهیم میکروکنترلر و الکترونیک "

دریافت مستندات
آخرین نظرات
  • ۱۵ آبان ۹۵، ۱۸:۵۸ - الهام
    ممنون

کارگاه عملی - شماره 5 : کار با تایمر/کانتر دو [23]

سه شنبه, ۱۶ ارديبهشت ۱۳۹۳، ۱۱:۰۰ ق.ظ

 

پنجمین قسمت کارگاه عملی با تشریح "برنامه نویسی تایمر/کانتر دو" آماده شده است.

 

پس با ما در ادامه مطلب همراه باشید ...

به نام خدا

 

بی مقدمه میریم سراغ کدنویسی !

 

 

کد نویسی به زبان سی در محیط کامپایلر کدویژن :

 

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

 

 #include <mega32.h>

در ابتدای کار،طبق معمول فایل سرآیند مربوط به میکروکنترلر مورد نظرمون که اینجا ATmega32 هست رو اضافه میکنیم.

 

#include <mega32.h>

void timer2_configuration (){}

تابعی تعریف کردیم با نام : timer2_configuration ، که تنظیمات اولیه و پیکربندی تایمر/کانتر دو رو در اون انجام میدیم.

 

#include <mega32.h>

unsigned int overflow;

void timer1_configuration (){

TCCR2 |=(1<<CS21)|(1<<CS22); // Prescaler=256
TIMSK |=(1<<TOIE2); // Enable Timer2 Overflow

TCNT2=0; // Initialize Timer/Counter2

#asm ("sei"); // Enable Global Interrupts

overflow = 0; // Initialize variable

}

حرف جدیدی نزدم !

کامنت های روبروی هر کد رو که بخونید متوجه میشید.

 

 

بریم سراغ تابع main :

void main(){

DDRB.0 = 1; // Config B.0 As Output Pin
timer2_configuration (); // Load Timer2 Configuration

}

پین B.0 همون پایه ای هست که میخوایم بهش LED رو وصل کنیم.پس خروجی تعریف میشه !

در خط بعدی،تابع timer2_configuration رو فراخوانی میکنیم،تا تایمر/کانتر شماره دو پیکربندی بشه.

 

در قسمت بعد داریم :

while(1){

if(overflow>=12){  
if(TCNT2>=53){ 

PORTB.0 ^=(1<<0); // Toggle LED
TCNT2=0; // Reset Timer/Counter2 Variable
overflow=0; // Reset Overflow Counter

}
}
}

این قسمت هم که مانند قبل بوود !

توضیحاتشو قبلا دادم (اینکه باید 12 بار تایمر/کانتر2 سرریز بشه و در دور 13 ام تا 53 بشماره !)

 

اما هنوز یه قسمت دیگه مونده که نباید فراموشش کنیم.

اگه گفتید چی ؟؟؟ ....

.

.

.

.

.

.

.

.

تنبل نباش برو یه نگاه کن ببین کجا رو ننوشتیم هنوز ؟! laugh

.

.

.

.

.

.

.

.

.

.

امان از درد تنبلی !!!!!! cheeky

خودم میگم اصن.

شما نمیرید ببینیدکه چکار باید بکنیم !

 

اینجا ما از وقفه استنفاده کردیم.

پس زیر روالش کو ؟؟؟؟؟؟؟؟؟؟؟

 

بفرمایید :

interrupt [TIMER2 OVF] void timer2_isr (void) {

overflow++; // Add A Unit To overflow Variable

}

 

 

این هم از کل کدها،بصورت یکجا :

#include <mega32.h>

void timer2_configuration (){}

TCCR2 |=(1<<CS21)|(1<<CS22); // Prescaler=256
TIMSK |=(1<<TOIE2); // Enable Timer2 Overflow
TCNT2=0; // Initialize Timer/Counter2

#asm ("sei"); // Enable Global Interrupts

overflow = 0; // Initialize variable

}

interrupt [TIMER2 OVF] void timer2_isr (void) {

overflow++; // Add A Unit To overflow Variable

}

while(1){

if(overflow>=12){  
if(TCNT2>=53){ 

PORTB.0 ^=(1<<0); // Toggle LED
TCNT2=0; // Reset Timer/Counter2 Variable
overflow=0; // Reset Overflow Counter

}
}
}

 

این هم از این یکی پست ...

توضیح کم دادم،چون قبلا اینها رو توضیح دادم.

خواهشا اگه خودتون پیگیر ماجرا نیستید،منو متهم نکنید.(متهم به ... (سه نقطه) !!! cool)

 

منتظر بخش های بعدی آموزش باشید که خیلی خیلی جالب و مفید خواهد بود.

در بخش های بعدی میخوام مُدهای مختلف تایمر/کانتر ها (CTC,PWM) رو توضیح بدم که مطمئنم خیلی با یادگرفتنشون حال میکنید.

 

فعلا ...

آقا احسان کارت خیلی درسته،خدا قوت!!!
پاسخ:
مخلص آقا دانیال !
آقا درس دادن شما محشره
عالییییییییییییییییییی
احسنتتتتتتت
اولین باره چنین درس دادن جالبی رو میبینم
خداقوت
پاسخ:
ممنون
جالب بود دوستم :)
پاسخ:
جالبترم میشه !
سلام.
من چند روزی هست که بطور تصادفی با این سایت آشنا شدم.
راستش دنبال یه سایت آموزشی درباره میکروکنترلر میگشتم که پام اینجا باز شد.
خواستم یه تشکر گرم و صمیمانه ازتون بکنم بخاطر آموزش‎های بسیار بسیار زیبا و قابل درکتون.
واقعا شیوه بیانتون منحصربفرد و عالیه.
خسته نباشید و لطفا ادامه بدید.
من بی‎صبرانه منتظر پست‎های آموزشی شما هستم.
پاسخ:
سلام
باعث افتخار بنده است .
خدا رو شکر میکنم که تونستم به هدف اصلیم که آموزش آسان میکروکنترلر هست برسم.

موفق باشید.
آقا ما چند روز دیگه میریم خدمت.بی صبرانه منتظر بقیه مطالب هستیم.

پاسخ:
به سلامتی
ما هم گذرمون به خدمت میخوره.
اما نه فعلا !

وقت بشه مطلب هم میزارم.
سلام بر دوستان اهل دانش بخصوص آقا احسان گل.دستت درد نکنه مطالب واقعا عالیه.ما به این ساده گویی در سیستم آموزشمون واقعا نیاز داریم.من رشتم مکانیک سیالاته و مکانیک تدریس می کنم اما خود آموز دارم میکرو و رباتیک هم کار می کنم.مطالبتون خیلی به دردم خورد.در سایه امام زمان موفق باشید.
پاسخ:
ممنون
موفق باشید...
سلام با تشکر از زحماتتون برای این سایت خوب و مطالب مفید
من یه سوالی داشتم: اگه توی برنامه از تایمر استفاده بشه باعث کند شدن سرعت برنامه میشه؟به عنوان مثال من یه حلقه for دارم که یه سری محاسبات ریاضی از جمله sin , cos رو انجام میده ، در حالت عادی تعداد تکرار این حلقه رو وقتی روی مثلا 1000 میزارم سرعت برنامه کاهش پیدا میکنه و کم کم با زیاد کردن تکرار حلقه سرعت کم و کمتر میشه ولی زمانی که از تایمر استفاده می کنم اگه تکرار حلقه رو روی 10 هم که بزارم سرعت به شدت کاهش پیدا میکنه و اگه تکرار رو بزارم روی 14 دیگه کاملا برنامه از کار میفته!
برنامه به اینصورته که هر بار که تایمر سر ریز شد وقفه اتفاق میفته و برنامه از اول اجرا میشه. من فک کردم که ممکنه با زیاد کردن تکرار حلقه برنامه فرصت کامل اجرا شدن رو پیدا نکنه و به همین دلیل این مشکل پیش میاد و برای حل مشکل از تایمر 16 بیتی استفاده کردم تا زمان سر ریز رو طولانی تر کنم، که مشکل حل شد ولی در مقابل از دست دادن زمان. البته کمی غیر منطقی به نظر میاد چون انقدر محاسبات پیچیده نیست که سرعت برنامه انقدر کم بشه
حالا سوالم اینه که چرا زمانی که از تایمر استفاده میشه سرعت برنامه انقدر پایین میاد و راه حل چیه؟
پاسخ:
سلام
ممنون

بدون مشاهده متن برنامه و توضیحات دقیق نمیشه به طور قطع اظهار نظر کرد.
اما چرا باید این همه محاسبات ریاضی به صورت مکرر تکرار بشه ؟
آیا راه حلی منطقی تر نمیشه براش پیدا کرد ؟!

در ضمن بیاد داشته باشید که تنها به سوالاتی پاسخ داده میشه که پیرامون مبحث آموزش داده شده در وبلاگ باشه.
و حل مشکلات نرم افزاری و سخت افزاری پروژه های دوستان در برنامه کاری وبلاگ نویز نیست.


موفق باشید.
با سلام  اشنایی با زبان اسمبلی ندارم اگه زحمتی نیست در مورد این خط برنامه توضیح بدهید:
#asm ("sei"); // Enable Global Interrupts
نمیشه به زبان c نوشت؟
با تشکر
پاسخ:
این دستور اسمبلی فلگ interrupt از رجیستر SREG را یک میکند.
دستور دیگر برای صفر کردن این بیت cli میباشد.

موفق باشید.
سلام.
آقا ایولا
دمت گرم
خسته نباشید
مرسییییییییییی

فقط 1سوال:
چرا واسه انجام عملیات NOT از دستور زیر استفاده کردید
PORTB.0 ^=(1<<0); // Toggle LED
و از دستور زیر استفاده نمیکنید!؟؟
PORTB.0 =!PORTB.0; // Toggle LED
مرسیییی ;)



پاسخ:
سلام
در کل این دو دستور هیچ تفاوتی در اجرا ندارند.
اما نوشتن دستور بصورت نوع اول باعث حرفه ای تر شدن سبک برنامه نویسی شما میشه.

موفق باشید.
nice تر از nice
پاسخ:
:)
سلام خسته نباشید
من تمام مباحث تایمر رو تا اینجا خوندم می خواستم بدونم نمیشه تنظیمات رجیستر هارو از کد ویزارد انجام داد اگه میشه یه توضیحی بدید
پاسخ:
قبلا هم گفتم.
من جوری آموزش میدم که احتیاجی به کدویزارد نداشته باشید.
پس کدویزارد ==> ممنوع !!!
یعنی فرقی نمیکنه اون شرط 12 تارو یا تو زیر روال اینتراپت بنویسیم یا تو حلقه while?
خیلی خوب بود .
مرسی

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">