تایمر صفر در AVR، یک تایمر 8 بیتی است. این تایمر در ATmega128A می تواند به صورت آسنکرون نیز کار کند. همان طور که پیش تر گفته شد، عملکرد آسنکرون بدین معناست که منبع کلاکِ تایمر می تواند از یک کریستال خارجی جداگانه تأمین شود. حالات شمارش و مدهای تایمر، هنگامی که آسنکرون کار می کند دقیقاً شبیه زمانی است که سنکرون است. تنها فرق آن، منبع کلاک تایمر است. در عملکرد آسنکرون، معمولاً یک کریستال ساعت با فرکانس 32768 هرتز به پایه های ورودی وصل می شود. دو پایۀ TOSC1 (PG4) و TOSC2 (PG3) برای وصل کردن کریستال ساعت منظور شده اند. همچنین یک واحد مقایسه و یک پایه به عنوان خروجی مقایسه برای تولید موج PWM دارد. در این بلوک تنها می توانیم به یک وقفۀ سرریز و یک وقفۀ مقایسه دست یابیم. همچنین این تایمر 4 مد دارد که عبارتند از: مد نرمال، مد PWM تصحیح فاز، مد CTC و مد PWM سریع.
این بلوک تنها کاربرد تایمر دارد و در آن، کاربرد کانتر وجود ندارد. اما با این حال حرف C که مخفف Counter است در نام رجیسترهای این تایمر استفاده شده است. دیتاشیت نیز به این بلوک، تایمر/کانتر می گوید و ما در اینجا تنها برای تثبیت موضوع، نام تایمر به این بلوک می دهیم. در این نوشته می خواهیم دربارۀ تایمر در AVR با محوریت تایمر صفر در ATmega128A صحبت کنیم. در پایان نیز با برنامه نویسی تایمر با کدویژن و راه اندازی تایمر صفر در قالب چند تمرین، بحث تایمر صفر را خاتمه می دهیم.
فیلم آموزش تایمر در STM32 (فیلم آموزش ARM STM32 مقدماتی)
فیلم آموزش تایمر پیشرفته در STM32
فیلم آموزش تایمر در AVR (فیلم آموزش میکروکنترلرهای AVR مقدماتی)
فیلم آموزش تایمر پیشرفته در AVR
فیلم آموزش تایمر در آردوینو (فیلم آموزش آردوینو مقدماتی)
فیلم آموزش تایمر پیشرفته در آردوینو
بلوک دیاگرام تایمر صفر در ATmega128A
تصویر زیر، بلوک دیاگرام تایمر صفر را نشان می دهد. در ادامه به بررسی حالت های مختلف خروجی مقایسه کننده، مدهای تایمر صفر، واحد تقسیم فرکانس، عملکرد آسنکرون، رجیسترهای تایمر صفر و … می پردازیم.
تصویر 1 – بلوک دیاگرام تایمر صفر در ATmega128A
تعریف چند اصطلاح در تایمر صفر
BOTTOM: کمترین مقدار تایمر است. این مقدار برابر 0x00 است.
MAX: بیشترین مقداری است که تایمر می تواند به آن برسد. این مقدار برابر 0xFF (255 دسیمال) است.
TOP: مقدار نهایی در مد مورد نظر است. در مد CTC، مقدار TOP برابر مقدار ذخیره شده در رجیستر OCR0 می باشد.
CM یا Compare Match: هر گاه مقدار تایمر برابر رجیستر مقایسه شود به آن CM می گوییم.
حالت های خروجی مقایسه کنندۀ تایمر صفر
تصویر زیر نشان دهندۀ بلوک دیاگرام واحد مقایسۀ تایمر صفر می باشد. واحد مقایسه یک بخش Waveform generator دارد که شکل موج روی پایه های OC0 را می سازد. شکل موجی که روی این پایه ساخته می شود سه حالت دارد که در ادامه توضیح داده می شود.
تصویر 2 – بلوک دیاگرام واحد مقایسۀ تایمر صفر
برای خروجی مقایسه، سه حالت وجود دارد. این حالت ها که بیانگر نوعِ تغییر سطح ولتاژ روی پایۀ مقایسه یعنی OC0 هستند، در مدهای مختلف، متفاوت هستند. در جداول زیر به بررسی این حالت ها در مدهای مختلف می پردازیم. برای فهم آسان تر این حالت ها تصاویر مدها را نیز مشاهده کنید.
حالت های OC0 در مد Normal و CTC – مدهای 0 و 2
نوع تغییر سطح ولتاژ روی پایۀ OC0 در مدهای 0 و 2 به صورت زیر است.
جدول 1 – حالت های OC0 در مد نرمال و CTC
حالت های OC0 در مد PWM سریع (Fast PWM) – مد 3
نوع تغییر سطح ولتاژ روی پایۀ OC0 در مد 3 نیز به صورت زیر است.
جدول 2 – حالت های OC0 در مد Fast PWM
حالت های OC0 در مد PWM تصحیح فاز (Phase Correct PWM) – مد 1
در مد Phase Correct PWM حالت های OC0 به صورت زیر است.
جدول 3 – حالات OC0 در مد Phase Correct PWM
مدهای تایمر صفر
تایمر صفر می تواند 4 مد عملیاتی داشته باشد که آنها را در جدول های زیر مشاهده می کنید. در انتهای توضیحات هر مد یک تصویر حاوی نمودار تایمر و شکل موج خروجی آن با توجه به حالت های مختلف خروجی قرار گرفته است. توضیحات این جداول و تصاویر موجود در آنها بسیار مهم هستند.
مد نرمال تایمر صفر در ATmega128A (مد شمارۀ صفر)
مشخصات مد نرمال تایمر صفر به صورت زیر است.
جدول 4 – مشخصات مد نرمال تایمر صفر
در مد نرمال در تایمر صفر میکروکنترلر ATmega128A:
- تایمر تا مقدار MAX بالا می رود و پس از آن سرریز می شود و از مقدار BOTTOM شروع به شمارش می کند.
- هر جایی که رجیستر مقایسه مقدار دهی شود، مقدار آن فوراً در آن رجیستر قرار می گیرد.
- در این مد، سرریز در MAX اتفاق می افتد و هر گاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسه در صورت فعال بودن اتفاق می افتد.
تصویر 3 – نمودار زمانی تایمر در مد نرمال صفر و شکل موج روی OC0
مد Phase Correct PWM تایمر صفر در ATmega128A (مد شمارۀ 1)
در مد PWM تصحیح فاز در تایمر صفر مشخصات زیر را داریم.
جدول 5 – مشخصات مد PWM تصحیح فاز تایمر صفر
در مد شمارۀ 1 یعنی مد PWM تصحیح فاز (PWM , Phase Correct):
- تایمر تا مقدار 0xFF بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش صعودی می شود.
- در این مد هر جایی که رجیستر مقایسه مقدار دهی شوند مقدار آن ها در زمانی که تایمر به TOP می رسد، در آن رجیستر قرار می گیرد.
- در این مد سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسه در صورت فعال بودن اتفاق می افتد.
تصویر 4 – نمودار زمانی تایمر صفر در مد PWM تصحیح فاز و شکل موج روی OC0
مد CTC تایمر صفر در ATmega128A (مد شمارۀ 2)
مشخصات مد CTC در تایمر صفر ATmega128A به صورت زیر می باشد.
جدول 6 – مشخصات مد CTC تایمر صفر
در مد شمارۀ 2 که مد CTC یا Clear Timer on Compare Match است:
- تایمر تا مقدار رجیستر OCR0 می شمارد و پس از آن به مقدار BOTTOM می رسد و دوباره از BOTTOM شروع به شمارش می کند.
- مقدار TOP را رجیستر OCR0 تعیین می کند.
- مقادیر جدید برای رجیستر مقایسه فوراً در آن رجیستر قرار می گیرد.
- سرریز در MAX اتفاق می افتد و این امر تنها زمانی امکان پذیر است که OCR0=MAX (یعنی 0xFF) باشد. هر گاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. وقفۀ مقایسه نیز به هنگام رسیدن تایمر به OCR0 (TOP) در صورت فعال بودن اتفاق می افتد.
تصویر 5 – نمودار زمانی تایمر صفر در مد CTC و شکل موج روی OC0
مد PWM سریع (Fast PWM) در ATmega128A (مد شمارۀ 3)
مشخصات این مد به صورت زیر است.
جدول 7 – مشخصات مد PWM سریع تایمر صفر
در مد شمارۀ 3 یعنی مد PWM سریع (Fast PWM):
- تایمر تا مقدار 0xFF بالا می رود و پس از آن سرریز می شود و مقدارش به BOTTOM می رسد و دوباره از BOTTOM می شمارد.
- هر جایی که رجیستر مقایسه مقدار دهی شود، این مقدار در زمانی که تایمر به BOTTOM می رسد، در آن رجیستر قرار داده می شود.
- در این مد سرریز در MAXاتفاق می افتد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد، وقفۀ مقایسه در صورت فعال بودن اتفاق می افتد.
تصویر 6 – نمودار زمانی تایمر صفر در مد Fast PWMو شکل موج روی OC0
چند نکته دربارۀ تایمر صفر
- در همۀ مدهای تایمر می توان در رجیستر TCNT0 (مقدار تایمر) نوشت. در این صورت تایمر به محض دریافت مقدار TCNT0، از مقدار قرار گرفته در TCNT0 شروع به شمارش می کند. این امر تنها برای یک بار قابل اجراست و پس از اولین سرریز (سرریز ممکن است در BOTTOM باشد)، تایمر طبق مد کاری خود شمارش می کند. برای این که همواره تایمر از مقدار معینی (به غیر از صفر) شروع به شمارش کند باید آن مقدار معین هنگام سرریز و در روتین وقفۀ سرریز یا در وقفۀ مقایسه در TCNT0 نوشته شود. در این صورت تایمر همواره از مقدار قرار گرفته در TCNT0 شروع به شمارش می کند و این امر تکرار می شود. در مد شمارۀ 1 که شمارش صعودی و نزولی داریم، وقتی مقدار تایمر در حال افزایش است و مقداری به آن بدهیم، تایمر از آن مقدار به صورت صعودی می شمارد و وقتی شمارش تایمر نزولی است و مقداری به آن بدهیم تایمر از آن مقدار به صورت نزولی می شمارد.
- بیت های WGM01 و WGM00 به ترتیب نام جدید بیت های CTC0 و PWM0هستند.
- همۀ مدهای تایمر صفر برای عملکرد آسنکرون نیز قابل استفاده اند.
تقسیم کنندۀ فرکانس در تایمر صفر میکروکنترلر ATmega128A
تایمر صفر دارای یک واحد تقسیم کنندۀ فرکانس 10 بیتی است که می تواند فرکانسِ CPU را به اعداد 8، 32، 64، 128، 256 و 1024 تقسیم کند و آنگاه آن را به تایمر بدهد. بلوک تایمر می تواند با فرکانس CPU هم کار کند که در این صورت نیاز به تقسیم فرکانس نیست. در عملکرد آسنکرون نیز، تقسیم کنندۀ فرکانس قابل استفاده است. بلوک دیاگرام تقسیم کنندۀ فرکانس را در شکل زیر مشاهده می کنید.
تصویر 7 – بلوک دیاگرام واحد تقسیم کنندۀ فرکانس تایمر صفر
فرکانس کلاکِ بلوک تایمر صفر با بیت های CS0[2:0] از رجیستر TCCR0 انتخاب می شود. اگر این سه بیت صفر باشند، تایمر خاموش است، در غیر این صورت تایمر فعال است و منبع کلاک آن با توجه به جدول زیر تعیین می شود.
نوع کلاک تایمر | CS00 | CS01 | CS02 |
تایمر متوقف (خاموش) است. | 0 | 0 | 0 |
کلاک CPU یا اسیلاتور آسنکرون بدون تقسیم (clkI/O) | 1 | 0 | 0 |
کلاک CPU تقسیم بر 8 (clkI/O/8) – از تقسیم کنندۀ فرکانس | 0 | 1 | 0 |
کلاک CPU تقسیم بر 32 (clkI/O/32) – از تقسیم کنندۀ فرکانس | 1 | 1 | 0 |
کلاک CPU تقسیم بر 64 (clkI/O/64) – از تقسیم کنندۀ فرکانس | 0 | 0 | 1 |
کلاک CPU تقسیم بر 128 (clkI/O/128) – از تقسیم کنندۀ فرکانس | 1 | 0 | 1 |
کلاک CPU تقسیم بر 256 (clkI/O/256) – از تقسیم کنندۀ فرکانس | 0 | 1 | 1 |
کلاک CPU تقسیم بر 1024 (clkI/O/1024) – از تقسیم کنندۀ فرکانس | 1 | 1 | 1 |
جدول 8 – نوع کلاک تایمر صفر در ATmega128A
عملکرد آسنکرون (Asynchronous – غیر همزمان) تایمر صفر
در میکروکنترلر ATmega128A، تایمر صفر دارای عملکرد آسنکرون نیز می باشد. در عملکرد آسنکرون یک اسیلاتور داخلی با استفاده از یک کریستال خارجی به عنوان منبع کلاک تایمر انتخاب می شود. با استفاده از عملکرد آسنکرونِ تایمر صفر و با قرار دادن یک کریستال ساعت با فرکانس 32768 هرتز روی پایه های TOSC1 و TOSC2، می توان یک کلاک ساعت واقعی (RTC – Real Time Clock) ساخت. همچنین به جای کریستال ساعت می توان از یک پالس خارجی که به پایۀ TOSC1 وارد می شود استفاده کرد و یک تایمر آسنکرون داشت. البته اسیلاتور داخلی که برای عملکرد آسنکرون در تایمر صفر تعبیه شده برای کریستال با فرکانس 32768 هرتز بهینه شده است و اعمال پالس خارجی به پایۀ TOSC1 ممکن است باعث عملکرد ناصیح تایمر شود. همچنین توجه شود که در صورت اعمال پالس خارجی به پایۀ TOSC1، فرکانس این پالس باید کمتر از یک چهارمِ فرکانس CPU باشد.
تصویر 8 – دیاگرام عملکرد آسنکرون تایمر صفر در ATmega128A
برای به دست آوردن فرکانس 1 هرتز باید از تقسیم فرکانس 32768 هرتز بر 128 استفاده کنیم (CS0[2:0]=101). در این صورت فرکانس کلاک تایمر صفر برابر 256 هرتز می شود. پس زمان هر پله از تایمر برابر 1/256 ثانیه می شود. با طی شدن یک چرخه از شمارشِ تایمر (یعنی 256 پله)، زمان یک چرخه برابر 256 * (1/256) = 1s می شود. بنابراین با هر سرریز تایمر یک ثانیه سپری شده است.
واحد مقایسۀ خروجی (Output Compare Unit) یا واحد مقایسه
تایمر صفر در میکروکنترلر ATmega128A دارای یک واحد مقایسه (یا واحد مقایسۀ خروجی) است. این واحد مقایسه دائماً خروجی تایمر را با رجیستر OCR0 (که در برنامه مقدار دهی شده است) مقایسه می کند و در صورت تطابق می تواند یک وقفه بدهد. همچنین در این واحد یک بخش Waveform Generator وجود دارد که در صورت تطابقِ مقدار تایمر با مقدار رجیستر OCR0 می تواند خروجی واحد مقایسه (یعنی پایۀ OC0) را با توجه به مقادیر بیت های COM0[1:0]، صفر و یک کند. از این واحد می توان برای تولید موج PWM استفاده کرد. بلوک دیاگرام این واحد را در تصویر 2 مشاهده می کنید. همچنین بلوک دیاگرام خروجیِ واحد مقایسه را در شکل زیر می بینید.
تصویر 9 – بلوک دیاگرام خروجی واحد مقایسۀ تایمر صفر
مقایسۀ اجباری در تایمر صفر
در مدهایی به غیر از مد PWM (مدهای Normal و CTC)، با فعال سازی این بخش از واحد مقایسه، یک تطابق اجباری ایجاد می شود و با توجه به حالات خروجی مقایسه کننده یک تغییر سطح روی پایه های OC0 اتفاق می افتد. این تطابق اجباری تنها روی خروجی واحد مقایسه اثر می گذارد و روی وقفۀ آن اثرگذار نیست.
وقفه های تایمر صفر
بلوک تایمر صفر، 2 وقفه دارد که با فعال کردن آنها می توان از روتین وقفۀ مربوطه برای نوشتن کدهای برنامه استفاده کرد. زمان اتفاق افتادن این وقفه ها به مد تایمر بستگی دارد. این 2 وقفه عبارتند از: وقفۀ سرریز و وقفۀ مقایسه.
رجیسترهای تایمر صفر
رجیسترهای تایمر صفر 8 بیتی هستند. تایمر صفر دو رجیستر کنترلی، یک رجیستر مقدار تایمر و یک رجیستر مقدار مقایسه دارد که در این بخش به شرح آنها می پردازیم.
رجیستر TCCR0
این رجیستر کنترلی شامل بیت های WGM و COM است که حالات مختلف و مدهای مختلف با مقدار دهی به این بیت ها حاصل می شوند. فرکانس کاری تایمر (مقدار تقسیم فرکانس از واحد تقسیم فرکانس) نیز در این رجیستر انتخاب می شود. همچنین در این رجیستر بیت مربوط به مقایسۀ اجباری نیز قرار دارد.
TCCR0 (Timer/Counter Control Register 0) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
CS00 | CS01 | CS02 | WGM01 | COM00 | COM01 | WGM00 | FOC0 | Bit name |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | W | Access |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Initial Value |
جدول 9 – رجیستر TCCR0
بیت های WGM0[1:0](Waveform Generation Mode): این بیت ها تعیین کنندۀ مد عملیاتی تایمر صفر هستند.
بیت های COM0[1:0] (Compare Output Mode): این بیت ها حالت های خروجی مقایسه کننده های تایمر صفر را تعیین می کنند.
بیت های CS0[2:0] (Clock Select): این بیت ها تعیین کنندۀ فعال بودن یا نبودن تایمر و همچنین مقدار کلاک تایمر هستند.
بیت FOC0 (Force Output Compare): با یک شدن این بیت، یک مقایسۀ اجباری برای مقایسه کننده اتفاق می افتد. این بیت فقط نوشتنی است.
رجیستر TCNT0
مقدار تایمر در این رجیستر قرار دارد. یعنی با وارد شدن هر کلاک به بلوک تایمر، یک واحد به این رجیستر اضافه می شود.
TCNT0 (Timer/Counter 0 Register) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
TCNT0.0 | TCNT0.1 | TCNT0.2 | TCNT0.3 | TCNT0.4 | TCNT0.5 | TCNT0.6 | TCNT0.7 | Bit name |
R/W | R/W | R/W | R/W | R/W | R | R/W | R/W | Access |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Initial Value |
جدول 10 – رجیستر TCNT0
رجیستر OCR0
این رجیستر مربوط به واحد مقایسه است. در واحد مقایسه، مقدار تایمر با مقدار نوشته شده در این رجیستر مقایسه می شود.
OCR0 (Output Compare Register 0) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
OCR0.0 | OCR0.1 | OCR0.2 | OCR0.3 | OCR0.4 | OCR0.5 | OCR0.6 | OCR0.7 | Bit name |
R/W | R/W | R/W | R/W | R/W | R | R/W | R/W | Access |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Initial Value |
جدول 11 – رجیستر OCR0
رجیستر ASSR
عملکرد آسنکرون تایمر صفر با مقدار دهی به بیت های این رجیستر فعال می شود. در این رجیستر سه بیت دیگر وجود دارد که وضعیت آپدیت شدن رجیسترهای TCNT0، OCR0 و TCCR0 را در عملکرد آسنکرون نشان می دهند.
ASSR (Asynchronous Status Register) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
TCR0UB | OCR0UB | TCN0UB | AS0 | – | – | – | – | Bit name |
R | R | R | R/W | R/W | R | R/W | R/W | Access |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Initial Value |
جدول 12 – رجیستر ASSR در تایمر صفر
بیت AS0 (Asynchronous Timer/Counter 0): با یک شدن این بیت، عملکرد آسنکرون تایمر صفر فعال می شود. و با صفر شدن آن تایمر صفر در عملکرد سنکرون قرار می گیرد. با یک شدن این بیت ممکن است محتوای رجیسترهای TCNT0، OCR0 و TCCR0 خراب شوند.
بیت TCN0UB (Timer/Counter 0 Update Busy): وقتی تایمر صفر به صورت آسنکرون کار می کند، اگر در رجیستر TCNT0 مقداری نوشته شود، این بیت 1 می شود. وقتی که رجیستر TCNT0 به وسیلۀ رجیستر موقت آپدیت می شود، این بیت توسط سخت افزار صفر می شود. صفر بودن این بیت نشان دهندۀ این است که TCNT0 آمادۀ پذیرش مقدار جدید است.
بیت OCR0UB (Output Compare Register 0 Update Busy): وقتی تایمر صفر به صورت آسنکرون کار می کند، اگر در رجیستر OCR0 مقداری نوشته شود، این بیت 1 می شود. وقتی که رجیستر OCR0 به وسیلۀ رجیستر موقت آپدیت می شود، این بیت توسط سخت افزار صفر می شود. صفر بودن این بیت نشان دهندۀ این است که OCR0 آمادۀ پذیرش مقدار جدید است.
بیت TCR0UB (Timer/Counter Control Register 0 Update Busy): وقتی تایمر صفر به صورت آسنکرون کار می کند، اگر در رجیستر TCCR0 مقداری نوشته شود، این بیت 1 می شود. وقتی که رجیستر TCCR0 به وسیلۀ رجیستر موقت آپدیت می شود، این بیت توسط سخت افزار صفر می شود. صفر بودن این بیت نشان دهندۀ این است که TCCR0 آمادۀ پذیرش مقدار جدید است.
هنگامی که یکی از بیت های Update Busy یک باشند، اگر در رجیستر متناظر آنها مقداری نوشته شود، مقدار جدید ممکن است از دست برود. همچنین ممکن است یک وقفۀ ناخواسته اتفاق بیفتد. بیت های Update Busy فقط خواندنی هستند.
رجیستر TIMSK
بیت های 0 و 1 این رجیستر مربوط به وقفه های تایمر صفر است.
TIMSK (Timer/Counter Interrupt Mask Register) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
TOIE0 | OCIE0 | Bit name | ||||||
R/W | R/W | Access | ||||||
0 | 0 | Initial Value |
جدول 13 – رجیستر TIMSK در تایمر صفر
بیت OCIE0 (Timer/Counter 0 Output Compare Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ تایمر صفر فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.
بیت TOIE0 (Timer/Counter 0 Overflow Interrupt Enable): با یک شدن این بیت، وقفۀ سرریز تایمر صفر فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.
رجیستر TIFR
در این رجیستر پرچم های مربوط به وقفه های تایمر صفر قرار دارد.
TIFR (Timer/Counter Interrupt Flag Register) | ||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Bit number |
TOV0 | OCF0 | Bit name | ||||||
R/W | R/W | Access | ||||||
0 | 0 | Initial Value |
جدول 14 – رجیستر TIFR در تایمر صفر
بیت OCF0 (Timer/Counter 0 Output Compare Match Flag): با اتفاق افتادن وقفۀ مقایسۀ تایمر، این پرچم 1 می شود.
بیت TOV0 (Timer/Counter 0 Overflow Flag): با اتفاق افتادن وقفۀ سرریز تایمر صفر، این پرچم 1 می شود.
چند تمرین برای تایمر صفر
برای درک بهتر مباحث تایمر صفر چند تمرین طرح کرده ایم. فایل های برنامه و شبیه سازی این تمرین ها در پیوست موجود است. در این تمرین ها برنامۀ تایمر با کدویژن نوشته شده است.
تمرین 1: تولید موج مربعی با مد نرمال تایمر صفر
با استفاده از مد نرمال و وقفۀ سرریز تایمر صفر، روی پایۀ PA0 یک موج مربعی با فرکانس 2 kHz تولید کنید. عملکرد تایمر روی سنکرون باشد. همچنین از کلاک 8 MHz برای میکروکنترلر استفاده کنید.
راهنمایی: برای تولید یک شکل موج با فرکانس 2 کیلوهرتز باید با زمان 250 میکروثانیه پایۀ PA0 را تغییر وضعیت دهیم. زیرا پریود یک موج 2 کیلوهرتزی برابر 500 میکروثانیه است. برای دست یابی به پریود 500 میکرو ثانیه باید PA0 را هر 250 میکروثانیه یک بار تغییر وضعیت دهیم تا هر دو تغییر وضعیت آن یک پریود 500 میکرو ثانیه ای باشد. برای این منظور از تقسیم فرکانسی 8 استفاده می کنیم و کلاک CPU را که 8 مگاهرتز است بر 8 تقسیم می کنیم. در این صورت کلاک ورودی تایمر برابر 1 مگاهرتز است. و مقدار خروجی تایمر با پله های 1 میکروثانیه ای افزایش می یابند. مقدار تایمر به صورت عادی از 0 تا 255 (256 پله در مجموع) تغییر می کند. ما به 250 پله از آن نیاز داریم. اگر هر بار مقدار تایمر از عدد 6 شروع شود و تا 255 بشمارد ما تعداد 250 پلۀ 1 میکروثانیه ای داریم. در وقفۀ سرریز باید پایۀ PA0 را یک بار تغییر وضعیت دهیم. و همچنین در مقدار تایمر عدد 6 را بنویسیم که تایمر بار دیگر از عدد 6 شروع به شمارش کند.
تمرین 2: موج مربعی با فرکانس متغیر با مد CTC تایمر صفر
با استفاده از مد CTC تایمر صفر، یک شکل موج مربعی با فرکانس متغیر روی پایۀ OC0 ایجاد کنید. مقدار OCR0 را از عدد 10 تا 250 با پله های 5 تایی با استفاده از دو کلید که روی پایه های PA0 و PA1 قرار دارند کم و زیاد کنید. پایه های PA0 و PA1 پول آپ شوند. کلاک میکرو کنترلر و تایمر هر دو 8 مگاهرتز باشند.
راهنمایی: در حلقۀ بی نهایت while، دو شرط قرار می دهیم که هرگاه کلید روی PA0 فشرده شد، مقدار OCR0 کم شود (که در این صورت فرکانس خروجی زیاد می شود) و هرگاه کلید روی PA1 فشرده شد، مقدار OCR0 زیاد شود (که در این صورت فرکانس خروجی کم می شود). تایمر صفر را در مد CTC تنظیم می کنیم و حالت خروجی مقایسه را روی toggle تنظیم می کنیم. یعنی WGM0[1:0]=10 و COM0[1:0]=01.
تمرین 3: موج PWM با Duty Cycle متغیر با مد Fast PWM
با استفاده از مد Fast PWM تایمر صفر یک شکل موج با Duty Cycle متغیر بین 0% و 100% بسازید. طوری که Duty Cycle از 0% شروع شود و تا 100% برود و دوباره از 100% کاهش بیابد و به 0% برسد. و این چرخه مدام تکرار شود. فرکانس موج PWM نیز 31250 Hz و پله های تغییر OCR0 هم 1 ms باشد. فرکانس کاری میکروکنترلر و تایمر هر دو 8 MHz باشد.
راهنمایی: در حلقۀ بی نهایت while دو for بنویسید که مقدار OCR0 را در آن کم و زیاد کنید. تایمر را با فرکانس 8 مگاهرتز دو مد Fast PWM فعال می کنیم. و خروجی آن را روی حالت non-inverting PWM تنظیم می کنیم. در این مد با هر بار سرریزِ تایمر یک پریود از موج در خروجی شکل می گیرد. بنابراین با یک چرخۀ 256 پله ای یک پریود طی می شود. با توجه به زمان گذر هر پله که برابر 0.125 µs است، پریود این موج برابر است با 256 * 0.125 µs = 0.32 µs که با معکوس کردن این عدد فرکانسش بدست می آید. فرکانس این موج برابر با 1/0.32us = 31250Hz می باشد. در حلقه های for هم که در while می نویسیم، مقدار OCR0 را بین 0 تا 255 با تأخیر 1 میلی ثانیه کم و زیاد می کنیم. بنابر این در خروجی یک PWM با Duty Cycle متغیر شکل می گیرد.
تمرین 4: موج PWM با مد Phase Correct PWM
با استفاده از مد PWM تصحیح فاز تایمر صفر، یک موج PWM بسازید که مقدار OCR0در وقفۀ سرریز تایمر، از یک Dip switch روی پورت A گرفته شود. پایه های پورت A را با مقاومت pull down کنید. فرکانس کاری میکروکنترلر 8 مگا هرتز و فرکانس کاری تایمر 1 مگاهرتز باشد.
راهنمایی: تایمر صفر را در مد PWM تصحیح فاز با تقسیم فرکانس 8 فعال می کنیم. حالت OC0 را هم روی non-inverted PWM تنظیم می کنیم. وقفۀ سرریز تایمر صفر را فعال می کنیم و در آن مقدار OCR0 را برابر PINA قرار می دهیم. هر وقت که دیپ سوییچ تغییر کند، در وقفۀ سرریز این تغییر در OCR0 قرار می گیرد و هنگامی که تایمر به TOP می رسد مقدار OCR0 آپدیت می شود. و هر گاه که CM اتفاق بیفتد یک تغییر وضعیت در OC0 داریم.
از آموزش تایمر صفر میکروکنترلر ATmega128A نتیجه می گیریم:
- تایمر صفر در ATmega128A تنها قابلیت تایمر دارد و کانتر نیست.
- در هر کدام از مدهای تایمر حالاتی برای تغییر وضعیت OC0 وجود دارد. این حالات با بیت های COM01 و COM00 انتخاب می شود.
- تایمر صفر دارای چهار مد نرمال، PWM تصحیح فاز (Phase Correct PWM)، CTC و PWM سریع (Fast PWM) است.
- اگر به رجیستر TCNT0 مقدار بدهیم، تایمر از آن مقدار شروع به شمارش می کند.
- بیت های WGM01 و WGM00 به ترتیب نام جدید بیت های CTC0 و PWM0 هستند.
- برای راه اندازی تایمر کافی است بیت های CS0[2:1] برابر 000 نباشند.
- در عملکرد آسنکرون، کلاک تایمر از اسیلاتور داخلی با کریستال روی پایه های TOSC1 و TOSC2 تأمین می شود. این کریستال معمولاً یک کریستال ساعت است.
- مقایسۀ اجباری در مدهای نرمال و CTC وجود دارد. با مقایسۀ اجباری وقفۀ مقایسه اتفاق نمی افتد.
فکرنکنم دیگه جای سوالی باقی مونده باشه. خیلی خوشم اومد. مرسی
خواهش میکنم. نظر لطف شماست.
این که مدهای تایمر رو از هم تفکیک کردید و هر کدوم رو بار سم نمودار نشون دادید خیلی بهتر از دیتاشیت شده و فهمش راحت تر شده. دستتون درد نکنه. تمرین 1 بهتر نیست با خروجی های خود تایمر یعنی پایه OC0 این کار انجام بشه؟
خواهش میکنم. سعی بر راحت بودن درک مطلب کردیم. بله بهتره همین طور باشه. در واقع برای تولید شکل موج بهترین راه خروجی های تایمر هستش که به صورت سخت افزاری موج تولید بشه. اینطوری از بار پردازشی CPU هم کم میشه. چون این شکل موج به صورت نرم افزاری و با درگیر کردن CPU تولید میشه. توی نوشتۀ ساخت PWM با AVR هم همین کار رو کردیم. در واقع این کار اصولی و صحیح نیست و فقط جنبۀ آموزشی داره. البته استفاده از وقفه های تایمر برای ایجاد زمان های مساوی هم هدف این تمرین بوده که این موضوع رو میتونید توی نوشتۀ تاخیر با تایمر در میکروکنترلرها ببینید.
سلام. ببخشید مقایسه اجباری چه کاربردی میتونه داشته باشه؟ متشکرم
سلام. بستگی به شرایط پروژه ممکنه کاربردهای متنوعی داشته باشه. بنابر مطالب گفته شده، توی مدهای CTC نرمال هر وقت یک مقایسه به وجود بیاد یک تغییر وضعیت توی خروجی رخ میده. البته اگه حالت COM روی Toggle باشن. فرض کنید برنامه ای نوشتید که با هر بار مقایسه، خروجی toggle میشه. حالا میخواید زمانی به غیر از مقایسه یه تاگل انجام بشه. این موضوع اگه جواب بده شاید بشه باهاش یه موج PWM هم ساخت. وقتی که مقدار شمارش به یه جایی رسید، یه مقایسۀ اجباری اتفاق بیفته و خروجی یه تغییر وضعیت بده. حالا این تغییر وضعیت به همراه تغییر وضعیت ناشی از مقایسۀ اصلی، با هم یه موج PWM رو بسازن. خواهش میکنم
خیلی ممنونم
فقط داخل کد خروجی oc0 را اشتباهی PB4 قرار داده اید به جای PB3
سلام. خواهش میکنم. اشتباهی باشه در آینده ویرایش می کنیم. ممنون از نظر و بازخوردتون
سلام
کارت درسته دادش. بعد از مدتها من اصولی درک کردم مفهوم پیچیده تایمر در atmeg
سلام و تشکر. این بابت خوشحالیم.