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

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

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

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

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

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

کارگاه عملی - شماره 3 : کار با تایمر/کانتر صفر [19]

سه شنبه, ۲۰ اسفند ۱۳۹۲، ۰۲:۱۵ ب.ظ


 

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

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

به نام خدا

سلام دوستان عزیز

 

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

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

بعد از این همه توضیح و برنامه نویسی و آموزش،باید یه مقدار فسفر بیشتر بسوزونید تا ذهنتون بیشتر درگیر بشه.laugh

ولی به هیچ وجه از این صحبتهای من نگران نشید ...

 

اول از همه صفحه مربوط به بخش13 و 14 آموزش یعنی :

 

آشنایی با تایمر/کانتر میکروکنترلر AVR ؟ [13]

بررسی تایمر/کانتر شماره صفر (0) میکروکنترلرهای AVR ؟ #1 [14]

 

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

 

حتما،حتما،حتما  بخش های آموزشی وبلاگ رو به ترتیب شماره بخونید و بیاین جلو.

وگرنه مسئول متوجه نشدن مطالب و یا کج فهمی مطالب،خودتون هستید !!! cool


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

 

تعریف مسئله :

 

قصد داریم یه چشمک زن تک لامپی بسازیم که هر 8 میلی ثانیه،چشمک بزنه ! (فکر کردین من به این الکیا بیخیال چشمک زن میشم ؟! cheeky)

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

 

با فرکانس 16 مگاهرتز،حداکثر زمانی که میتونیم بسازیم 16 میکرو ثانیه است. (اینا رو قبلنا گفتما،یادتون هست ؟Innocent)

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

 

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

 

برای این قسمت،باید یخورده چَپَکی به فرمول و ضریب تقسیم نگاه کنیم ! Laughing

یعنی با توجه به اینکه تایمر/کانتر شماره صفر 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 Loop
while(1){

// Check Timer/Counter Value
if(TCNT0>=124){

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

// Reset Timer/Counter0 Value
TCNT0 = 0; 


}
}
} 

 

این پست کوتاه رو به پایان میرسونم.

باور کنید که اندازه پست باید از این هم کمتر میشد،چون به غیر از کدها بقیه مطالب تکراری بود و قبلا راجع بهشون مفصل بحث شده !

دوستان نظراتتونو بگین راجع به مطالب و اگر مشکلی بود مطرح کنید.

 

موفق باشید.

با سلام خدمت دوست عزیزم
امیدوارم شب چهارشنبه سوری خوبی داشته باشی(تو این شب چهارشنبه سوری اومدم مطالبی رو که نوشته بودی خوندم لذت بردم)
فقط میخواستم بدونم چه طور میشه زمان 1000ms رو برای ساخت ساعت با کریستال خارجی 8MHZ تولید کنم .
در ضمن روش کار با کانتر خیلی فرق میکنه.
ممنونم.
پیشاپیش عیدت مبارک.
پاسخ:
سلام
عید شما هم پیشاپیش مبارک باشه.

لطفا مطالب مربوط به محاسبه زمان تایمر/کانتر رو دقیق مطالعه بفرمایید و یه قلم و کاغذ هم بزارید بغل دستتون و یه کم حساب کتاب کنید،که تا ابد تو ذهنتون بمونه !
و به این نکته هم توجه داشته باشید که قرار نیست هر زمانی رو دوست داشتیم،بتونیم با تایمر بسازیم !!! (حتی با استفاده از ضریب تقسیم)

بیشتر مطالعه کنید و باز اگر مشکلی بود اطلاع بدید.
سلام
یه سوال داشتم ازتون ممنون میشم جواب بدید
آیا این
TCCR0 |=(1<<CS00)|(1<<CS02);

با این
TCCR0 |=0x05;

معادله؟
پاسخ:
سلام
بله جانم.معادله !

اینها تکنیک های برنامه نویسی با زبان سیه !
سلام دوست عزیز
مچکرم بابت اموزش های روونت ولی
چرا مقاومت میکنی خب جواب این دوستمون mehr رو بده دیگه طفلک یه سوال پرسید چرا ارجاعش میدی به منابع و مطالعه بیشتر
شبیه این استاد های بی حوصله و بلا نسبت (عزیزم )بی سواد دانشگاه هامون جواب دادی جیگر
پاسخ:
سلام
علی آقا من تمام تلاش خودم رو میکنم تا مطالب رو به ساده ترین شکل ممکن توضیح بدم.
ادعایی هم ندارم که این مسئله بصورت 100 درصد صورت پذیرفته،ولی دیگه اینجور هم نباشه که اون چیزایی که قبلا مفصل توضیح داده شده رو دوباره توضیح بدم.
بنده در خدمت ایشون هم هستم.
فقط عرض کردم که یه بار دیگه مطالب رو بخونند و حساب کتاب کنند تا خودشون بهتر یاد بگیرند و اگر احیانا مشکل رفع نشد،بفرمایند تا کمک بشه.


سلام 
میشه لطف کنید توضیح بدید که چه طور TCCR0 |=(1<<CS00)|(1<<CS02);
معادل
0x05= | Tccr0
هستش! 
پاسخ:
سلام
من دقیقا متوجه نشدم که شما با کجای این کدها مشکل دارید ؟!
0x05 =00000101
و ما هم دقیقا چنین نتیجه ای رو انتظار داریم.
در کد اول،از عملگرهای بیتی استفاده کردیم.

لطفا در صورتی که مشکلتون حل نشده هنوز،مجددا بصورت دقیق سوال خودتون رو مطرح کنید.


دربعضی مسائل(مربوط به صفحه 133و134 کتاب میکروکنترلهای AVR آقای جابرالوندی میشه)  برای بدست آوردن tcnt تو فرمولش مقدار زمان فرکانس موج مورد نظر رو( Tpulse)نصف میکنن و علتش رو 50 درصد پالس یک و 50درصدپالس صفر میدونن
مثل مثال زیر:برنامه ای بنویسید که با استفاده از تایمر صفر یک موج مربعی 1khz بر روی پایه خروجی PA.0ایجاد نماید(کریستال را 8mhz در نظر بگیرید)
ولی درمثال زیر برای بدست آوردن TCNT مقدار زمان فرکانس موج مورد نظر رو( Tpulse)نصف نکرده
برنامه ای بنویسید که توسط تایمر صفر با دو کلید فشاری بتوان یک موج PWM باقابلیت تنظیم DUTY CYCLE وزمان تناوب 20 میلی ثانیه تولید نماید؟(کریستال را 8MHZ در نظر بگیرید)

علت تفاوتشون چیه؟ممکنه نحوه بدست آوردن TCNT روتوضیح بدین(مثل توضیح واضحی که مختص خودتونه)
یه خواهش دیگه هم داشتم و اون اینکه این دو تا مساله رو تو کاراگاهتون حلش کنین (خواهش عاجزانه دارم  چون توش موندم)مثال دومی رو که با پروتئوس اجرا کرم تا زمانی که دست رو کلید هست زمان وظیفش تغییر میکننه و وقتی ول میکنی بحالت اولیه بر میگرده البته تغییرش هم فقط یه مقدار ثابت هستش(برنامه رو از روکتاب کپی زدم)
یه بار دیگه ازتون خواهش میکنمم راهنماییم کنید

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

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

مشکل:

در مورد ضریب تقسیم بصورت  کافی توضیح داده نشده ! هرچند که به ضریب تقسیم واحد ADC مراجعه کردم اما همچنان دچار سردر گمی هستم.

ضمنا اگر از هر مبحث مثال های بیشتری بذارید سوالات ما کمتر میشه ;)
پاسخ:
سلام
انشاالله ...

در مورد سوالتون :

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

موفق باشید...
سلام مرسی بخاطر آموزشاتون
یه سوال داشتم : (تو اینترنت هرچی گشتم جوابمو پیدا نکردم )
من تفاوت بین علامتهای  =  و   =|  و  =&  و    =^   و   ~=   رو متوجه نمیشم که یعنی چی و کجا باید استفاده شن !!!!!
بصورت تکی میدونم |  میشه or    ولی  =| نمیدونم یعنی چی!
اگه توضیح بدین چجوری دستور  PORTB ^= 1<< PORTB0 پین B0 رو TOGGLE میکنه ممنون میشم ( مگه دستوری که گفته شده وظیفش این نیست که پین BO رو یک کنه قرینش میشه صفر ولی چطور صفر میشه که قرینش بشه یک ؟؟؟؟؟ )  لطفن نخندیاااااا :( 
اگه جواب بدین ممنون میشم...     
پاسخ:
سلام
مشخص میشه که تو زبان سی تسلط کامل رو ندارید.
در ضمن در بخش نظرات این پست (کلیک کنید) کمی توضیح دادم راجع به سوالتون.

موفق باشید.
سلام خدمت اقای احسان نوری
       اقا خیلی سالاری.من خودم ترم 5 برقم الان و تابستون 93 رو صرف یادگیری avr کردم ولی اونتور که دلم می خواست نشد. از وقتی مطالب وبلاگتون رو خوندم  متوجه شدم ادامه ی راه رو چطور باید برم. از سبک برنامه
نویسی شما خیلی خوشم امد و باعث شد علم برنامه نویسیم خیلی پیشرفت کنه و واقا از این خوشحالم.
فدایی داری.
پاسخ:
ممنون
خیلی باوبلاگت حال کردم مررررررررررررررررررسی
ایشالاموفق باشی
وبلاگتو پخش میکنم 
پاسخ:
مرسی
سلام!

کارتون خیلی درسته
پاسخ:
سپاس

سلام خسته نباشید.آموزشتون واقعا عالیه بسیار روان و کامل توضیح دادید که بدرد تازه کاری مثل من هم میخوره متشکر.

ضمنا بنده همون سوالی که mahsa پرسیده دارم.متاسفانه هرچیم گشتم جوابشو هیچجا ندیدم.شاید البته اینجا جای پرسیدن این سوال نباشه ولی این سوال واقعا منو درگیر کرده و نمیتونم خیلی از نمونه کدهارو تحلیل کنم!

لطفا اگه مقدوره با بیان روان خودتون، هرچند مختصر همینجا توضیح بدید یا اگه لینک منبعی که این مشکل مارو حل کنه بذارید ممنون میشم.

پاسخ:
مسئله خیلی سادست.
قبلا هم تو نظرات توضیحشو دادم !
داداش سخت افزار این کدو  تو پروتئوس میشه بذاری؟؟؟
پاسخ:
خیر !
سلام چند تا از دوستان این سوال رو پرسیدن ولی جواب خوبی ندادید این کد رو میشه بگید معنیش اصلا چیه ؟ چون تا حالا اینجوری من خودم به رجیسترها مقدار ندادم!!!
TCCR0 |=(1<<CS00)|(1<<CS02)
پاسخ:
توضیح داده شده قبلا !
این یکی به عهده شماست یادگیریش !!!
سلام
من میخوام دوتا led متصل به پین های پورت d میکرو atmega 8 رو با دو زمان ثابت به ترتیب 700 میلی ثانیه و 200 میلی ثانیه به صورت چشمک زن همزمان توسط تایمر داخلی میکرو روشن و خاموش کنم، طبق توضیحات ارائه شده برای تایمر  صفر و 2 که برای 8 بیت میباشند برنامه رو نوشتم ولی زمان هاش رو هرکدوم به چه طریقی توسط رجیسترها تنظیم کنم مشکل دارم، برنامه رو تو پروتئوس تست کردم هر دو led با دریافت کد ارسال شده توسط spi به صورت مجزا روشن شده ولی چشمک زن نمی شوند، لطفا راهنمایی کنید.
 
پاسخ:
دیگه قرار نشد تمریناتونو هم من بیام حل کنم !
مطالبو بصورت اصولی یاد بگیرین
این سوال شما چیز خاصی نیست !
mersi mofid bod

سلام

من میخوام که با استفاده از pwm یک پالس مربعی با فرکانس 400khz و duty cycle 50% ایجاد کنم میتونید برنامشو برام بنویسید و برام ایمیل کنید.با تشکر

سلام خیلی خوب توضیح میدین یه نکاتی رو فهمیدم ولی یه سوالی دارم چرا من بعد از تنظیمات کدویزارد عبارت void timer0_configuration(){ تو کدویژنم نمیاد؟؟؟
۲۴ آبان ۹۴ ، ۱۷:۵۸ امیر آرمان
دمت گرم 
توضیحاتت عالیه
ای کاش ادامه دار باشه
سایت خیلی خوبی دارین تا اینجا بصورت پیوسته همه چیزشو متوجه شدم وللی تو درک این یکم مشکل دارم ممنون میشم کمکم کنی مهندس
|=
دستت درد نکنه، کارت عالیه، یکی از مشکلات کتابهای بیرون در رابطه با تایمر کانتر اینه که آدم رو با کلی مبحث و رجیستر و موضوع گیج میکنن و در ضمن تعداد مثالهاشون هم کم هست. خیلی خوب و ساده توضیح دادی به کارت ادامه بده و همین شیوه رو فقط قوی تر کن و مثالهای بیشتری اضافه کن.

عالی..
بد بود...ولی مرسی

awlie










خواستم از زحماتتون تشکر کنم 
همین

ارسال نظر

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