نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

آموزش جامع AVR جلسه ۲۰ Timer Counter Tutorial

به نام خدا : سلام خدمت دوستان ، تو این مطلب از آموزش AVR، میخوام تایمر/کانتر تو AVR رو کارش رو “ی سره”! کنم، تو این مطلب انشاالله میخوامانواع مد تایمر در  میکروکنترلر AVR بگم و توضیح هر کدوم و پروژه هایی ازشون برای نمونه(یا لینک دادن به مطالب مربوطه)،دیگه عرضم به حظورتون میخوام به توضیح  ریجستر های تایمر بپردازم، دیگه چیزی نیست، کل مطلب همینه laugh
عجب دنیایی شده ها طرف مطلب جلسه ۱۹-۱۸-۱۶ رو میزاره تو سایتش و بعد مطلب جلسه ۲۰ رو bomb ….آخر الزمون! شده جان داش sarcastic
اینم بگم که کمربنداتون رو ببندید و سرجاتون محکم بشینید که این مطلب بدجور طولانی هستش. diablo

آموزش جامع AVR جلسه ۲۰ Timer Counter Tutorial

آموزش جامع AVR جلسه ۲۰ Timer Counter Tutorial

یه توصیه گارداشانه(همون داش هستش فقط به زبون ترکی ^_^)
مطالب زیر همش از دیتاشیت مگا ۱۶ هستش و خوندم و از دوستان سوال پرسیدم و سرچ کردم و... و یاد گرفتم و اینجا برا شما دوستان گزاشتم، لذا شما هم باید برا یاد گرفتن کم کم خوندن دیتاشیت رو شروع کنید، جان داش خیلی آسونه، حتی به روش علی اصغری crazy هم میشه ترجمه کرد دیتاشیت رو، متنش آسونه، یه دیکشنری هم رو سیستموتون نصب کنید و کلماتی که نمیدونید رو... >>>> خدایش میگم، شما تا یه جایی مطالب فارسی رو میخونید، ولی کارتون به جایی میرسه که دیگه مطلب فارسی گیرتون نمیاد و یا این که همشون کپی هستش از هم و خیلی ساده توضیح دادن و اون وقت میگید خاک تو سرم چرا انگلیسیم رو خوب نکردم و از اول کم کم شروع نکردم و تمرین نکردم و... >>>> الان مثلا من میخوای FPGA یاد بگیرم ، هر چی کتاب تو بازار بوده رو خریدم و خوندم ولی الان منبع فارسی دیگه نیست که من بخونم و باد کتاب های انگلیسی رو بخونم ولی چون انگلیسیم ضعبیفه عین چیز تو گل گیر کردم، لذا اومدم سمت AVR و خوندن دیتاشیت AVR تا با این کار هم انگلیسیم رو تقویت کنم و هم مهارت دیتاشیت خونی رو پیاد کنم و هم برا FPGA آماده بشم.
من حرف دلم رو صادقانه زدم، حالا هر طور صلاح میدونید عمل کنید، البته برا انگلیسی میتونید از نرم افزار اندرویدی زیر هم استفاده کنید، من خودم ازش استفاده میکنم و هم رایگان هستش و هم جامع و هم سطح بندی شده ، نرم افزارش داستان هستش، البته همه میگن ترجمه معمولی با ترجمه متن های تخصصی فرق داره، و دلیلشون هم اینه که اگه تو متون تخصصی معنای کلمات تخصصی اون رشته رو ندونی نمیتونی ترجمه کنی و از این جور حرفا(رفتم تحقیق کردم و اینا ر وبهم گفتن و اینا رو خوندم و...) فعلا با همین نرم افزار زیر و دیتاشیت AVR شروع کنید و کم کم کار کنید، دیتاشیت مگا ۱۶ رو که کافیه تو نت بسرچید تا شونصد تا لینک دانلود براتون بیاد و برا اون نرم افزار اندروید هم کافیهروی عکس زیر کلیک کنید :
Steps to Understanding
البته این روشی هستش که من دارم پیش میرم، دوستان و اساتید اگه روش بهتری نظری دارن بگن و ما و دوستان دیگه رو راهنمایی کنن.

انواع مد تایمر که تو مگا ۱۶ و ۸ و ۳۲ ما داریم.(بقیه میکرو ها رو اطلاع ندارم و باس بری دیتاشیتشون رو ببینید. mosking)

انواع مد تایمر/کانتر و نحوه عملکرد و آموزش هر کدام
mode/etc Normal CTC Fast PWM Phase Correct PWM
 کاربرد  تولید آسان زمان تولید آسان فرکانس
و زمان مورد نیاز
تولید پالس با قابلیت
تغییر آسان D.C

مثل Fast PWM هستش

فقط متقارن هستش

 نحوه شمارش

از Bottom شروع میشه

(مقدارش رو میشه تعیین کرد)

تا MAX (در تایمر ۸ بیتی برابر ۲۵۵

و در تایمر ۱۶ بیتی برابر ۶۵۵۳۵)

و بعد دوباره از Bottom شروع

میشه تا….

مثل مد نرمال هستش تقریبا،

از Bottom میشموره تا TOP

(که این TOP رو میشه مقدارش

رو تعیین کرد، با توجه به کاربرد

این مد ما اکثرا Bottom رو صفر

میزاریمش) و بعد مقدارش برابر

Bottom میشه و دوباره میشموره

تا TOP و….

از ۰ میشموره تا MAX (تایمر های ۸ بیتی)

و تا TOP (برا تایمر ۱۶ بیتی) و بعد ۰ میشه

و در این بین هر موقع مقدار ریجستر TCNT0

(که مقدارش این تعداد کلاک شمرده شده

درش قرار میگیره-همین ۰ تا MAX رو میگم)

با مقدار ریجستر OCRn برابر شد خروجی

OCn تغییر میکنه.

مثل مد Fast PWM هستش فقط

وقتی به MAX(هشت بیتی) یا TOP

(شونزده بیتی)رسید شروع میکنه

به نزولی شمردن تا Bottom و

دوباره صعودی میشه و…

 کاربرد در پروژه

کنترل دور موتور DC

کنترل میزان روشنایی LED

راه اندازی سرو موتور(پروژه ۱)

راه اندازی سرو موتور (پروژه ۲)

و هر چیزی که نیاز به تغییر ولتاژ دارد

 آموزش های
اختصاصی
آموزش AVR جلسه ۱۶ آموزش AVR جلسه ۱۸

آموزش AVR جلسه ۱۹

آموزش AVR جلسه۱۱

 آموزش AVR جلسه ۱۵

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

توجه : برا بحث کانتر هم یمتونید مطلب مقابل رو بخمنید : آموزش جامع AVR جلسه ۱۷ آموزش Counter
خوب خوب خوب، اینجا لازمه ریجستر ها رو توضیح بدم، چیزی که تو مطالب قبلی نگفتم و گفتم برید از فلان سایت که خوب توضیح داده بخونید، ولی الان لازمه که خودم توضیح بدم.(مطالبی که در زیر میزارم از دیتاشیت مگا ۱۶ هستش، که برا مگا ۳۲ و ۸ هم تقریبا همینه فک کنم، ولی برا میکرو های دیگه باس برید و دیتاشیتش رو نگاه کنید ببیننید همینه یا نه diablo )

پاسخ به ۴ سوال
سوال ۱ : فرق تایمر با کانتر ؟
جواب ۲ : بزار مطلب رو شروع کنم؛ بعد سوال بپرس diablo، الان بهت میگم.
خب، ببین داش! همون طور که از اسمشون معلومه تایمر کارش مربوط به زمان پمانه، و کانتر هم همون طور که از اسمش معلومه کارش شمارش ممارشه. sarcastic
بزار بیشتر توضیح بدم : این کانتر تو AVR ، یه چیز مجزایی نیست، همون تایمر خودمون هستش که اگه ریجستر ها رو به صورت خاصی تنظیم کنی، اون وقت بهش میگن کانتر crazy ، حالا کی میگن کانتر، وقتی منبع کلاک تایمر رو حالت اکسترنال میزاری، تایمر کلاک مورد استفاده خودش رو از پایه های شکل زیر تامین میکنه، یعنی پایه های مشخص شده در شکل زیر که میبینید، میایم و بهش کلاک میدیم و این کلاک اعمالی به این پایه ها میشه منبع کلاک تایمرمون.
منبع کلاک خارجی تایمر

سوال ۲ : خو کاکو منبع کلاک رو گزاشتیم رو حالت اکسترنال و تایمر کلاکش رو از اون پایه ها تامین کرد، که چی حالا، چه ربطی به کانتر داره؟؟؟
جواب ۲ : وای خد چقدر تو عجولی laugh و هی گیر میدی، بزار ماست مالیش کنم بره دیگه، گیر میدی ها... ، بزار الان میگم بهت :
بازم خب، همون طور که در زیر(توضیح ریجستر ها) میبینید، برا تعیین مبنع کلاک تایمر و گزاشتن منبع کلاک رو حالت اکسترنال دو تا گزینه داریم که یکیش حالت falling edge (لبه پایین رونده) هستش و گزینه بعد هم rising edge (لبه بالا رونده) که بسته به نوع کارتون باس یکی رو انتخاب کنید(مثلا ما گزینه rising edge رو انتخاب کردیم )، مثلا فک کنید یه سنسوری داریم که میخوایم باهاش تعداد نوشابه های عبوری از مکان مورد نظر رو محاسبه کنیم(به قول جابر الوندی :-D)، این سنسور وقتی نوشابه ببینه اون نوشابه رو نمیخوره بلکه اون سنسور وقتی نوشابه از جلوش رد میشه مثلا خروجیش ۱ منطقی(۵ولت مثلا) میشه، حالا ما خروجی این سنسور رو میایم وصل میکنم به اون پایه ها که در شکل بالا میبینید و منبع کلاک تایمر مورد نظر هستش؛ مثلا فک کنید میخوام از تایمر ۱ استفاده کنیم، میایم و خروجی اون سنسور رو به پایه T0 وصل میکنیم(در شکل بالا مشخص کردمش)، و هر بار که نوشابه laugh از جلوی سنسور رد میشه پایه T1 مقدار ۱ منطقی میشه و بعد دوباره ۰ میشه و باز اگه نوشابه از جلو سنسور رد بشه خروجی سنسور ۱ شده و همچنین پایه T1 هم ۱ میشه و بعد ۰ میشه و....
این طوری هر موقع سنسور نوشابه سنس کنه، خروجیش یک میشه و هر موقع سنس نکنه خروجیش ۰ میشه.
حالا در بالا گفتم که میکرو منبع کلاکش رو از پایه T1 میگیره، و رو حالت rising edge هستش.
حالا هر موقع که پایه T1 از حالت ۰ به حالت ۱ منطقی تغییر حالت بده مقدار TCNT1 یه واحد افزایش پیدا میکنه، لذا به ازای عبور هر نوشابه از جلوی سنسور ، خروجی سنسور از حالت ۰ به حالت ۱ تغییر یدا میکنه( و وقتی نوشابه به طور کامل از جلوی سنسور رد شد دوباره سنسور مقدارش ۰ میشه) و پایه T1 که به خروجی سنسور وصل هستش هم همین طور تغییر میکنه، و مقدار ریجستر TCNT1 یه واحل افزایش پیدا میکنه، و ما از طریق این ریجستر میتونید تعداد نوشابه های عبوری رو پیدا کنم.
لپ کلوم : با یک بار ۱ شدن پایه T1 (اول ۰ باشه و بعد ۱ بشه و این یعنی rising edge) مقدار ریجستر TCNT1 یه واحد افزایش پیدا میکنه......ولسلاااااااااام، دیگه این همه داستان گفتن نداشت که *focus

سوال ۳ : فرق  rising edge با falling edge ؟
جواب ۳ : خوب rising edge رو که کمو بیش در بالا گفتم، در زیر کامل میگم :
rising edge : وقتی یه پالسی مقدار ۰ باشه و بعد بشه ۱ بهش میگن rising edge، یعنی همون لبه بالا رونده ، که همون طور میبینید از ۰ رفته به ۱
falling edge : اینم مثل حالت بالا هستش فقط عکسش هستش، تو این حالت پالس اول مقدارش ۱ هستش و بعد ۰ میشه، لذا بهش میگن falling edge، که ترجه فارسیش میشه لبه پایین رونده چون از ۱ اومده به ۰، یعنی پایین رونده هستش، یعنی گیر نده، یعنی این قدر سوال نپرس یعنی کوفت یعنی چاکریم laugh

سوال ۴ : چرا تایمر ۰ و ۱ پایه های T0 , T1 رو دارن(یعنی ۱ پایه دارن) ولی تایمر۲, دو تا پایه داره(TOSC1,TOSC2) ؟
جواب ۴ : گیر دادی تو هم ااا laugh
خوب ببین اون تایمر۲ ، اون پایه ها برا ساخت ساعت میان ازش استفاده میکنن که یه کریستال حدودا ۳۲٫۷۶۸K (فک کنم) میان و بهش مصل میکنن چون کارش تولید ۱ ثانیه با دقت بالا هستش : مطلب مقابل رو میتویند بخونید، پروژه سومش مربوط به این موضوع هستش : انواع روش ساخت ساعت با AVR
لپ کلوم : از اون دو تا پایه برا تایمر۲ برا ساخت ساعت استفاده میشه و از اون پایه T0 و T1 برا بحث های مرتبط با کانتر(شمارش یه چیزی) استفاده میشه.

سوال ۵ : پرچم سرریز، پرچم مقایسه، وقفه سرریز، وقفه مقایسه چیست؟

جواب ۵ : خب, سوال خوبی پرسیدی ok
باس بگم که یه ریسجتر داریم به نام TCNT0 (تو تایمر ۰) که مقدار شمارش شده توسط تایمر درونش قرار میگیره(که یه عددی بین ۰ تا ۲۵۵ هستش) ، حالا اگه این مقدار به حداکثر خودش برسه(که این مقدار حداکثر رو تو جدول بالا میبینید، و یه کوچولو توضیحی دربارش هم دادم، که گفتم غییر از مد CTC حداکثر مقدار بقیه مدها برابر ۰XFF یا همون ۲۵۵ هستش ولی در مد CTC این مقدار ماکزیمم یا MAX قابل تنظیم هستش_توسط ریجستر OCR0_) سرریز رخ میده(یعنی دیگه بیشتر از این نمیتونه بشموره، یعنی یه ظرف آب داریم که دیگه نمیشه توش آب پر کرد یعنی کوفت یعنی ذهر مار این چه سوالی بود پرسیدی :-D)، و وقتی سرریز رخ بده، اگه بیت مربوط به وقفه سرریز رو فعال کرده باشین، وقفه رخ میده و توی اون وقفه میتونید مقدار TCNT0 رو صفر کنید یا هر بای دیگه ای که خواستین سرش بیارین، حالا اومدم و ما از وقفه خوشمون نیومد و یا به هر دلیلی نباید از وقفه استفاده کنیم، تو این حالت هم شرکت ATMEL (اگه درست گفته باشم) فکر اینجاش رو هم کرده و یه بیت گزاشته که وقتی سرریز رخ بده اون بیته ۱ میشه، که به بررسی این بیت میتونیم بفهمیم که سرریز رخ داده یا نه.
برا بحث پرچم و وقفه مقایسه هم داستان مثل داستان بالا هستش، یه ریسجتر داریم به نام OCR0 که مقدارش با مقدار TCNT0 بررسی میشه و اگه با هم برابر شدن وقفه مقایسه فعال میشه و پرچم مربوطه ۱ میشه مقدارش(یعنی قبلا ۰ بوده).
اگه چیزی نفهمیدید(که احتمال میدم همین طور باشه :-D) زیاد نگران نباشید در ادامه و سر جاش توضیح میدم همه ی این موضوعات رو، و در مطالب بعد پروژه هایی میزارم که متوجه میشید این بحث و بحث های دیگه رو انشاالله. smile

توضیح مدهای تایمر/کانتر در AVR

توضیح مدهای تایمر/کانتر در AVR

۱) توضیح مود Normal تایمر/کانتر

تو این مد شمارنده از  Bottom شروع به شمارش میکنه تا MAX (در تایمر ۸ بیتی برابر ۲۵۵ و در تایمر ۱۶ بیتی برابر ۶۵۵۳۵) و بعد دوباره از Bottom شروع میشه تا….

سوال : میشه مقدار BOTTOM و MAX رو تعیین کرد؟ یا این که همیشه BOTTOM برابر ۰ است و MAX هم همیشه تو تایمر ۰ و ۲ (تایمر های ۸ بیتی) برابر ۲۵۵ و تو تایمر ۱(۱۶ بیتی) برابر ۶۵۵۳۵ هستش ؟
جواب : خوب میبینم داشمون همیشه فعال هستش و کوچکترین چیز ها توجه میکنه good کارت درسته داش، د زیر توضیح میدم برات :
به نظرم سوالت مشکل داره یکم، ببین ما کلا به مقدار ۰ میگیم BOTTOM و به مقدار ماکس که تو تایمر ۰ برابر ۲۵۵ هستش میگیم MAX.
حالا ما میتونیم مقدار شروع و پایان رو تعیین کنیم(که فک کنم منظور شما این بوده باشه)، حالا چطور؟ >>> در زیر میگم :
مگه مقدار شمارش تایمر تو TCNTn قرار نمیگیره؟ >>> خوب ما میتونیم به جای این که مقدار ۰ به TCNTn بدیم، بیایم و یه مقدار اولیه دیگه به این ریجستر بدیم، مثلا اگه مقدار ۲۰ به این رجیستر بدیم، شمارش تایمر از ۲۰ شروع میشه و تا MAX، یعنی با توجه به این که تعداد کلاک های شمارش شده تو TCNTn قرار میگیره، لذا این ریجستر رو مقدار اولیه هر چی بهش بدین و بعد تایمر رو روشن کنید شمارش تایمر از اون مقدار اولیه آغاز میشه تا MAX

مورذ دیگه اینه که یه جورایی هم میشه ماکزیمم مقدار رو هم تعیین کرد، اون اینه که از ریجستر مقایسه استفاده میکنیم و بهش یه مقداری میدیم (مثلا ۲۰۰) و هر موقع مقدار TCNTn با OCRn برابر بشه، وقفه مقایسه رخ میده و تو اون وقفه ما باید مقدار TCNTn رو به حالت اولیه برگردونیم، این طوری وقتی مقدار شمارش شده (که مقدارش تو TCNTn قرار میگره) بعد از رسیدن به مقدار مورد نظر ما به مقدار مورد نظر ما بر میگرده.

لذا با این روش یه جورایی میشه مقدار شروع و پایان شمارش رو تعیین کرد ولی نمیشه مقدار BOTTOM و MAX رو تعیین کرد، چون این دو یه اصطلاح هستن به به کمترین و بیشتری مقدار اطلاق میشه.
وای خدا، بابام دراومد، دفه آخرت باشه از این سوالا میپرسیا laugh

۲) مود CTC تایمر/کانتر ( Clear Timer on Compare or CTC mode )

خب همون طور که از عنوان بالا معلوم هستش عبارت CTC مخفف جمله Clear Timer on Compare هستش.(راستی به این چند کلمه میشه گفتم ۱ جمله؟ :-D)
که یعنی وقتی مقادیر ریجستر TCNTn و OCRn با هم برابر میشه، مقدار تایمر (که تو ریجستر TCNTn ذخیره میشه) صفر میشه.

نکته از نون شب واجب تر :
تو هر سه مورد زیر بعد از مقایسه موفق وقفه مقایسه رخ میده(البته اگه وقفه مقایسه رو فعال کرده باشین) و فلگ مربوطه مقدارش ۱ میشه. و در آخر بعد از اجرای تمام کد های وقفه ( البته اگه وقفه مقایسه فعال باشه) مقدار TCNTn برابر صفر میشه.
تو تایمر ۰ یه ریجستر مقایسه داریم و اونم OCR0 هستش لذا تو تایمر صفر با OCR0 میشه مقدار TOP رو تعیین کرد که هر موقع مقدار تایمر باهاش برابر بشه مقدار TCNT0 برابر ۰ میشه.
و تو تایمر ۲ هم همین طور، هر موقع TCNT2 با OCR2 برابر بشه و...
اما اصل مطلب تو تایمر ۱ هستش که مقدار TOP رو فقط میشه با ریجستر های OCR1A و ICR1 تعیین کرد(همون طور که در شکل زیر میبینید.) و خبری از OCR1B نیست(همون طور که در جدول زیر میبینید.)
نحوه تعیین مد تایمر

اینم از دیاگرام(شکل!) تایمر تو مد CTC ، با توجه به توضیحاتی که در بالا دادم ببینم میتونید از شکل زیر چیزی بفهمید یا نه، اگه فهمیدید که یعنی این مطلب رو خوب یاد گرفتید و اگه نفهمیدید یعنی مثل من هستید. laugh (شوخی کردم، ولی جان داش روش فک کنید، سادس چیز خاصی نداره)
نحوه کارکرد مد CTC

فرمول محاسبه فرکانس در مد CTC تایمر/کانتر

از فرمول زیر زمانی میشه استفاده کرد که ما از پایه مقایسه ای OCn استفاده کنیم، و ریجستر های COMmn رو طوری تنظیم کنیم که روی حالت toggle قرار بگیره، البته اینا رو تو قسمت مربوط به هر ریجستر تو هر ۳ تایمر توضیح دادم.
البته الزامی به استفاده از پایه های مقایسه ای OCn نیستش و میشه از پایه های دیگه میکرو هم استفاده کرد، اینا رو من تموم حالتاش رو تو مطالب مربوط به CTC پروژه هاش رو قرار دادم و توضیحات لازم رو دادم که میتونید برید بخونید، لینک های مربوطه رو هم تو جدول بالا میبینید(البته فعلا همین کلیت رو یاد بگیرید و زیاد تو جزئیات نرید، فعلا این مطلب رو بخونید تا ته و بعد برید مطالب بعدی رو بخونید)
فرمول محاسبه فرکانس در مد CTC
همون طور که در شکل بالا میبینید از فرمول فوق میشه فرکانس تولیدی با این مود رو محاسبه کرد، اما چند تا نکته :

  1. مقادیری که N میتواند بگیرد : ۱, ۸, ۶۴, ۲۵۶, ۱۰۲۴
  2. مقدار ریجستر OCRn از ۰ هستش تا ۲۵۵ (برا تایمر های ۸ بیتی) و تا ۶۵۵۳۵(برا تایمر ۱۶ بیتی، تایمر ۱)
  3. اون صورت تقسیم(فرمول بالا)، همون فرکانس میکرو ما هستش.
  4. اون عدد ۲ برا اینه که نصف موج ما قراره ۰ باشه و نصف دیگه ۱
  5. این فرمول، فرکانسی که با مد CTC میشه تولید کرد رو نشون میده
  6. با توجه به فرمول بالا حداکثر فرکانس زمانی تولید میشود که N برابر ۱ باشه و مقدار OCRn هم برابر ۰ باشه، که حداکثر فرکانس تولیدی میشه نصف فرکانس میکرو مون(که البته این موضوع مشهوده، گفتم که گفته باشم، آخه دیدم یه جایی دربارش بحث شده بود تو ECA و ....بگذریم زیاد مهم نیست)

به این فرمول ها زیاد گیر ندید و روزنامه وار بخونید، تو مطالب مربوط به هر مد بیشتر میپردازیم به این چیزا.

کاربرد مد CTC

در جایی که بخوایم فرکانس رو به آسونی تغییر بدیم، میایم و از مد CTC استفاده میکنیم.

خو دیگه بسه زیاد توضیح دادم، بقیش بمونه برا مطالبی که برا هر مود تایمر به صورت اختصاصی تو سایت میزارم(قبلا گزاشتم). laugh
فک کردین میزارم قصر(غسر-غصر-غثر-قصر-قثر-قسر و... :-D)! در برید، من میدونو و شما. diablo

۳) مد FAST PWM تایمر/کانتر ( fast Pulse Width Modulation or fast PWM mode )

خوب این مد هم مثل مد CTC ، عنوان مد مخفف یه عبارت هستش که کمابیش گویای نحوه کارکرد اون مد هستش.
تو مد CTC میکرو میومد و از BOTTOM تا TOP میشمورد و بعد صفر میشد(و تو هر بار تکرار این اتفاق ما خروجی مقایسه گر یعنی OCn  یا هر پایه دیگه ای رو حالتش رو معکوس میکردیم) و این جالت برا تولید فرکانس مورد نظر ما خوبه و آسون ترین روش تولید فرکانس با D.C = 50% استفاده از مد CTC هستش.
اما تو مد FAST PWM تایمر میاد و از BOTTOM میشموره تا MAX و بعد حالت پایه خروجی مقایسه گر (یا هر پایه دیگه ای  که ما استفاده کردیم و موجمون رو روی اون پایه قراره بندازیم و روی اون پایه ایجاد کنیم) رو معکوس میکنه(البته عرفش اینه و ما باید به کمک ریجستر های COMmn طوری تنظیم کنیم که رو حالت toggle قرارش بدیم خروجی مقایسه گر رو) و هر موقع مقدارش به TOP برسه بازم خروجی مقایسه گر حالتش عوض میشه.
در نتیجه ۲ با حالت پایه مورد نظر ما تغییر میکنه : هنگام رسیدن به TOP و هنگام رسیدن به MAX

کاربرد مد FAST PWM

تو حالت FAST PWM موج ساخته شده توسط ما (توسط مد FAST PWM تایمر :-D) دارای فرکانس ثابتی هستش ولی در عوض میشه مقدار D.C (دیوتی سایکل، میزان ۰ یا ۱ بودن موجمون) رو تعیین کرد و لذا ما زمانی از مد FAST PWM استفاده میکنیم که قابلیت تغییر آسان D.C برامون مهم باشه، حالا این D.C که تغییر کنه در واقع ولتاژ موجمون تغییر میکنه(که اگه توضیحی که درباره D.C تو قسمت ریجستر های تایمر ۰ دادم رو بخونید متوجه موضوع میشید)، مثلا بخواین نور LED رو کم و زیاد کنید یا سرعت موتور رو تغییر بدید از این مد تایمر استفاده میکنید، که البته پروژه هایی برا این مد قبلا تو سایت گزاشتم و انشاالله بعدا هم اگه زنده باشم میزارم، چند تا از این مطالب و پروژه ها رو در بالا(جدول اول مطلب) مشاهده میکنید.

شکل زیر رو هم ببینید و  با توجه به توضیحاتی که در بالا دادم، ۲ دقیقه فک کنید دربارش تا کامل متوجه بشید، اگه متوجه نشدید با کله برید تو دیوار و باز ۲ دقیقه بشینید دربارش فک کنید و این عمل رو تا زمانی که به نتیجه نرسیدید تکرار کنید. rofl
کاربرد مد FAST PWM

فرمول های این قسمت هم بمونه برا مطالب مربوط بهش، اون فرمولی هم که برا مد ctc گفتم، اشتباه کردم و  جاش اینجا نبود، برید حالشو ببرید. laugh

۴) مد Phase Correct PWM تایمر/کانتر

در شکل زیر میتونید نحوه کار این مد تایمر رو ببینید :
آموزش تایمر
تو این مد تایمر از BOTTOM شروع به شمارش میکنه تا MAX و بعد نزولی شمارش میکنه تا به BOTTOM برسه و دوباره...
حالا فعلا این مد زیاد توضیح نمیدم، چون این که دقیقا کجا کاربرد داره رو خودمم هنوز نمیدونم و باید از اساتید بپرسم.

توجه ۰ : تو هر سه تایمر ریجستر های TIMSK و TIFR مشترک هستن.(چند تا بیتش برا تایمر ۰، چندتاش برا ۱ و چند تا از بیت ها هم برا تایمر ۲ هستش، هنگامی که مثلا از تایمر ۲ استفاده میکنیم، بیت های مرتبط با تایمر ۰ و ۲ رو در دو ریجستر فوق ۰ قرار میدیم، بهشون صفر میدیم، صفرشون میکنیم و… crazy)
توجه ۱ : محتوای شمارش تایمر تو ریجستر TCNTn قرار میگیره، که تو تایمر صفر اسمش TCNT0 هسش و تو تایمر ۲ برابر TCNT2 هستش و تو تایمر ۱ هم TCNT1 هستش.(همون طور که میبینید فقط رقم آخرش تغییر کیره به خاطر همین به طورت کلی اگه بخوان از محتوای شمارش تایمر جایی اسم ببرن به صورت کلی میگن TCCRn).
توجه ۲ : ریجستر مقایسه هم مثل بالا هستش، به صورت کلی بهش میگن OCRn که برا تایمر ۰ میشه OCR0 و برا ۲ میشه OCR2 و برا تایمر ۱ چون ۲ تا ریجستر به نام های A و B داره میگن OCR1A و OCR1B ، تایمر های ۰ و ۲ یه ریجستر مقایسه دارن و تایمر ۱ دو تا دونه داره.(ای کوفتش بشه diablo)
توجه ۳ : محتوای ریجستر OCRn همواره با محتوای ریجستر TCNTn مقایسه میشود، و هر موقع که با هم برابر شدن، تو کلاک بعدی وقفه مقایسه رخ میده(البته اگه وقفه مقایسه فعال باشه) و فلگ مربوطه ۱ میشه.

Whenever TCNT0 equals OCR0, the comparator signals a match. A match will set the Output Compare Flag (OCF0) at the next timer clock cycle. If enabled (OCIE0 = 1 and Global Interrupt Flag in SREG is set), the Output Compare Flag generates an output compare interrupt

توضیح ریجستر های تایمر ۰

ریجستر های تایمر ۰

قبل از این که ریجستر ها رو توضیح بدم براتون، یه جدول هستش که ۳ تا اصلاح توش هستش و باس اونو اول بگم pardon :
 میکروکنترلر AVR
BOTTOM : شمانده تایمرمون (که مقدارش درون TCNTn _ تو تایمر ۰ بهش میگن TCNT0) اگه مقدارش ۰X00 (یا همون ۰ به فرم ده دهی خودمون) بشه، اون وقت میگن شمارنده تایمر تو BOTTOM قرار داره.
MAX : وقتی شمارنده به بیشترین مقدار خودش برسه (که تو تایمر ۰ این مقدار برابر ۰XFF یا همون ۲۵۵ هستش)؛ اون میگن شمارنده تو MAX قرار داره(یا این که به MAX رسیده)
TOP : مقدار TOP هم میتونه ۰XFF باشه و هم این که به کمک ریسجتر OCRn (تو تایمر ۰ بهش میگن OCR0) مقدارش رو تعیین کرد.
توجه : تو مد نرمال مقدار TOP و MAX همیشه برابر هستش، در واقع میشه گفت چیزی به اسم TOP نداریم، چون تو مد نرمال تایمر کلش رو عین چیز میندازه پایین و از BOTTOM میشموره تا MAX و بعد دوباره مقدارش ۰ میشه و.... البته مقدار TOP رو میشه تعیین کرد توسط OCR0 که این که کی و کجا ما مقدار TOP رو تعیین میکنیم رو در ادامه یا مطالب بعد متوجه میشید خودتون، این موضوع برا تایمر های دیگه هم برقراره.(اینو اینجا گفتم و تو ۲ تا تایمر دیگه نمیگم diablo)

توضیح ریجستر TCCR0

توضیح ریجستر TCCR0
بیت ۰ و ۱ و ۲ : بیت های CS00,CS01,CS02برا تعیین تقسیم فرکانسی هستش که در زیر جدولش رو مشاهده میکنید.(یعنی این که چه مقدار از فرکانس کل میکرو به تایمر ۰ اختصاص پیدا کنه، مثلا ۱ هشتمش، یا ۱ شونزدهمش، یا...)
نکته ۰ : اگه هر سه، صفر باشن، تایمر/کانتر ۰ خاموش میشه.(که تو جدول زیر هم به این موضوع اشاره شده)
نکته ۱ : اگه بخواین کلاک مصرفی تایمر صفر از پایه T0 تامین بشه باس از یکی از دو سطر آخر جدول زیر استفاده کنید.

تغزیه تایمر 0 از کلاک خارجی
تنظیم کلاک تایمر 0

بیت ۳ و ۶ : بیت های WGM00 و WGM01 برا تعیین مد تایمر کانتر هستن، بسته به نیازتون یکی از مد ها رو انتخاب کنید و بر اساسش این دو بیت رو مقدار دهی کنید.
تعیین مد تایمر 0
چیزایی که از جدول بالا میشه فهمید ایناس(جان داش فقط غات نزنید bomb) :

  1. اون نکته زیر عکس رو کسی ترجمش رو میدونه بگه، ولی دست و پا شکسته اون چیزی که فهمیدم مهم نیست زیاد.
  2. تو ستون TOP مشاهده میکنید که غیر از مد CTC، بقیه مدها تا MAX (مقدار ۰XFF ِا همون ۲۵۵) میشمورن، ولی مد CTC تا وقتی به شمارش ادامه میده که مقدار شمرده شده توسطش کمتر از ریجستر OCR0 هستش، و وقتی مقدارش با این ریجستر برابر بشه، مقدار شمارش از Bottom دوباره آغاز میشه.
  3. ستون آخر میگه که پرچم سرریز تایمر صفر کی فعال میشه : در همه ی مد ها در مقدار MAX اون مد فعال میشه ولی در مد Phase Correct PWM در Bottom فعال میشه.
  4. ستون یکی مونده به آخر هم میگه : 

بیت ۴ و ۵ : این دو بیت COM00 و COM01 برا تعیین حالت پایه مقایسه (OC0 >>> عکسی از پایه OC0 در مگا۱۶ ) هستن، یعنی بعد از مقایسه موفق این پایه یه بلایی سرش بیاد، که در مد های مختلف این جدول مقدارش فرق داره، که در زیر میبینید : در زیر جداول رو توضیح میدم.
جدول ۳۹، ستون آخر, این جدول برا مد های غیر PWM (یعنی Normal و CTC) کاربرد داره.

  1. پایه OC0 غیر فعال باشد و در نقش ورودی خروجی عادی باشه(PORTB.3)
  2. بعد از انجام مقاسیه موفق حالت پایه OC0 معکوس شود(یعنی اگه ۰ هستش بشه ۱ و برعکس_منظور ۰ و ۱ منطقی هستش_)
  3. صفر کردن پایه OC0 بعد از انجام مقایسه موفق
  4. یک شدن پایه OC0 بعد از انجام مقایسه موفق

جدول ۴۰، ستون آخر، این جدول برا مد Fast PWM هستش.

  1. پایه OC0 غیر فعال باشد و در نقش ورودی خروجی عادی باشه(PORTB.3)
  2. این گزینه رزرو شده هستش و قابل انتخاب نیست.
  3. صفر کردن پایه OC0 بعد از انجام مقایسه موفق، و یک کردنش بعد از رسیدن تایمر به Bottom (حالت عادی)
  4. صفر کردن پایه OC0 بعد از رسیدن تایمر به Bottom، و یک کردنش بعد از انجام مقایسه موفق (حالت معکوس)

جدول ۴۱؛ ستون آخر، این جدول برا مد Phase Correct PWM هستش.

  1. غیر فعال کردن پایه OC0
  2. رزو شده و قابل انتخاب نیست
  3. صفر شدن پایه OC0 هنگام مقایسه موفق در بالا شمار(شمارش صعودی) و ۱ شدن هنگام مقایسه موفق در پایین شمار(شمارش نزولی)
  4. برعکس خط بالا(شماره ۳) >>>> حال نوشتن ندارم focus

تعیین حالت پایه مقایسه OC0

سوال : در بالا گفتید حالت عادی و حالت معکوس؛ یعنی چی من متوجه نمیشم؟
جواب : اگه یکم فک کنید به جواب میرسید، یعنی شکل موج مود مورد نظر رو در نظر بگیرید که کی ۰ میشه که ماکس میشه کی فلان کی بسال و...(که در بالا قبلا دربارش توضیح دادم) و اون حالت مقایسه رو هم در نظر بگید(همون مورد ۳ و ۴ بالا---که توش گفتم حالت عادی و حالت معکوس) ، و یه شبیه سازی تو فکرتون بکنید و به جواب میرسید......عمرا فهمیده باشید چی میگم focus
لپ کلوم این میشه، منظور از حالت عادی اینه که : در مد Fast PWM هر چی مقدار بیشتری به ریجستر مقایسه OCR0 بدیم، ولتاژ خروجی زیاد میشه، یعنی تو بحث D.C مقدار ۱ بودن از ۰ بودن بیشتر میشه. و تو حالت معکوس ، با عکس قضیه بالا مواجه هستیم، به همین خاطره که بهش میگن حالت معکوس blum

سوال : این D.C چی هستش؟
جواب :  shock نمیدونی؟ واقعا نمیدونی؟ dash  اشکالی نداره، خودم هم قبلا نمیدونستم جیه laugh
باس بگم خدمت داش گلم که این D.C مخفف DutyCycle هستش، یعنی موجی که ما درست میکنیم یه مقدارش ۱ باشه و چقدرش ۰ باشه(۰ و ۱ منطقی منظورمه)
که این میزان صفر و ۱ بودن، باعث تغییر ولتاژ پالس ما میشه.
لینک زیر رو ببینید(به زبون انگلیسیه)، حداقل به خاطر عکسی که توی لینک زیر هستش، لینک زیر رو ببینید : Duty cycle
این عکس زیر رو هم میتونید ببینید تا کامل متوجه بشید داستان رو :

Duty cycle چیست

سوال : این صفر و ۱ منطقی چیه؟ blush 
جواب : برم خودکشی کنم من laugh
منظور از ۰ منطقی همون ۰ ولت هستش و منظور از ۱ منطقی همون ۵ ولت هستش.
البته توضیح تقریبیش رو در بالا من گفتم، مثلا برا ۰ منطقی یه چیز بین ۰ ولت تا ۲ خورده ای ولت هستش و ۱ منطقی یه چیز حدود ۲٫۵ ولت تا ۵ ولت هستش تقریبا(حدودش یه چیز تو این مایه هاس)، ولی این توضیح رو شما ندید بگیرید و همون توضیح اولیه رو به خاطر داشته باشید.

سوال : منظور از کلاک و کلاک پالس و.. چیه؟
جواب : یکم بسرچی به جواب میرسی کاکو bomb، دو لینک زیر رو ببین heart :
کلاک پالس ییا پلس ساعت چیست ؟
Pulse Clock چیست؟

بیت ۷ : این بیت برا مد غیر PWM هستش، که یه مقایسه اجباری انجام میده، و این که کجا کاربرد داره فعلا چیزی به ذهنم نمیرسه، کسی چیزی میدونه بگه و اگه بعدا فهمید بگه و... good ، تو حالت عادی این بیت رو ۰ کنید.

خوب امیدوارد تا اینجاد خسته نشده باشید، چون هنوز چیزی نگفتم. diablo ، البته برا دو مد بعدی دیگه کار ساده تره، جداول و ریجستر های هر ۳ تایمر تقریبا مشابه هستش، حالا یه تایمر یه ریجستری داده بقیه ندارن، یه سری ریسجتر مشترک هستش(چند تا بیتش برا این تایمر، چند تاش برا اون تایمر و...)، بگذریم از این حرفا، فعلا یه ۳ تا صلوات بفرستید. smile






 

توضیح ریجستر TCNT0

تو این ریجستر محتوای تایمر/کانتر قرار میگیره، همون شمارش از Bottom تا Max رو میگم.(البته ممکنه شمارش از BOTTOM باشه تا TOP, این ریجستر هم خوندنی هستش و هم نوشتنی، میتونی مقدارش رو بخونی و میتونی با نوشتن مقدار توش تعیین کنی که تایکر/کانتر ۰ از چه مقداری شروع به شمارش کنه.)
توضیح ریجستر TCNT0

توضیح ریجستر OCR0

توی این ریجستر هم مقدار مقایسه رو مینویسید، این مقدار با مقدار ریجستر TCNT0 مقایسه میشه و در صورت برابری این ها اون بالای مورد نظر( که توسط بیت های COM00 و COM01 تعیین کردیم) سر پایه خروجی OC0 میاد.
توجه مهم : اینم همین جا بگم که برا استفاده از پایه OC0 باس این پایه رو خروجی تعریف کنید(توسط ریجستر DDR)

توضیح ریجستر OCR0

 

توضیح ریجستر TIMSK

این ریجستر یکی از اونایی هستش که من گفتم بین هر سه تایمر مشترکه و.... buba بگذریم از این حرفا و بریم سر اصل مطلب :
بیت ۰ (TOIE0) : با فعال کردن این بیت، به شرط فعال بودن وقفه سراسری، وقفه سرریز فعال میشه و در صورتی که مقدار ریجستر TCNT0 از MAX بیشتر بشه سرریز رخ میده و این وقفهفعال میشه.(که قبا هم تو اون سوال دوستمون تو اون بالا توضیح دادم mail)
بیت ۱(OCIE0) : با فعال کردن این بیت و به شرط فعال بودن وقفه سراسری، وقفه مقایسه فعال میشه و در صورت برابری ریجستر های TCNT0 و OCR1 این وقفه رخ میده.
توجه : اگه از وقفه چیزی نمیدونید مطلب مقابل رو ببینید : آموزش جامع میکروکنترلر AVR جلسه۳
توضیح ریجستر TIMSK

توضیح ریجستر TIFR

بیت ۰(TOV0) : این بیت پرچم(Flag) سر ریز هستش، و اگه سرریز رخ بده این بیت ۱ میشه.
بیت ۱(OCF0) : این بیت پرچم(Flag) مقایسه هستش، و اگه مقایسه موفق باشه این بیت ۱ میشه.
این دو بیت رو هنگام مقدار دهی ریجستر ها در اول پروژه صفر مقدار دهی کنید.
و بعد از این که فهمیدید که سرریز یا مقایسه رخ داده، برا غیر فعال کردن این بیت و آماده کردن برا دفه بعد مقدار ۱ به این بیت بدید، حالا ممکنه سوال مطرح بشه که چرا صفر ندیم و برا غیر فعال کردن(آماده کردن برا دفه بعد) باس بهش یک بدیم؟ من باس بگم که دلیلش رو نمیدونم چرا اینطوره pardon، اگه کسی میدونه به ما بگه.
توجه : زیاد خودتون رو اذیت نکنید، میدونم سخت متوجه میشید و احتمالا قاطی کردید مباحث رو، اشکالی نداره، در ادامه یا جلسه بعد یه ۲۰ تا پروژه میزارم براتون تا با کارکرد و عمرکرد تک تک بیت های ریجستر ها آشنا بشید، چی فک کردید، فک کردید میزارم دست خالی از این جا برید blush.
توضیح ریجستر TIFR

خدااااااااااااااااااا رو شکررررررررررررررررر، ریجستر های تایمر صفر تموم شد. laugh جان داش خسته شدم، یه ۳ تا صلوات بفرستید فعلا(این صلواتایی که میگم هزینه استفاده از مطلب هستشااااا، زرنگ بازی درنیارید یه وقت و هزینه رو پرداخت نکنید. focus)
خداییش از بحث این طوری توضیح دادن حالم بهم میخوره، بیشتر دوس دارم به صورت پروژه محور توضیح بدم مسائل رو، ولی تحمل کنید تا برسیم به پروژه ها اونجا حسابی بهتون خوش میگذره و قشنگ مباحث رو یاد میگیرید(ای وای من، دماغم چرا بزرگ شد :-D)

توضیح ریجستر های تایمر ۱

ریجستر های تایمر ۱

خب خدا خودش کمک کنه، تا نرم سراغ روش ماسمالیزیسون laugh ؛ و خوب(در حد توانم) بتونم توضیح بدم، کمربند ها رو ببنید تا بریم سراغ تایمر ۱ که ... بگذریم bomb ---شوخی کردم بالا چیز خاصی نداره، بسه دیگه بریم سر اصل مطلب :

ریجستر های تایمر ۱
خوب همین اول کار اون ۳ تا اصلاح بالا رو بگم، این سه تا اصطلاح تو هر ۳ تایمر وجود داره، و تو دیتاشیت اومده ابتدای هر تایمر اینا رو توضیح داده.
BOTTOM : شمارنده وقتی به ۰ (به فرم ده دهی و ۰X0000 به فرم هگزا دسیمال) برسد میگوییم به BOTTOM رسیده است.
MAX : شمارنده وقتی به ۶۵۵۳۵ (به فرم ده دهی و ۰XFFFF به فرم هگزا دسیمال) برسد میگوییم به MAX رسیده است.
توجه : شاید براتون سوال شده باشه که ۶۵۵۳۵ از کجا اومد، باید بگم که چون تایمر ۱ یه تایمر ۱۶ بیتی هستش و ۲ به توان ۱۶ میشه ۶۵۵۳۶ و چون شمارش از صفر شروع میشه لذا مقدار ماکس برابر ۶۵۵۳۵ هستش(و اگه قرار بود شمارش از ۱ شروع بشه اون وقت مقدار ماکس برابر ۶۵۵۳۶ میشد، ولی فعلا که از ۰ شروع میشه laugh )
TOP : مقدار TOP رو میشه تعیین کرد که میتونه ۰X00FF, 0X01FF, 0X03FF باشه با مقدارش رو توسط ریجستر های OCR1A یا ICR1 تعیین کرد، تعیین کردن مقدار TOP یه چیز تو مایه های تعیین کردن مقدار MAX هستش، حالا تو مد های تایمر کاربرد TOP رو میبینید خودتون.(ِیعنی زیاد گیر ندید sarcastic اگه متوجه نشدید بیخیال.....در ادامه و مطالب بعد متوجه کاربردش میشید.)

توضیح ریجستر TCCR1A و TCCR1B

خوب این ریجستر TCCR1A به همراه ریجستر TCCR1B تقریبا میشه گفت همون بیت های ریجستر TCCR0 رو دارن و یه سیری بیت هایی دارن که تو TCCR0 نیست.
خوب چون این دو تا ریجستر به همدیگه مرتبط هستن و دلایل دیگه لذا با همدیگه توضیحشون میدم.
توضیح ریجستر TCCR1A
توضیح ریجستر TCCR1B

بیت ۰ و ۱ و ۲ ریجستر TCCR1B(بیت های CS10,CS11,CS12) : این ۳ بیت برا تعیین فرکانس کاری تایمر/کانتر هستش، که در تایمر ۰ دربارشون توضیح دادم و الان فقط جدولش رو برا تایمر ۱ میزارم.
نکته ۱ : اگه هر سه بیت فوق صفر باشن، تایمر/کانتر ۱ خاموش میشه.(که تو جدول زیر هم به این موضوع اشاره شده)

نکته ۲ : اگه بخواین کلاک مصرفی تایمر ۱ از پایه T1 تامین بشه باس از یکی از دو سطر آخر جدول زیر استفاده کنید.

 
تغزیه خارجی کلاک تایمر1
تعیین فرکانس تایمر 1

بیت ۰ و ۱ ریجستر TCCR1A و بیت ۳ و ۴ ریجستر TCCR1B (بیت های WGM10,WGM11,WGM12,WGM13) : این ۴ تا بیت برا تعیین مد تایمر/کانتر ۱ هستن(بیت های تعیین مد تایمر ۰ رو یه نگاه بندازیش که تقریبا شبیه همین بیت هاس) که طبق جدویل زیر مقدار دهی میکنیم این ۴ تا بیت رو.
نحوه تعیین مد تایمر

بیت ۴ و ۵ و ۶ و ۷ ریجستر TCCR1A(بیت های COM1A0,COM1A1,COM1B0,COM1B1) : این ۴ تا بیت برا تعیین حالت پایه های مقایسه ای تایمر/کانتر ۱ هستن، تو تایمر۱ بر خلاف تایمر۰ که یه دونه پایه مقایسه (OC0) داشتیم، تو تایمر ۱ دو تا پایه مقایسه به نام های OCR1A و OCR1B داریم(که میتونید شکل مقابل رو ببینید : عکسی از پایه OCR1A و OCR1B در مگا ۱۶)، که حالت این دو تا پایه رو توسط جداول زیر تعیین میکنیم :
جدول ۴۴، مد Normal و CTC، توضیح اینا هم چیز خاصی نداره و تقریبا مثل تایمر/کانتر۰ هستش

  1. پایه های OCR1A و OCR1B در نقش ورودی خروجی هستن و در نقش مقاسه ای نیستند.
  2. تغییر حالت پایه های فوق، اگه صفر باشن ۱ میشن و برعکس (البتهدر صورت مقایسه موفق)
  3. صفر شدن این پایه ها در مقایسه موفق.
  4. یک شدن این پایه ها در مقایسه موفق.

جدول ۴۵، مد Fast PWM :

  1. حالت عادی پایه ها و بودن در نقش ورودی خروجی و غیر فعال بودن نقش مقایسه ای.(هر دفه یه تعریفی میگم :-D؛ البته همشون یکسان هستند.)
  2. اگه بیت های WGM13:0 مقدارشون ۹ یا ۱۴ بشه(اگه متوجه نشدید بپرسید)، پایه OCR1A معکوس میشه(بعد از مقایسه موفق) و پایه OCR1B غیر فعال میشه و در نقش ورودی خروجی قرار میگیره و نقش مقایسه ایش غیر فعال میشه، به ازای مقدار دیگه برای این ۴ تا بیت، هر دو پایه مقایسه ای غیر فعال میشن و در نقش ورودی/خروجی قرار میگیرن و نقش مقایسه ایشون غیر فعال میشه.
  3. صفر کردن این دو پایه در مقایسه موفق و ۱ کردن این دو پایه در Bottom
  4. عکس حالت بالا (حالت ۳)

جدول ۴۶، مد Phase Correct PWM :

  1. حالت ورودی خروجی بودن و غیر فعال بودن حالت مقایسه ای این دو پایه.
  2. اگه بیت های WGM13:0 همگی ۱ باشن، پایه OCR1A معکوس میشه(بعد از مقایسه موفق) و پایه OCR1B غیر فعال میشه و در نقش ورودی خروجی قرار میگیره و نقش مقایسه ایش غیر فعال میشه، به ازای مقدار دیگه برای این ۴ تا بیت، هر دو پایه مقایسه ای غیر فعال میشن و در نقش ورودی/خروجی قرار میگیرن و نقش مقایسه ایشون غیر فعال میشه.
  3. ۰ کردن این دو پایه(OCR1A و OCR1B) در مقایسه موفق بالا شمار(شمارش صعودی) و ۱ کردنشون در مقایسه موفق پایین شمار(شمارش نزولی)
  4. عکس حالت بالا (حالت ۳)

پایه های مقایسه تایمر

بیت های ۲ و ۳ ریجستر TCCR1A (بیت های FOC1A,FOC1B) : این که کاربردشون کجاس رو نمیدونم دقیقا.

بیت ۶ و ۷ ریجستر TCCR1B (بیت های ICES1,ICES0) : این که کاربردشون کجاس رو نمیدونم دقیقا.

توضیح ریجستر TCNT1H و TCNT1L

این دو ریجستر در واقع همون ریسجتر TCNT0 توی تایمر۰ هستن، ولی چون باس یه مقدار ۱۶ بیتی توی TCCR1 ذخیره بشه، لذا دو تا ریسجتر داریم که نصف این ۱۶ بیت (اون ۸ بیت پر ارزش) تو TCNT1H ذخیره میشه و اون ۸ بیت دیگه(۸ بیت کم ارزش) تو TCNT1L ذخیره میشه.
ولی ما میتونیم به کمک TCNT1 به این دو ریسجتر دسترسی داشته باشم و بهش مقدار بدیم و مقدارش رو بخونیم.
توضیح ریجستر TCNT1H و TCNT1L


توضیح ریجستر های  OCR1AH و OCR1BH  +  OCR1AB و OCR1BL : اون ۴ تا ریجستر هم داستانشون میثل دو ریسجتر بالاس و مثل همون ریجستر OCR0 در تایمر۰ هستن تقریبا، ولی چون تایمر۱ شونزده بیتی هستش لذا برای هر کدوم از پایه های مقایسه ای دو تا ریسجتر داریم که تو هر کدوم ۸ بیت از دیتا ر وتوش ذخیره میکنیم.
به کمک OCR1A و OCR1B میتونید به این ۴ تا ریجستر بالا دسترسی داشته باشم و مقدارشون رو بخونیم و تغییر بدیم.

توضیح ریجستر های تایمر ۲

ریجستر های تایمر ۲

ریجستر های تایمر ۲
خوب این جدول هم مثل دو تایمر دیگس، مقدار BOTTOM برابر ۰ و مقدار MAX برابر ۲۵۵ یا ۰XFF (چون تایمر۲ هشت بیتی هستش و ۲ بتوان ۸ منهای ۱ میشه ۲۵۵) و مقدار TOP رو هم میشه تعیین کرد توسط ریجستر OCR2....مختصر و مفید blum

توضیح ریجستر TCCR2

توضیح ریجستر TCCR2
بیت ۰ و ۱ و ۲ : مثل ۲ تایمر قبل، این ۳ بیت برا تعیین فرکانس کاری تایمر۲ هستن، که تو جدول زیر مشاهده میکنید.
نکته ۰ : اگه هر سه بیت فوق صفر باشن، تایمر/کانتر ۲ خاموش میشه.(که تو جدول زیر هم به این موضوع اشاره شده)
نکته ۱ : برخلاف تایمر ۰ و ۱ که پایه هایی با نام T0 و T1 داشتن، تو تایمر ۲ دیگه همچین پایه ای نداریم، در عوض ۲ تا پایه داریم به نام های TOSC1, TOSC2 که برا بحث ساخت ساعت به کار میره، حالا فعلا زیاد باهاش کاری نداریم تو مطالب مربوطه بهش اشاره میشه و شده و خواهد شد انشاالله smile

تعیین فرکانس کاری تایمر2
کاربرد پایه های TOSC0..1

بیت ۳ و ۶ ( WGM21:0: Waveform Generation Mode) : این ۲ بیت برا تعیین مد تایمر/کانتر۲ هستن.
جدول تعیین مد تایمر 2

بیت ۴ و ۵( COM21:0: Compare Match Output Mode) : این دو تا بیت ها برا تعیین حالت پایه مقایسه ای OC2 هستن، که در صورت مقایسه موفق چ بلایی سرش بیاد و نیاد و این که اصلا این پایه تو نقش ورودی/خروجی باشه یا در نقش پایه مقایسه ای....چون تو ۲ تایمر قبل توضیحش دادم دیگه توضیح نمیدم چون حالش رو ندارم pardon
Compare Match Output Mode

بیت ۷( FOC2: Force Output Compare) : مثل ۲ تایمر دیگه کاربرد اینو هم نمیدونم(فهمیدم میگم)

The FOC2 bit is only active when the WGM bits specify a non-PWM mode. However, for ensuring compatibility with future devices, this bit must be set to zero when TCCR2 is written when
operating in PWM mode. When writing a logical one to the FOC2 bit, an immediate compare
match is forced on the waveform generation unit. The OC2 output is changed according to its
COM21:0 bits setting. Note that the FOC2 bit is implemented as a strobe. Therefore it is the
value present in the COM21:0 bits that determines the effect of the forced compare.
A FOC2 strobe will not generate any interrupt, nor will it clear the timer in CTC mode using
OCR2 as TOP.
The FOC2 bit is always read as zero.

 

توضیح ریجستر TCNT2 و OCR2

توضیح ریجسترهای تایمر

توضیح ریجسترهای تایمر
این دو ریجستر مثل TCNT0 و OCR0 هستن(یعنی توضیح اضافه نمیدم و برید توضیحات TCNT0 و OCR0 مربوط به تایمر۰ رو بخونید mosking)

توضیح ریجستر TIMSK و TIFR

دو بیت آخر هر دو ریجستر فوق(بالا) مربوط به تایمر ۲ هستش(و دو بیت اول مربوط به تایمر۰ و بقیه مربوط به تایمر۱)، لذا برید همون توضیحات تایمر۰ رو بخونید برا این دو ریجستر که توضیحش و نکاتش مثل هم هستش و فرق نداره.
توضیح ریجسترهای تایمر

توضیح ریجسترهای تایمر

خب خب خب، این ریجستر های تایمر ۲ هم تموم شد laugh ، خداییش عجب ماست مالیش کردماااا، راسش رو بخواین توضیحاتش با تایمر ۰ اکثرا یکی بود به خاطر همین بود که میگفتم برید توضیحات تایمر۰ رو بخونید، مطلب هم طولانی هستش همین طوری، نمیخواستم چیز تکراری بنویسم و به خاطر همین ارجاع دادم به تایمر۰٫ sorry

البته تایمر ۲ یه ریجستر دیگه به نام  ASSR داره که برا این که بحث زیاد سخت نشه بزار بمونه برا جلسه و یا جلسات بعد(هر موقع وقت داشتم، حسش بود و خاطرم بود diablo )
ASSR

یه ریجستر دیگه هم به نام SFIOR هستش که اینم بمونه برا بعد.
SFIOR

با توجه به طولانی شدن مطلب، امکان اشتباه تایپی، علمی و… خیلی زیاده، لطفا در صورت مشاهده بهم بگید.(پیشاپیش دمتون گرم heart )
و چون این مطلب رو در مدت زیادی نوشتم، که به دلایلی هی عقب میوفتاد ممکنه قبلا یه جایی از مطلب چیزی رو نگفتم و یا ناقص گفتم که الان خاطرم نیست، اگه جایی ناقص بود و یا نگفتم و …. لطفا بهم بگید(البته غیر از ۶ موردی که در زیر بهش اشاره کردم و گفتم که اینا رو توی این مطلب نگفتم و توی مطلب بعد میگم.)
خوب این مطلب هم تموم شد، امیدوارم راضی بوده باشین، اگه هم خوب نبود مطلب دیگه به بزرگی خودتون ببخشید، اگه جایین رو بد گفتم یا کم توضیح دادم و شما متوجه نشدید و براتون سوالی پیش اومده و… میتونید تو قسمت نظرات یا انجمن(فرقی نداره کجا مطرح کنید) مطرح کنی تا در حد توانم(دانش من هم در این زمینه محدود هستش و خدای AVR نیستم که….) به سوالاتتون جواب بدم.

تو یه سایتی میخوندم نوشته بود میشه برا دفاع از حرم و محور مقاومت رفت سوریه، حالا بریم تحقیق کنیم ببینیم چطوریاس، راسته دروغه و… چون ما نه گذنامه دارم و نه پول برا گذرنامه گرفتن و نه سربازی رفتیم و نه هیکلی داریم، ببینیم داستانش چطوریاس و بعد شما رو خبر میکنم، حالا شما هم اگه چیزی میدونید به ما هم بگید.
به امید روزی که کنار برادرانمون با دشمنان اسلام بجنگیم، و این طور نباشه که تو خونه، راحت بشینیم (و در حالی که برادرانمون در حال جنگ و شهید شدن و تحت ظلم و ستم هستن) و اسم خودمون رو هم بزاریم مسلمون و به شیعه بودن خودمون افتخار کنیم…. اینجور شیعه بدرد سینه قبرستون میخوره(به نظر من)، به امید روزی که لیاقت پیدا کنیم و در کنار برادرامون در راه خدا جهاد کنیم.

چیزایی که تو این مطلب توضیح ندادم bomb

  1. ریجستر ASSR از تایمر ۲
  2. ریجستر SFIOR از تایمر ۲
  3. بیت ۷ام ریجستر های TCCR0, TCCR2
  4. بیت های ۲ و ۳ ریجستر TCCR1A
  5. بیت ۶ و ۷ ریجستر TCCR1B
  6. توضیح مد Phase Correct PWM و این که کجا کاربرد داره و...

چیزایی که نگفتم ایناس، اگه چیز دیگه ای رو هم نگفتم و جا انداختم بگید تا از خاطرم نره.

هزینه استفاده از مطلب : راستی برا کسایی که تازه از دنیا رفتن ۱ فاتحه بخونید و ۵ تا صلوات برا تعجیل در فرج و برا سلامتی رهبر،علمای اسلام و مسولین خدمت گزار به اسلام و ایران بفرستید.(مردی بگو تعداد صلوات ها زیاده تا بیام اون جا و…. focus )…..فک کنم برا این ۷۵۰۰ واژه ای که توی این مطلب من نوشتم این هزینه کمی باشه.
زیاد مزاحتمون نمیشم، فعلا یا علی. bye

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ السارِچین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
29

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    فروهر

    البته منظورم ورژن جدید کدویژنه که با دادن مقدار پریود خروجی موردنیاز و اعلام D.C به اون و زدن دکمه Apply خودش رجیسترها رو مقداردهی میکنه…..شماکه خودت استادی…من چون تازه AVR رو شروع کردم برام مهمه که راه درست یادگیری رو برم
    بازم ممنون داداش

  2. Avatar

    مهمان

    فروهر

    سلاااام…من که خیلی از اموزش تایمرها استفاده کردم دمت گرم و سرت خوش باد…فقط یه سوال…دوستی میگفت توی کدویژن میشه از کدویزاردش استفاده کرد برای تنظیمات تایمر ….راستش من تاحالا سمتش نرفتم ولی نظر شما برام مهمه که درین مود چیه؟….شاید این کار باعث تنبلی بشه شایدم نه و کار راحتتر بشه….
    اگه نظر تخصصی بدی ممنون میشم
    bye

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام – کدویزارد! – من باهاش کار نمیکینم و یکبار دیتاشیت رو میخونم – کتابخونه براش مینویسم و تمام.

  3. Avatar

    مهمان

    علی

    سلام
    اگر بخوایم از طریق arduino uno شمارش رو انجام بدیم باید چیکار کنیم؟
    مثلا فرض کنید میخوایم یک encoder که به یه موتور وصل هستش و به ازای چرخش موتور پالس میده رو، تعداد پالس هاش رو بشمریم و به موتور دستور بدیم که هروقت تعداد پالس ها مثلا 100 تا شد موتور بایسته.
    مطالب عالی دم شما گرم.

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

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

  4. Avatar

    مهمان

    مریم

    سلام خسته نباشید میشه ی خورده تو کد نویسی این سوال کمکم کنید. مربوط یه fastpwm است
    یک موتور dc با دور نامی 160 دور بر دقیقه به گونه ای کنترل کند که موتور با دور متغبر کار کند.مثلا در 10 ثانیه ی اول 10 دور بر دقیقه می چرخد پس از 20 ثانیه 50 دور و پس از یک دقیقهبه دور نامی 160 دور می رسد.
    مقدار dc و ocr تو این مراحل چه جوریه؟؟

  5. Avatar

    مهمان

    پروفسور

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

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام
      بر میکرو – هیچی.

  6. Avatar

    مهمان

    حسن

    سلام آقا مهدی اول یه تشکر ویژه میکنم بابت تمام زحماتت یه سوالی برام پیش اومده تو تایمر یک در حالت CTC از دو تا OCR میتونیم استفاده کنیم از طرفی قرار شد وقتی TCNT1 برابر OCR شد صفر بشه خب حالا اینجا که هم OCR1A داریم هم OCR1B تکلیف چیه؟کانتر به کدوم یک از اینا رسیید ریست میشه؟اصلا فرض کنیم تو OCR1A مقدار ۲۰۰ رو ریختیم و به اون یکی اصلا دست نزدیم خب تو حالت پیش فرض مگه مقدار OCR1B صفر نیست؟یعنی کانتر همیشه صفر میمونه ؟ بدجوری گیج شدم لطفا راهنمایی کن

  7. Avatar

    مهمان

    حسن

    سلام آقا مهدی اول یه تشکر ویژه میکنم بابت تمام زحماتت یه سوالی برام پیش اومده تو تایمر یک در حالت CTC از دو تا OCR میتونیم استفاده کنیم از طرفی قرار شد وقتی TCNT1 برابر OCR شد صفر بشه خب حالا اینجا که هم OCR1A داریم هم OCR1B تکلیف چیه؟کانتر به کدوم یک از اینا رسیید ریست میشه؟اصلا فرض کنیم تو OCR1A مقدار ۲۰۰ رو ریختیم و به اون یکی اصلا دست نزدیم خب تو حالت پیش فرض مگه مقدار OCR1B صفر نیست؟یعنی کانتر همیشه صفر میمونه ؟ بدجوری گیج شدم لطفا راهنمایی کن dash

  8. Avatar

    مهمان

    علیرضا اهنی

    سلام.
    چرا برنامه زیر در عمل به راحتی کار میکند اما د شبیه ساز پروتروس کار نمی کند؟ dash
    http://paste.debian.net/977176/

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      دفه های قبل هم گفتم – این دفه هم میگم – با پروتئوس کار نکن

  9. Avatar

    مهمان

    علیرضا اهنی

    سلام.
    مد Phase Correct PWMرو تو تایمر ۰میگی؟

  10. Avatar

    مهمان

    مهدیه

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

  11. Avatar

    مهمان

    محمد

    باسلام چه جوری میشه از تایمر برای خوندن تعداد پالس استفاده کرد منظورم همون کانتر است ؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

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

  12. Avatar

    مهمان

    123

    ببخشید من یه برنامه توی کدویزن نوشتم وقتی کامپایل میکنم این ارور رو میده :
    : function return type ‘void’ doesn’t match its previous declaration: ‘unsigned char’ from file
    و خودش یه صفه باز میکنه راجب ال سی دی توش یچیزایی توضیح داده. نمیدونم مشکل برنامم کجاست sad اخه همین برنامه رو یبار دیگه نوشتم اصلا ایرادی نداشت ولی اینجا که با کدویزن تنظیمات رو بهش دادم داره ایراد میگیره

  13. Avatar

    مهمان

    Mahdi

    سلام داداش شرمنده همش سوال میپرسم sad با کد ویژن به مشکل بر خوردم وقتی میخوام کامپایل کنم ارور AVRASM2.exe رو میده میگه باید تو ریشه اصلی فایل bin باشه البته هست و همه چیزشم اوکی هست ولی جواب نمیده و هگز رو تولید نمیکنه کلافم کرده:(((((((((

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      کدهای پروژه رو بردار و یه پروژه جدید ایجاد کن و کد ها رو توش paste کن، اگه بازم ارور داد یعنی کد های پروژت مشکل دارن و…

  14. Avatar

    مهمان

    Mahdi

    سلام داداش یه مگا ۱۶ دارم به لوک بیت هاش دست زدم الان قفل کرده و پروگرامر بازش نمیکنه چیکار کنم تا قفلش بشکنه؟؟؟

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      والا نمیدونم….

      • Avatar

        مهمان

        علیرضا اهنی

        سلام.
        دیگه باید میکرو تو بندازی بره laugh
        مشکلات دیگه با پروگرامر هاتل و STK500وSTK300حل میشه smile

  15. Avatar

    مهمان

    قاسم شرفیان

    مثل همیشه عالی عالی

  16. Avatar

    مهمان

    علی

    سلام حداکثر جریان مصرفی یک atmega32aچقدر است دوست عزیز
    با سپاس

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

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

  17. Avatar

    مهمان

    mostafa

    سلام
    دمت گرم مهدی جان آموزشات خیلی عالیه انشاالله موفق باشی داداش
    من تو پروژم باید از ماژول sim908استفاده کنم تو اینترنت چیز درستی و حسابی پیدا نکردم اگه میتونی راهنماییم کن
    خیلی ممنون

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      والا با این کار نکردم و میتونی تو سایت های خارجی کلی مطلب دربارش پیدا کنی
      فعلا من تو فاز pcb هستم laugh
      دارم یاد میگیرم تا انشاالله بیام تو سایت یاد بدم….اوف عجب چیزی بشه laugh

  18. Avatar

    مهمان

    سعید

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

  19. Avatar

    مهمان

    سعید

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