آخرین نوشته‌ها
خانه | میکروکنترلر | دوره آموزشی AVR | مد مقایسه (CTC) در تایمرهای AVR – (جلسه ی ۱۵)

مد مقایسه (CTC) در تایمرهای AVR – (جلسه ی ۱۵)

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

  • توضیحات
  • کدنویسی
  • شبیه سازی

ctc-title

مفاهیم پایه ی تایمرها و کاربردشان در پست های پیشین بیان شد. در این جلسه می خواهیم در مورد یک مد خاص کارکرد تایمرها یعنی مد مقایسه (CTC) صحبت کنیم. عبارت CTC مخفف Clear Timer on Compare و به معنای «پاک کردن تایمر به هنگام تطابق در مقایسه» می باشد. در پست های قبل همیشه با دو مقدار سروکار داشتیم: «مقدار تایمر» و «مقدار تنظیم». مقدار تایمر همان مقدار شمارشی بود که تایمر در حال شمارش در رجیستر خود (TCNT) ذخیره می کرد و مقدار تنظیم مقداری بود که بسته به میزان تاخیری که می خواستیم داشته باشیم آن را محاسبه می کردیم. اگر به یاد داشته باشید در جلسات قبل برای ایجاد تاخیری معین مقدار تنظیم را محاسبه می کردیم و آن را مرتباً با مقدار تایمر مقایسه می نمودیم. هنگامی که این دو مقدار برابر می شدند، تاخیر زمانی مورد نیاز ما ایجاد شده بود.

مد CTC نیز اساساً همین کار را انجام می دهد. اما برخلاف پروسه ی جلسات قبل این کار را به طور سخت افزاری پیاده سازی می کند. این بدین معناست که دیگر هربار نیاز به انجام مقایسه بین مقدار تایمر و مقدار تنظیم نداریم. مد مقایسه (CTC) نه تنها از اتلاف زمان برای اجرای مقایسه و … جلوگیری می کند، بلکه دقت بیشتری نیز دارد. چرا که عمل مقایسه به طور سخت افزاری و درون CPU ی میکروکنترلر صورت می گیرد. هنگامی که مقدار تایمر برابر با مقدار تنظیم برابر شد بیت پرچمی درون رجیستر وضعیت “۱” شده و تایمر به طور خودکار ریست می شود. به همین دلیل است که به این مد کاری «پاک شدن تایمر به هنگام انطباق در مقایسه» می گویند. در نتیجه تنها کاری که ما باید انجام دهیم چک کردن این پرچم می باشد و به همین دلیل بسیار سریع تر اجرا می شود.

هر سه تایمر TIMER0 و TIMER1 و TIMER2 قابلیت عملکرد در مد CTC را دارا هستند. برای شروع از تایمر یک آغاز می کنیم:

مد CTC در تایمر یک:

برای پیاده سازی مد CTC در تایمر یک نیاز است که ابتدا با رجیسترهای مربوط به آن آشنا شویم:

رجیسترهای TCCR1A و TCCR1B :

رجیستر TCCR1A یا رجیستر A کنترل تایمر/کانتر یک، مانند شکل زیر می باشد:

tccr1a

شکل زیر نیز رجیستر B کنترل تایمر/کانتر ۱ (TCCR1B) را نشان می دهد:

tccr1b

قبلا در جلسه ی تایمر یک با بیت های CS و نحوه ی کار با آن ها آشنا شدیم. این بیت ها در رجیستر TCCR1B قرار دارند و با رنگ سبز مشخص شده اند (در صورتی که قادر به یادآوری آن ها نیستید به پست تایمر یک مراجعه نمایید). اکنون می خواهیم با بیت های WGM آشنا شویم. WGM مخفف عبارت Wave Generation Mode و به معنای مد تولید موج می باشد. این بیت ها با نام های WGM10 و WGM11 و WGM12 و WGM13 و با رنگ زرد نشان داده شده اند. همان طور که در شکل های بالا نیز مشاهده می کنید، دو بیت اول در رجیستر TCCR1A و دو بیت دوم در رجیستر TCCR1B قرار دارند. با توجه به این که ۴ بیت WGM داریم می توانیم ۱۶ حالت مختلف داشته باشیم. تمامی این شانزده حالت در جدول زیر لیست شده اند:

wgm-table-1

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

رجیسترهای OCR1A و OCR1B :

پس از این که مد CTC را تنظیم کردیم باید مقدار تنظیم را به میکروکنترلر بدهیم. یعنی مقدار تنظیم را بر روی رجیسترهایی بنویسیم تا تایمر پس از رسیدن به آن مقادیر ریست شود. جهت انجام این کار از رجیسترهای OCR1A و OCR1B استقاده می کنیم. OCR مخفف عبارت Output Compare Register و به معنای رجیستر مقایسه ی خروجی می باشد. با توجه به این که تایمر یک ۱۶ بیتی است، مقداری هم که باید برای مقایسه ذخیره گردد، ۱۶ بیتی است. بنابراین رجیسترهای OCR1A و OCR1B شانزده بیتی هستند. در شکل های زیر این دو رجیستر نشان داده شده اند:

ocr1a

ocr1b

در میکروکنترلرهای ATMEGA16/32 دو کانال CTC موجود است. یکی کانال A و دیگری کانال B. ما می توانیم از هریک از آن ها و یا از هردوی آن ها استفاده کنیم. در این جا از OCR1A استفاده خواهیم نمود.

رجیستر TIFR

رجیستر پرچم وقفه تایمر/کانتر مانند شکل زیر است:

tifr-ocf1

همان طور که در جلسات قبل نیز بیان شد این رجیستر یک رجیستر مشترک بین تایمرها می باشد. در این جا با بیت های ۳ و ۴ سروکار داریم، که با نام های OCF1A و OCF1B مشخص و با رنگ زرد هایلایت شده اند. OCF مخفف عبارت Output Compare match Flag و به معنای پرچم تطابق مقایسه ی خروجی می باشد. OCF1A مربوط به کانال A و OCF1B مربوط به کانال B می باشد. هنگامی که در عمل مقایسه تطابق رخ دهد (مقدار TCNT1 با OCR1A/B برابر شود) این بیت “۱” می شود. لازم به ذکر است که پس از این که روال وقفه اجرا شود، این بیت به طور خودکار صفر می گردد. برای انجام این کار به طور دستی باید با نوشتن یک بر روی این بیت آن را صفر نمود.

مثال ۱ :

فرض کنیم می خواهیم یک LED را هر ۱۰۰ میلی ثانیه خاموش و روشن کنیم. همچنین فرکانس میکروکنترلر را یک کریستال ۱۶ مگاهرتزی تأمین می کند.

در جلسه ی ۱۲ فرمولی را معرفی کردیم که به وسیله ی آن در فرکانس معلوم میکروکنترلر ، برای ایجاد تأخیر مورد نظر تعداد شمارش مورد نیاز را به دست می آوردیم (در صورت نیاز می توانید مفاهیم پایه ی تایمرها را مطالعه فرمایید). با توجه به این که فرکانس CPU برابر ۱۶MHz می باشد، با استفاده از مقسم فرکانس ۶۴ فرکانس تایمر برابر ۲۵۰ کیلوهرتز خواهد شد. اگر بخواهیم ۱۰۰ میلی ثانیه تاخیر ایجاد کنیم تایمر باید ۲۴۹۹۹ بار بشمارد. در جلسات قبل اجازه می دادیم تا تایمر بشمارد و هربار مقدار تایمر را با ۲۴۹۹۹ مقایسه می کردیم و در صورتی که مقدار تایمر با این مقدار برابر می شد، تایمر را ریست می کردیم. اکنون که می خواهیم با مد مقایسه (CTC) کار کنیم، تمام این کارها در سخت افزار میکروکنترلر صورت می گیرد و نیازی نیست که این کار به صورت نرم افزاری انجام شود. حالا دیگر فقط باید چک کنیم که بیت پرچم چه موقع “۱” می شود. با توجه به مطالبی که در بالا بیان شد، مطالبی که در جلسه کار با ورودی/خروجی میکروکنترلر و همچنین مطالبی که در جلسه ی تایمر صفر یاد گرفتیم، برنامه ی خود را در محیط کدویژن می نویسیم.

برای مشاهده ی کد نوشته شده به تب کدنویسی در بالای صفحه مراجعه کرده و «کد مثال ۱» را ببینید.

استفاده از وقفه ها در مد CTC :

در کل سه نوع وقفه در تایمرها داریم: وقفه ی سرریز، وقفه ی مقایسه و وقفه ی کپچر. در جلسه ی قبل در مورد وقفه ی سرریز یاد گرفتیم. این جا می خواهیم از وقفه ی مقایسه استفاده کنیم. در مثال ۱، به جای انجام مقایسه، از مد CTC به طور ساده ای استفاده نمودیم. بدین ترتیب که هر بار بیت پرچم OCF1A را تا وقتی که برابر با یک شود، چک کردیم. اما باز هم می شود پیش تر رفت و تمامی این وظایف را بر عهده ی میکروکنترلر گذاشت تا جایی که حتی نیاز به چک کردن بیت پرچم OCF1A نیز نباشد. در این حالت میکروکنترلر مقادیر TCNT1 و OCR1A/B را با یکدیگر مقایسه می کند و هنگامی که برابر شدند علاوه بر این که بیت OCF1A/B را “۱” می کند، وقفه را نیز فعال کرده و زیرروال وقفه را اجرا می کند. برای فعال کردن وقفه ی مقایسه نیاز است بیت مربوطه را بشناسیم:

رجیستر TIMSK

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

 timsk-ctc-1

ولی این بار می خواهیم از بیت های ۳ و ۴ آن استفاده کنیم. بیت OCIE1A مربوط به کانال A و بیت OCIE1B مربوط به کانال B می باشد. OCIE مخفف عبارت Output Compare A/B match Interrupt Enable و به معنای فعال سازی وقفه به هنگام تطبیق مقایسه می باشد. با فعال کردن این بیت مطمئن می شویم که پس از تطبیق در عمل مقایسه وقفه فعال می شود.

مثال ۲ :

همان مثال قبل را با استفاده از وقفه ها انجام می دهیم. به طور خلاصه هنگامی که تطبیق رخ داد (مقدار TCNT1 با OCR1A=24999 برابر شد)، وقفه فعال می شود (چون بیت OCIE1A را قبلا ۱ کرده ایم) و پرچم OCF1A نیز برابر با یک می شود. حال با توجه به این که وقفه فعال می شود نیاز داریم تا روال سرویس وقفه (ISR) داشته باشیم. با اجرای ISR بیت پرچم OCF1A به طور خودکار صفر شده و مقدار TCNT1 نیز ریست می شود.

در محیط کدویژن ورژن ۳٫۱۲ برای نوشتن و فراخوانی ISR مربوط به تطبیق مقایسه باید به صورت زیر عمل کنیم:

 

کدی که که در نهایت می نویسیم، در قسمت کدنویسی تحت عنوان «کد مثال ۲» آورده شده است.

استفاده از مد سخت افزاری CTC

OC1 pinsتا اینجا با استفاده از وقفه ی مقایسه ی تایمر کد را کم حجم تر کرده و انجام کارهای مقایسه را به خود میکروکنترلر محول نمودیم. اما باز هم می شود پیش تر رفت. اگر به چینش پین های میکروکنترلرهای ATmega16/32 نگاهی بیندازیم، خواهیم دید که کاربرد خاص پین های PINB.3 ، PIND.5، PIND.4و PIND.7 در پرانتز ذکر شده است. یعنی به ترتیب: OC0 ، OC1A ، OC1B و OC2. این ها خروجی های مقایسه ی تایمر های Timer0 و Timer1 و Timer2 می باشند. اما برای این که استفاده از آن ها را یاد بگیریم باید ابتدا با بیت هایی از رجیستر TCCR1A آشنا شویم:

رجیستر TCCR1A :

رجیستر کنترل تایمر/کانتر ۱ (Timer/Counter Control Register) در شکل زیر نشان داده شده است:

tccr1a-com

پیش تر با بیت های ۰ و ۱ این رجیستر آشنا شدیم. اکنون می خواهیم روی بیت های ۴ تا ۷ آن تمرکز کنیم. بیت های ۶ و ۷ به ترتیب عبارتند از: COM1A0 و COM1A1 و همچنین بیت های ۴ و ۵ : COM1B0 و COM1B1 می باشند. این بیت ها برای مد خروجی مقایسه و برای کانال های CTC به ترتیب A و B هستند. همین بیت ها هستند که رفتار پین های خروجی مقایسه (OC) که در بالا معرفی شدند را کنترل می نمایند. رفتار این پین ها بر اساس مدهای کاری زیر متفاوت خواهد بود:

– مد غیر PWM (یعنی مد نرمال و CTC)

– مد PWM سریع

– مد PWM تصحیح فاز / تصحیح فاز و فرکانس

حال با توجه به این که در مد مقایسه (CTC) کار می کنیم، انتخاب های مختلف زیر در بیت های COM1A0 و COM1A1 (یا در صورتی که از کانال B استفاده می کنیم COM1B0 و COM1B1) گزینه های زیر را در اختیار ما می گذارند:

table-com1a

مثال ۳ :

می خواهیم همان مثال قبل را این بار با استفاده از پایه های خروجی تطبیق مقایسه انجام دهیم. با توجه به این که در اینجا از تایمر یک استفاده می کنیم و همچنین می خواهیم که LED پس از هر ۱۰۰ میلی ثانیه تغییر وضعیت دهد، در جدول بالا گزینه ی دوم را اتنخاب می نماییم. در اینجا از کانال A در مد CTC استفاده می کنیم پس : COM1A0 = 1 و COM1A1 = 0 قرار می دهیم. همچنین LED را به پایه ی OC1A متصل می نماییم. دقت کنید که در این جا هیچ نیازی به چک کردن بیت پرچم و اجرای زیرروال وقفه نیست و فقط کافی است تا تایمر یک را با مقادیر مورد نیاز تنظیم نماییم و تمام! البته در اینجا باید یک تغییر سخت افزاری نسبت به قبل اعمال کنیم. قبلا LED به پایه ی PINC.0 متصل بود ولی الان باید آن را به پایه ی PIND.5 وصل کنیم.

برنامه ی این مثال را که در محیط کد ویژن نوشته شده است در قسمت کدنویسی  تحت عنوان «کد مثال ۳» ببینید.

شبیه سازی انجام شده ی این مثال در محیط پروتئوس نیز در تب شبیه سازی آورده شده است. فایل کد C، شبیه سازی و فایل hex مربوط به این مثال در پایان این جلسه جهت دانلود قرار داده شده است.

تحمیل در تطبیق مقایسه:

در رجیستر TCCR1A در مورد دو بیت ۲ و ۳ صحبتی نکردیم. بیت های FOC1A و FOC1B مربوط به تحمیل کردن حالت تطبیق مقایسه و تاثیر در رفتار پین های OC1A و OC1B می باشند. این بیت ها فقط نوشتنی بوده، و فقط در حالت CTC فعال هستند. مقدار پیش فرض شان صفر است. ولی هنگامی که یک شوند به اجبار تطبیق مقایسه رخ داده و رفتار پین های خروجی طبق مقادیری که در جدول بالا انتخاب شده اند، خواهد بود. توجه داشته باشید که به هنگام تحمیل تطبیق مقایسه، هیچ وقفه ای اجرا نمی شود و همچنین مقدار تایمر ریست نمی گردد.

مد CTC در تایمر صفر

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

رجیستر TCCR0

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

tccr0

– بیت های ۳ و ۶ (WGM01 و WGM00) : بیت های مد تولید موج می باشند. دقیقا مانند تایمر یک نوع مد موج را به صورت زیر انتخاب می کنیم. برای مد CTC باید ۱۰ را انتخاب کنیم.

wgm0

– بیت های ۵ و ۴ (COM00 و COM01) : بیت های مد خروجی تطبیق مقایسه، رفتار پین OC0 را بر اساس حالت های WGM (غیر PWM ، PWM تصحیح فاز و PWM سریع) کنترل می کنند. گزینه های انتخابی مد غیر PWM در جدول زیر لیست شده اند. برای تغییر وضعیت در LED باید ۰۱ را انتخاب نمایید.

com0

– بیت ۷ (FOC0) : بیت تحمیل تطبیق مقایسه، وقتی که آن را یک کنیم به طور فوری حالت تطبیق مقایسه را تحمیل کرده و بر رفتار پین OC0 اثر می گذارد.

– بیت های ۰ تا ۲ (CS2:0): بیت های انتخاب ساعت هستند که در مورد آن ها در جلسه ی تایمر صفر صحبت شد.

رجیستر OCR0 

رجیستر مقایسه ی خروجی به شکل زیر است:

ocr0

مقداری که باید با آن مقایسه صورت گیرد، در این رجیستر ذخیره می گردد.

رجیستر TIMSK

جهت فعال سازی وقفه ی مقایسه ی تایمر صفر از بیت ۱ این رجیستر استفاده می کنیم. این بیت OCIE0 نام دارد. OCI مخفف عبارت Output Compare match Interrupt و به معنای وقفه ی تطبیق مقایسه می باشد. شکل زیر این رجیستر را نشان می دهد. بیت مورد نظر هایلایت شده است:

OCIE0

رجیستر TIFR

همان طور که در شکل زیر نیز مشخص شده است، بیت ۱ این رجیستر که OCF0 نام دارد، هنگامی که تطبیق در مقایسه رخ می دهد “۱” می شود. پس از این که روال وقفه اجرا شد به طور خودکار این بیت صفر می شود. برای صفر کردن این بیت به طور دستی باید بر روی این بیت “۱” نوشت.

OCF0

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

مد CTC در تایمر دو

مد CTC تایمر ۲ نیز عیناً مانند تایمر صفر است. رجیسترهای آن عبارتند از : TCCR2 و OCR2. در رجیستر TIMSK با بیت ۷ (OCIE2) و در رجیستر TIFR با بیت ۷ (OCF2) سر و کار خواهیم داشت. با توجه به این که روال کار و رجیسترهای تایمر ۲ دقیقا مشابه تایمر صفر می باشد، آن را توضیح نمی دهیم.

همه ی کدها به زبان سی و در محیط کدویژن ورژن ۳٫۱۲ نوشته شده اند.

کد مثال ۱ :

برای دیدن این کد باید عضو باشید. با مراجعه به قسمت حساب کاربری در ستون سمت چپ با نام کاربری خود وارد شوید یا ثبت نام کنید.

کد مثال ۲ :

برای دیدن این کد باید عضو باشید. با مراجعه به قسمت حساب کاربری در ستون سمت چپ با نام کاربری خود وارد شوید یا ثبت نام کنید.

 

 کد مثال ۳ :

برای دیدن این کد باید عضو باشید. با مراجعه به قسمت حساب کاربری در ستون سمت چپ با نام کاربری خود وارد شوید یا ثبت نام کنید.

شبیه سازی مثال ۳ :

ctc

این شبیه سازی در محیط پروتئوس ورژن ۷٫۸ انجام شده است. همان طور که در انیمیشن نیز قابل مشاهده است از میکروکنترلر Atmega 16 استفاده شده و پین OC1A را به یک اسیلوسکوپ متصل کرده ایم. همچنین یک LED نیز به همین پین متصل شده است. پس از اجرای شبیه سازی پالسی که تولید می شود در اسیلوسکوپ نمایش داده شده و دارای عرضی دقیقا برابر با ۱۰۰ میلی ثانیه می باشد.

فایل های مربوط به مثال ۳، شامل فایل C ، فایل شبیه سازی در محیط پروتئوس و فایل hex را از لینک زیر دانلود کنید:

پسورد فایل زیپ: www.microlearn.ir

دانلود فایل های مد مقایسه

این هم از مد CTC در تایمرهای AVR ! جلسه ی بعد در مورد مد PWM خواهیم گفت. جلسات آموزشی ما رو دنبال کنید.

درباره‌ی مجتبی

کارشناس الکترونیک و کارشناس ارشد مخابرات سیستم | زمینه ی تحقیقاتی : پردازش تصویر و تعقیب اشیاء متحرک |‌فعال در حوزه ی الکترونیک مبتنی بر میکروکنترلر | برنامه نویس و طراح بردهای الکترونیکی مبتنی بر میکروکنترلر

۱۴ ديدگاه

  1. ببخشید اینجا مگه چک کردن بیت پرچم رجیستر TIFR نیست؟
    (TIFR & (1 <>2

    • معذرت میخوام من متوجه منظورتون اصلا نشدم٬ اگه دارین در مورد مثال ۱ صحبت میکنین با توجه به شماره ی خطوطی که توی پست هست به من شماره ی خط کد رو بگین٬ چون این کدی که نوشتین برای من خوانایی نداره.
      البته اگه منظور شما دستور زیر هست:

      if (TIFR & (1 << OCF1A))

      باید بگم که در اینجا ما بیت شماره ی ۴ یعنی OCF1A رو باید چک کنیم. برای همین در ابتدا ۱ به تعداد ۴ بار به سمت چپ شیفت میدیم (مقدار OCF1A در کامپایلر برابر با ۴ تعریف شده) و عددی که تولید میشه ۰۰۰۱۰۰۰۰ هست٬ حالا اگه این عدد رو با رجیستر TIFR ٬ اَند کنیم٬ تمام بیت های صفر٬ یک٬ دو٬ سه و پنج تا هفت مقدارشون برابر با صفر میشه و فقط بیت ۴ مربوط به OCF1A هست که با یک اند میشه. در این صورت اگه بیت OCF1A صفر باشه حاصل صفر میشه و شرط برقرار نیست. اما اگه بیت OCF1A یک باشه حاصل میشه ۸ و شرط برقرار میشه. توجه کنید که هرعدد به غیر از صفر به لحاظ منطقی یک تلقی میشه.

  2. بنظر من باید شرط را به TIFR>>2 تغییر دهید و ریست کردن بیت TIFR را داخل if قرار دهید نه بیرون if

    • در رابطه با نظرتون در مورد شرط٬ توضیحات کامنت قبلی من نشون میده که نظرتون نادرسته. مگه این که دفاع قانع کننده ای داشته باشین. 😉
      در مورد نظر دومتون هم گویا به هنگام کپی کردن و مرتب کردن کد این اشتباه رخ داده و اصلاحش خواهم کرد. ممنون که گفتی. 🙂

  3. ببخشید اگه امکان داره از خط ۱۴ به بعد کامل توضیح دهید
    چرا شرط رو اونجوری نوشتین؟

    • در رابطه با شرط در دو تا کامنت بالاتر در جوابتون توضیحاتش رو گفتم٬ باز هم اگه نیاز داشت بگین تا توضیح بدم.
      خط ۱۸ پین صفر از پورت C رو toggle می کنیم٬ یعنی اگه یک باشه صفرش میکنیم و اگه صفر باشه یکش میکینم. کلا اگه شما یک بیت رو با ۱ ٬ XOR کنید٬ مقدار اون بیت تغییر می کنه. اینجا ما عدد یک رو صفر بار شیفت میدیم به سمت چپ و نتیجه میشه: ۰۰۰۰۰۰۰۱ این عدد رو با پورت C ٬ XOR می کنیم. بیت صفر تغییر می کنه و بقیه ی بیت ها بدون تغییر باقی می مونن.
      در خط نوزده ابتدا عدد یک رو به اندازه ی OCF1A (که مقدارش در کامپایلر برابر با ۴ هست) به چپ شیفت می دیم و با مقدار TIFR ٬ OR می کنیم. با این کار بیت ۴ از TIFR یک میشه و بقیه بدون تغییر باقی می مونن. مقدار جدید هم دوباره روی TIFR ریخته میشه. در نهایت یعنی بیت OCF1A رو مقدار یک میریزیم توش و با این کار clear میشه.

  4. لطفا فرق اینها رو هم توضیح دهید
    PORTX|=0X01
    PORTX^=0X01
    PORTX&=0X01

    • – در خط اول عدد ۰۰۰۰۰۰۰۱ رو با مقدار پورت OR می کنیم و دوباره میریزیم داخل رجیستر PORT ٬ با این کار بیت صفر هرچی باشه در نهایت مقدارش برابر یک میشه و بقیه ی بیت ها بدون تغییر باقی می مونن.
      – در خط دوم عدد ۰۰۰۰۰۰۰۱ رو با مقدار پورت XOR می کنیم و دوباره میریزیم داخل رجیستر پورت٬ با این کار بیت صفر اگه یک باشه صفر میشه و اگه صفر باشه یک میشه و بقیه ی بیت ها بدون تغییر باقی می مونن.
      – در خط سوم عدد ۰۰۰۰۰۰۰۱ رو با مقدار پورت AND می کنیم و دوباره میریزم داخل پورت٬ با این کار بیت صفر بدون تغییر باقی می مونه و بقیه ی بیت ها صفر میشن.

  5. ببخشید چرا در مثال ۱ چشمک زن سریع میزنه ؟
    مگه مثال ۱ و ۲ نباید یکی باشند؟

    • بله، دقیقاً باید مانند هم عمل کنند. من باز هم با شبیه ساز و اسیلوسکوپش تستشون کردم و دقیقاً هر دوتا عیناً سیگنالی با پهنای پالس یک ثانیه تولید می کنند. بار دیگه امتحان کن شاید جایی رو اشتباه پیش رفتی.

  6. ممنون – واقعا عالی بود

  7. TCCR1A |= 0;

    TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10);

    سلام ممنونم که ریز به ریز به سوال بینندگان جواب میدید
    یه سوال! چرا تو خط اول کد بالا برای صفر کردن مقدار تایمر، رجیسترش یعنی TCCR1A رو برابر با or اون با صفر قرار دادید؟! اینطور که اگه بیتی از این رجیستر یک باشه با صفر or میشه و نتیجه تغییری نمیکنه! بهتر نبود به صورت مستقیم صفر میکردید یا حداقل عملگر or رو با and عوض میکردید؟!
    میدونم که اصلا نیازی به نوشتن این کد اول برنامه نیست ولی شاید کسی بخواد از این دستور وسط برنامه برای صفر کردن مقدار تایمر استفاده کنه و خوب ممکنه براش اشتباه ایجاد کنه.

  8. با سلام و خداقوت و تشکر از سایت عالیتون.

پاسخ دهید

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

Time limit is exhausted. Please reload CAPTCHA.

کانال تلگرام میکرولرن
  • سلام دوست من :)
  • دوس داری AVR را ساده یاد بگیری؟
  • برنامه نویسی C را توی دانشگاه خوب یاد نگرفتی؟
  • از سایت های جذاب و تکنولوژیکی دنیا خبر داری؟
  • میونت با فیلمای با نمک و جذاب رباتیک چطوره؟
  • دنبال پروژه های جذاب برای دانشگاه یا کارای مورد علاقت میگردی؟
  • پس رو دکمه ی زیر یه تلنگر کوچولو بزن