آیا میدانید بچه دلفین از مدتی که به دنیا میاید به مدت 1 ماه اصلا نمیخوابد
جايي هست که جز تو هيچ کس آن را پر کند و کاري هست که جـز تو هـيچ کس قادر به انجامش نيست. از اسکاول شين
Logo

حل تمرینات و پروژه های درس میکروکنترلر
کار با تایمر کانتر صفر AVR در حالت ساده به زبان سی کدویژن CodeVision

مقدمه

 تایمر کانتر یکی از بخش های مهم میکروکنترلرها می باشد. در بیشتر مواقع لازم که تعدادی وقایع خارجی (با سرعت بالا) شمارش شود و یا گاهی لازم است که در یک زمان خاص و دقیق، کاری صورت گیرد. تنها توسط تایمر کانتر ها می توان این کارهای دقیق و با سرعت بالا را انجاد داد.

میکروکنترلرهای AVR حداکثر دارای شش عدد تایمر کانتر هشت بیتی و شانزده بیتی هستند. برخی از آنها دارای عملکرد ساده و برخی دیگر دارای امکانات بیشتر نظیر تولید موج PWM ، حالت مقایسه CTC ، حالت تسخیر، عملکرد غیر همزمان و ... می باشند.

در ادامه ما به نحوی برنامه نویسی و پیکره بندی تایمر صفر در حالت عادی همراه با مثال در محیط برنامه نویسی CodeVision می پردازیم



تایمر کانتر صفر در AVR ها را می توان به سه مدل زیر دسته بندی کرد:

  1.  ساده هشت بیتی
  2. پیشرفته هشت بیتی
  3. پیشرفته شانزده بیتی

ساده هشت بیتی فقط در سری At90S , ATTiny به کار رفته.
پیشرفته هشت بیتی در سری ATmega ها به غیر از ATmega8 و ATmega163 به کار رفته است. (این دو مدل میکرو از مد ساده هشت بیتی استفاده می کنند)
پیشرفته شانزده بیتی این مدل فقط در AVR های سری ATTiny13 , ATTiny2313 به کار گرفته است.

 در اینجا ما از مد پیشرفته هشت بیتی استفاده می کنیم و بیشتر روی codewizard برنامه CodeVision تاکید می کنم و وارد بحث رجیستر های تایمر کانتر نمی شویم چون پیچیده می شود و همه دوستان از این مسائل رجیستر ها زیاد وارد نیستند. codewizard با تنطیم کردن  وضعیت تایمر کانتر ها کد های مربوط رجیستر ها را برای ما بدست می آورد و ما ادامه برنامه را به زبان C می نویسیم.

تایمر کانتر صفر در حالت هشت بیتی پیشرفته:

  1. تایمر کانتر در حالت عادی
  2. تایمر کانتر در حالت مقایسه CTC
  3. تایمر کانتر در حالت PWM سریع (تک شیب)
  4. تایمر کانتر در حالت PWM تصحیح فاز (دو شیب)

رجیستر های تایمر کانتر صفر:

رجیستر مقایسه خروجی OCR0 این رجیستر هشت بیتی خواندنی و نوشتنی بوده و به طور مستقیم با مقدار شمارنده TNNT0 مقایسه می شود. از تطابق این دو برای تولید وقفه خروجی یا تولید یک شکل موج روی پایه OC0 می توان استفاده نمود.

رجیستر تایمر کانتر صفر TCNT0 این رجیستر هشت بیتی امکان دسترسی مستقیم برای خواندن و نوشتن در شمارنده را فراهم می کند.

رجیستر کنترلی تایمر کانتر صفر TCCR0 که دارای هشت بیت کنترلی است که برای انتخاب پالس ساعت، حالت خروجی هنگام تطابق مقایسه، عملکرد های PWM، و بیت مقایسه خروجی. که در کل با این 8 بیت حالت های مختلفی وجود دارد که با استفاده از codewizard این رجیستر ها تنظیم می شود.

 رجیستر پرچم وقفه تایمر کانتر صفر TIFR که در این رجیستر بیت TOV0 زمانی یک می شود که یک سر ریز در تایمر یا کانتر صفر رخ داده باشد و بیت های دیگر ... که همه توسط codewizard تنظیم می شوند.

با استفاده از رجیستر TCCR0 می توان فرکانس کاری تایمر را انتخاب کرد که حالت های زیر را دارد: بدون تقسیم- تقسیم بر 8- تقسیم بر 32- تقسیم بر 64- تقسیم بر 128- تقسیم بر 256- تقسیم بر 1024 یعنی اگر ما فرکانس کلاک کاری میکرو را مثلا 12MHZ انتخاب کنیم و N=32 در نتیجه 12MHZ بر عدد 32 تقسیم می شود و حاصل آن می شود فرکانس کاری تایمر.

مثال ها با CodeVisionAVR V2.04.4a و پروتیوس V7.7 SP4 شبیه سازی شده اند.

 1) با استفاده از تایمر صفر در مد ساده تاخیر 2.04 میلی ثانیه ایجاد نماید؟

#include <mega16.h> 
#define xtal 8000000 

void timer0_delay(){ 
TCCR0=0x03; // Clock value: 125.000 kHz 
while(!(TIFR & 0x02)); //H1 
TIFR |= 0x02; //H2 
} 

void main(void){ 
DDRA=0xff; 
PORTA=0; 
TCNT0=0x00; 
OCR0=0x00; 

while (1){ 
timer0_delay(); 
PORTA.0=~PORTA.0; 
}; 
}

 ابتدا ما تابعی به نام timer0_delay ایجاد کردم و با استفاده از برنامه codewizard در قسمت Timer0 مقادیر زیر را تنظیم کنید:

Clock Source: System Clock
Clock Salue: 125.000kHZ
Mode: Normal top=FFh
Output: Disconnected
0 Overflow Intrrupt
0 Compare Match Interrupt
Timer Value: 0h
Compare: 0h

 و بعد از منوی File -> program perivew را بزنید بر طبق تنظیماتی که شما انجام داده اید رجیستر ها با مقادیری پر می شوند. که در این مثال TCCR0=0x03 شده که اگر به جدول رجیستر ها نگاه کنید حالت مد ساده و با N=64 انتخاب شده که نحوی محاسبه زمان تایمر به صورت زیر است:

TCCR0=0x03 ==> prescaler=64 ==> F/8 ==> 8MHZ/64=125kHZ ==> tc=1/125kHZ=8uS
TCNT0=0 ==> zaman sar riz 255*8uS=2.04ms ==> delay=2.04ms

 H1: میکرو وارد این حلقه شرطی می شود و تا زمانی که پرچم TIFR یک نشده در این حلقه می ماند. (0x02 بیت دوم از رجیستر TIFR هست که اگر یک شود حاصل and بیتی 1and1 برابر 1 می شود و معکوس 1 هم صفر می شود بنابراین حلقه (0) یعنی شکستن حلقه و خارج شدن از آن)

H2: بعد از سریز بیت دوم از رجیستر TIFR یعنی TOVO یک می شود بنابراین برای استفاده مجدد از تایمر باید این بیت را به وضعیت قبلی خود یعنی صفر برگردانیم که با OR کردن اینکار را انجام می دهیم.

در برنامه main هم که پورت A خروجی تعریف شده و مقادیر اولیه شمارنده تایمر و مقایسه را برابر صفر قرار دادیم و وارد یک حلقه بی نهایت شدیم که در آن مدام تابع تاخیر اجرا میشود و پین A.0 مکمل می شود.

نکته برای اینکه codewizard اطلاعات صحیح به شما بدهد حتما به یاد داشته باشید که در قسمت Chip مدل میکرو و فرکانس میکرو دقیق تنظیم شود.

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

 این مقاله به صورت کاملا اختصاصی و به صورت متن باز تنها در وب سایت www.picpars.com منتشر می شود. کپی برداری از آن تنها با ذکر منبع به صورت کامل امکان پذیر می باشد.

منبع www.picpars.com  نویسنده: سید محسن قاسمیان

  منبع: www.picpars.com

  لطفا مقالات، آموزش‌ها و پروژه های خود را به آدرس ایمیل نمائید تا آن را با نام خودتان در سایت منتشر کنیم.




فایل های ضمیمه ( ورود - عضويت )

فایل شماره 102 | حجم 43 کیلوبایت | دانلود 911 بار

منبع www.picpars.com  نویسنده: سید محسن قاسمیان

منبع www.picpars.com  دانلود مثال کار با تایمر کانتر صفر AVR در حالت ساده

منبع www.picpars.com  پسورد: www.picpars.com


لینک ثابت این صفحه:   


© کپی برداری از مطالب این سایت تنها با ذکر منبع مجاز می باشد

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


تایمر کانتر تاخیر دقیق رجیستر سریع تک دو شیب هشت بیتی پی-آیسی-پارس برنامه-نویسی-میکروکنترلرها میکرو میکروکنترلر میکروکنترولربرنامه زبان سی رایگان micro microcontroler avr C Proteus source free picpars picpars.com timer CodeVision v2.04.04a PWM fast codewizard attiny at90s attiny2313 attiny13 atmega8 atmega163 TCCR0 OCR0 TCNT0 TIFR TOVO

ارسال شده در مورخه : پنجشنبه، 29 مهر ماه، 1389 توسط مدیریت بازدید [9638]   پرینت

مرتبط باموضوع :

 ایجاد تاخیرهای دقیق با تایمرهای صفر و یک AVR به زبان سی  [ جمعه، 15 ارديبهشت ماه، 1391 ] 458 مشاهده
 آموزش نحوه کار با Timer میکرو تحت برنامه نویسی Codevision  [ يكشنبه، 14 شهريور ماه، 1389 ] 5597 مشاهده
 اتصال کیبورد 4*4 به میکروکنترلر AVR و نمایش روی سون سگمنت  [ سه شنبه، 19 ارديبهشت ماه، 1391 ] 941 مشاهده
 اتصال کیبورد 4*4 به میکروکنترلر AVR  [ پنجشنبه، 16 ارديبهشت ماه، 1389 ] 15832 مشاهده
نام شما: سعید
ایمیل شما: hamidinezhad@gmail.com

در مورخه : چهارشنبه، 21 دي ماه، 1390توسط
(مشخصات کاربر saeidhp | ارسال پیغام شخصی) (IP آدرس : )

با سلام 

با تشکر از شما به خاطر آموزش عالیتون

من از تایمر 0 برای خاموش و روشن شدن یه متن در LCD استفاده کردم

با زدن کلید m=1 میشه و با استفاده از while(m=1) تابع وقفه اجرا میشه 

با زدن مجدد کلید m=2 میشه اما تابع وقفه همچنان در حال اجرا میمونه و متن همینطور چشمک میزنه

لطفا راهنمایی بفرمایید چطور از تابع وقفه خارج بشم

 

 

جوابیه ها

نام شما: مدیریت
ایمیل شما:

در مورخه : چهارشنبه، 21 دي ماه، 1390توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

با سلام23

برای فعال کردن وقفه از دستور: #asm( "sei" ) و برای غیر فعال کردن هم از دستور #asm( "cli" ) استفاده کنید.

لازم به ذکر است که دستورات کلیه وقفه ها را فعال یا غیر فعال می کند1

ارسال جوابیه ]

ارسال جوابیه ]

نام شما: سعید
ایمیل شما: hamidinezhad@gmail.com

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر saeidhp | ارسال پیغام شخصی) (IP آدرس : )

با سلام 

من شرط رو به صورت زیر نوشتم که delay تابع وقفه برنامست

اما با اینکه m رو زیاد میکنم و باید از دستور while خارج بشه اما این کار انجام نمیشه و به چشمک زدن ادامه میده

 while(m==1)
          {  
          lcd_gotoxy(0,0);
          lcd_puts ( "sale=1390" );
          delay();
          lcd_gotoxy(5,0);
          lcd_puts ("    " );
          if(m!=1)#asm( "cli" );
          }
ارسال جوابیه ]

نام شما: مدیریت
ایمیل شما:

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

دستوراتی که نوشتید کاملا منطقی هست ولی چرا حلقه مدام تکرار میشه احتمال میدم که متغییر m تغییر نمیکنه. شما برای اینکه مطمئن شوید کلید درست کار میکنه و میکرو با هر بار فشرده شدن اون محتوای m تغییر میکنه یا نه، بهتر که m رو روی LCD نمایش بدید و کلید رو فشار بدید و ببینید که m رو lcd تغییر میکنه؟!6

ارسال جوابیه ]

نام شما: سعید
ایمیل شما: hamidinezhad@gmail.com

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر saeidhp | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

اگه به جای while اول کد ، از if استفاده کنم وقفه فقط یکبار اجراشده (فقط یکبار خاموش و روشن میشه ) و با فشردن کلید، m=2 میشود و سطر بعد در lcd شروع به چمشک زدن میکنه (گفتم اگه m==2 شد سطر دوم چشمک بزنه)

اما وقتی از while استفاده میکنم از حلقه خارج نمیشه و سطر بعد در lcd چشمک نمیزنه 

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

با تشکر 

جوابیه ها

نام شما: مدیریت
ایمیل شما:

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

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

این علت چشمک زدن در واقع ربطی به وقفه و تابع delay ندارد، علت این که وقتی شما از دستور while استفاده می کنید میکرو وارد یک حلقه بینهایت می شود که تنها شرط خروج از آن این است که m مخالف 2 شود. یعنی اینکه تا زمانی که m=2 می باشد شرط حلقه برقرار است و CPU دستورات خارج از حلقه را هرگز اجرا نخواهد کرد. (مگر دستورات توابع وقفه) بنابراین میکرو وقتی وارد این حلقه شد دیگر کلید ها را اسکن نخواهد کرد که شما بتوانید مقدار m را تغییر دهید. اما علت چشمک زدن LCD در این حلقه هم این است که CPU با سرعت بسیار بالایی LCD را Refersh می کند و بخاطر همین به صورت چشمک زن میبینیم.

با توجه به ساختار برنامه تان بهتر مانند همان اولی از if استفاده کنید.

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

if (!PINA.0 && m==1)
{
while(!PINA.0); delay_ms(50);
sal1++;
}
ارسال جوابیه ]

ارسال جوابیه ]

نام شما: سعید
ایمیل شما: hamidinezhad@gmail.com

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر saeidhp | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

با سلام و تشکر از شما 

اگه من از if استفاده کنم متن روی lcd فقط یکبار چشمک میزنه و من میخوام تا وقتی که m=1 هست متن بالا چشمک بزنه 

این حالت دقیقا مثل تنظیم ساعت دیجیتال هست که هرکدام چشمک میزنه یعنی همون قابلیت تغییر داره 

شما چه راهی رو پیشنهاد میکنید که بدون استفاده از delay بتونم این امکان رو به وجود بیارم

 

 

ارسال جوابیه ]

نام شما: مدیریت
ایمیل شما:

در مورخه : پنجشنبه، 22 دي ماه، 1390توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

خوب من سعی میکنم برنامه رو آماده کنم و برای دانلود رو سایت قرار بدم. 25

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

303//آموزش-AVR-سی-C/دریافت-اطلاعات-از-کاربر-با-سوئیچ-به-زبان-سی/

با تشکر

ارسال جوابیه ]

نام شما: سارا
ایمیل شما:

در مورخه : پنجشنبه، 14 ارديبهشت ماه، 1391توسط
(مشخصات کاربر dost123 | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

سلام  خسته نباشید ببخشید میشه این تیکه را توضیح بدید من متوجه نشدمگریه

TCCR0=0x03 ==> prescaler=64 ==> F/8 ==> 8MHZ/64=125kHZ ==> tc=1/125kHZ=8uS
TCNT0=0 ==> zaman sar riz 255*8uS=2.04ms ==> delay=2.04ms

F/8 ام از کجا اومد؟8مگا هرتز از کجا بدست اومد؟

چرا تی سی ان تی را صفر گرفتیم و چرا مقدارشو در 255 ضرب کردیم؟

 

ارسال جوابیه ]

نام شما: سارا
ایمیل شما:

در مورخه : جمعه، 15 ارديبهشت ماه، 1391توسط
(مشخصات کاربر dost123 | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

 

ممنون .اگه بخواهم تاخیر 1 ثانیه ایجاد کنم با کلاک فرکونسی 4 مگ. مقادیر TCCR0  و TCNT0 چی میشه؟گریه
 
من هر چی محاسبه کردم با prescaler مختلف یه ثانیه تاخیر در نمیادبیخوابی
جوابیه ها

نام شما: سید محسن قاسمیان
ایمیل شما:

در مورخه : جمعه، 15 ارديبهشت ماه، 1391توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

راههای زیادی برای ایجاد تاخیر 1 ثانیه هست.فکرکردن و با توجه به سوالات مکرر دوستان در مورد ایجاد تاخیرهای دقیق توسط تایمر مطالبی در این مورد آماده کرده ایم که بزودی منتشر خواهد شد.

ارسال جوابیه ]

ارسال جوابیه ]

نام شما: سید محسن قاسمیان
ایمیل شما:

در مورخه : جمعه، 15 ارديبهشت ماه، 1391توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

F فرکانس کاری میکرو هست که خود ما تعیین میکنیم. و TCNT0 هم که هشت بیتی می باشد یعنی مقادیر 0 تا 255 طبق محاسبات مدت زمان شمارش هر پله برابر 8us شد یعنی اگر TCNT0=1 مقدار 8us و اگر TCNT0=2 l مقدار 16us و ... پس اگر TCNT0=255 شود مدت زمان شمارش 2.04ms‌خواهد شد.گل

ارسال جوابیه ]

نام شما: سارا
ایمیل شما:

در مورخه : جمعه، 15 ارديبهشت ماه، 1391توسط
(مشخصات کاربر dost123 | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

نمیشه حداقل یه راهنمایی بکنین اخه من عجله دارم مهلت تحویل تمرینم زیاد نمونده

خواهش میکنمگریه

جوابیه ها

نام شما: سید محسن قاسمیان
ایمیل شما:

در مورخه : جمعه، 15 ارديبهشت ماه، 1391توسط
(مشخصات کاربر SMGH-admin | ارسال پیغام شخصی) http://www.picpars.com (IP آدرس : )

با سلام خدمت دوستان

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

با تشکر گل

ارسال جوابیه ]

ارسال جوابیه ]

نام شما: ایمان
ایمیل شما: iman_ir1900@yahoo.com

در مورخه : يكشنبه، 31 ارديبهشت ماه، 1391http://www.picpars.com (IP آدرس : )

با سلام

من تازه دارم زبان c کتر میکنم . نمی دونم از کجا باید شروع کنم . لطفا راه درست رو نشونم بدید.

دمت گرم

ارسال جوابیه ]

 
نام شما: [ کاربر جدید ]

نام شما (ضروری): 
ایمیل شما : 
نظر:
کد امنیتی
کد امنیتی

  [ بازگشت ]
  • امتیاز بدهید
  • انتخاب ها
  • اشترک گذاری
آیا این مطالب مورد رضایت شما واقع گردید؟ لطفا با رای دادن به این مطلب ما را در بهبود بخشیدن به مطالب کمک کنید. با اینکار به سایر دوستان‌تان نیز کمک خواهید کرد.


 فایل پی دی اف فایل پی دی اف

 گرفتن پرينت از اين مطلب گرفتن پرينت از اين مطلب

 ارسال به دوستان ارسال به دوستان

 گزارش این پست به مدیر سایت گزارش این پست به مدیر سایت

پروژه های آماده
پروژه تایپ حروف و اعداد با کیبورد 3×4 به زبان سی

با استفاده از میکروکنترلر ATMEGA8 و کیبورد 3×4 می توان حروف و اعداد را تایپ کرد و درون یک متغییر ذخیره نمود و محتوای این متغییر بر روی نمایشگر LCD نمایش داده می شود. در صورتی که فضای LCD پر شود کاراکترها به سمت چپ شیفت داده می شوند. تمامی حروف و اعداد کوچک و بزرگ انگلیسی قابل تایپ می باشند. جزئیات...


عناوین مطالب
عناوین مطالب را در موضوعات مربوطه جستجو کنید!
یک موضوع انتخاب کنید:



لینک باکس مهم‌ترین‌ ها
  • پروژه‌ها
  • برترین‌ها
  • پر بازدید
  • بیشترین نظرات
cash10-H7

سالنامه فارسی
ش ی د س چ پ ج
  12345
6789101112
13141516171819
20212223242526
2728293031

دوشنبه

1

1 خرداد ماه، 1391
21/05/2012


رویداد ها:
روز بزرگداشت ملاصدرا - روز بهره وری و بهینه سازی مصرف

جستجو در تقویم ...
cash40-D1

آمار کاربران

نظرسنجی
نظر شما در مورد کیفیت سایت چیست؟

خیلی عالیه
میتونه بهتر باشه
جای کار داره
خوب نیست
نظری ندارم!



شما میتوانید در این مورد نظر مکتوب خود را بنویسید: مشاهد نتایج و ثبت نظر

نظرسنجی ها

تعداد آراء: 679    نظرات: 42

تبادل لینک
PicPars با تمامی وب سایتها و وبلاگها تبادل لینک میکند. ابتدا لینک ما در وب خود ثبت کنید و سپس لینک خود را از اینجا برای ما ارسال کنید. در اولین فرصت لینک شما در سایت ثبت می شود.

پیشنهاد ما

سفارش طراحی پروژه
مرورگر پیشنهادی ما
نرم افزار دانلود فایلها
برنامه فشرده سازی







امتیاز به سایت
امتیاز به این صفحه
با یک امتیاز مثبت از طریق Gmail تان از سایت حمایت کنید