آموزش تایمر کانتر میکروکنترلرهای AVR تایمر صفر در ATmega128A

توسط | 21 دی, 1398 | میکروکنترلر | 8 دیدگاه ها

بلوک دیاگرام تایمر صفر در ATmega128A، حالت های خروجی مقایسه کنندۀ تایمر صفر، مدهای تایمر صفر در AVR، مدهای Normal، CTC و PWM در تایمر صفر AVR، تقسیم کنندۀ فرکانس در تایمر صفر، عملکرد آسنکرون، مقایسۀ اجباری، وقفه های تایمر صفر، رجیسترهای تایمر صفر، چند تمرین برای تایمر صفر
تایمر-صفر-avr

تایمر صفر در 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

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

بلوک-دیاگرام-تایمر-صفر-atmega128a

تصویر 1 – بلوک دیاگرام تایمر صفر در ATmega128A

تعریف چند اصطلاح در تایمر صفر

BOTTOM: کمترین مقدار تایمر است. این مقدار برابر 0x00 است.

MAX: بیشترین مقداری است که تایمر می تواند به آن برسد. این مقدار برابر 0xFF (255 دسیمال) است.

TOP: مقدار نهایی در مد مورد نظر است. در مد CTC، مقدار TOP برابر مقدار ذخیره شده در رجیستر OCR0 می باشد.

CM یا Compare Match: هر گاه مقدار تایمر برابر رجیستر مقایسه شود به آن CM می گوییم.

 

حالت های خروجی مقایسه کنندۀ تایمر صفر

تصویر زیر نشان دهندۀ بلوک دیاگرام واحد مقایسۀ تایمر صفر می باشد. واحد مقایسه یک بخش Waveform generator دارد که شکل موج روی پایه های OC0 را می سازد. شکل موجی که روی این پایه ساخته می شود سه حالت دارد که در ادامه توضیح داده می شود.

بلوک-دیاگرام-واحد-مقایسه-تایمر-صفر-atmega128a

تصویر 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 اتفاق بیفتد وقفۀ مقایسه در صورت فعال بودن اتفاق می افتد.

نمودار-زمانی-تایمر-صفر-مد-phase-correct-pwm

تصویر 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) در صورت فعال بودن اتفاق می افتد.

نمودار-زمانی-تایمر-صفر-مد-ctc

تصویر 5 – نمودار زمانی تایمر صفر در مد CTC و شکل موج روی OC0

مد PWM سریع (Fast PWM) در ATmega128A (مد شمارۀ 3)

مشخصات این مد به صورت زیر است.

جدول 7 – مشخصات مد PWM سریع تایمر صفر

در مد شمارۀ 3 یعنی مد PWM سریع (Fast PWM):

  • تایمر تا مقدار 0xFF بالا می رود و پس از آن سرریز می شود و مقدارش به BOTTOM می رسد و دوباره از BOTTOM می شمارد.
  • هر جایی که رجیستر مقایسه مقدار دهی شود، این مقدار در زمانی که تایمر به BOTTOM می رسد، در آن رجیستر قرار داده می شود.
  • در این مد سرریز در MAXاتفاق می افتد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد، وقفۀ مقایسه در صورت فعال بودن اتفاق می افتد.

نمودار-زمانی-تایمر-صفر-مد-fast-pwm

تصویر 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 باشد.

عملکرد-آسنکرون-تایمر-صفر-atmega128a

تصویر 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 نتیجه می گیریم:

  1. تایمر صفر در ATmega128A تنها قابلیت تایمر دارد و کانتر نیست.
  2. در هر کدام از مدهای تایمر حالاتی برای تغییر وضعیت OC0 وجود دارد. این حالات با بیت های COM01 و COM00 انتخاب می شود.
  3. تایمر صفر دارای چهار مد نرمال، PWM تصحیح فاز (Phase Correct PWM)، CTC و PWM سریع (Fast PWM) است.
  4. اگر به رجیستر TCNT0 مقدار بدهیم، تایمر از آن مقدار شروع به شمارش می کند.
  5. بیت های WGM01 و WGM00 به ترتیب نام جدید بیت های CTC0 و PWM0 هستند.
  6. برای راه اندازی تایمر کافی است بیت های CS0[2:1] برابر 000 نباشند.
  7. در عملکرد آسنکرون، کلاک تایمر از اسیلاتور داخلی با کریستال روی پایه های TOSC1 و TOSC2 تأمین می شود. این کریستال معمولاً یک کریستال ساعت است.
  8. مقایسۀ اجباری در مدهای نرمال و CTC وجود دارد. با مقایسۀ اجباری وقفۀ مقایسه اتفاق نمی افتد.

 

رضا اسدی

رضا اسدی

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

آموزش میکروکنترلرهای ARM سری STM32 یوبرد

آموزش میکروکنترلرهای AVR یوبرد

آموزش میکروکنترلرهایARM سری LPC یوبرد

آموزش Arduino یوبرد

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

راه-اندازی-dac-stm32

راه اندازی DAC در STM32

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-سون-سگمنت-با-آردوینو

راه اندازی سون سگمنت با آردوینو

راه اندازی سون سگمنت با آردوینو UNO، راه اندازی سون سگمنت 4 تایی آند مشترک با آردوینو، اتصال سون سگمنت به آردوینو، کتابخانۀ سون سگمنت برای آردوینو، نمونه کد راه اندازی سون سگمنت، نمایش اعداد در سون سگمنت 4 تایی، نکات راه اندازی سون سگمنت

راه-اندازی-adc-در-آردوینو

راه اندازی ADC در آردوینو

راه اندازی ADC در آردوینو، راه اندازی LCD گرافیکی KS0108 با کتابخانۀ U8g2، اتصالات لازم برای راه اندازی ADC و LCD گرافیکی KS0108، نمونه کد راه اندازی ADC آردوینو، فرمول محاسبۀ دما با TMP36، راه اندازی سنسور دما با آردوینو، راه اندازی فتوسل (LDR) با آردوینو

کنترل موتور براشلس با STM32

از ویژگی‌های تایمرهای Advanced میکروکنترلرهای STM32، امکان ایجاد PWM شش مرحله‌ای است. PWM شش مرحله‌ای در کنترل موتورهای براشلس کاربرد دارد و در STM32 می‌توان با تایمرهای Advanced، موتورهای براشلس را کنترل کرد. PWM شش مرحله‌ای نسبت به روش‌های دیگر کنترل موتور براشلس، عملکرد بهتر، مصرف انرژی کمتر و سطح ایمنی بالاتری را فراهم می‌آورد.

از مباحث آموزش STM32

فیوزبیت EESAVE

برای جلوگیری از پاک شدن محتوای حافظۀ EEPROM داخلی میکروکنترلرهای AVR در هنگام پاک کردن حافظۀ فلش آن، فیوزبیتی به نام EESAVE وجود دارد که باید فعال شود. در غیر این صورت، هر بار که حافظۀ فلش پاک می‌شود، حافظۀ EEPROM نیز پاک می‌شود. فیوزبیت EESAVE به صورت پیش‌فرض غیر فعال است و برای حفظ محتوای EEPROM باید فعال شود. حفظ محتوای EEPROM در بسیاری از پروژه‌ها ضروری است.

از مباحث آموزش AVR

تفاوت Event با وقفه در STM32

در میکروکنترلرهای STM32، علاوه بر وقفه‌های خارجی، Eventهای خارجی هم وجود دارند. تفاوت Event خارجی با وقفۀ خارجی این است که در وقفۀ خارجی، اجرای کد وجود دارد و با اتفاق افتادن آن، کدهای روتین وقفه اجرا می‌شوند، اما در Event خارجی، اجرای کد وجود ندارد و اتفاق افتادن آن فقط باعث می‌شود  میکروکنترلر از مد کاهش مصرف توان خارج شود.

از مباحث آموزش STM32

کلاک خروجی در STM32

در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

وقفۀ Pin change در AVR

در برخی میکروکنترلرهای AVR، وقفه‌های Pin change وجود دارند که تفاوتشان با وقفۀ خارجی این است که در وقفۀ خارجی می‌توان تعیین کرد وقفه با لبۀ پایین‌رونده یا بالارونده یا تغییر سطح اتفاق بیفتد، اما وقفۀ Pin change با هر لبه یا تغییر سطح سیگنال اتفاق می‌افتد. همچنین هر وقفۀ خارجی با تحریک تنها یک پایۀ ورودی اتفاق می‌افتد. اما هر وقفۀ Pin change، چند پایۀ ورودی دارد و تحریک هر یک از آنها، باعث اتفاق افتادن وقفۀ Pin change می‌شود.
از مباحث آموزش آردوینو

خواندن فرکانس و دیوتی سایکل با آردوینو

یک روش برای خواندن Duty Cycleو فرکانس موج PWM ، قابلیت Capture تایمرهاست. برای بردهای آردوینو مبتنی بر AVR، کتابخانۀ TimerOne،  فاقد قابلیت کپچر است. اما در کتابخانۀ HardwareTimer میکروکنترلرهای STM32 در آردوینو، می‌توان از کپچر استفاده کرد و مد input PWM تایمرهای STM32 را فعال کرد و دو کپچر را به کار گرفت و فرکانس و دیوتی سایکل موج ورودی را خواند.

از مباحث آموزش آردوینو

اولویت وقفه‌ها در STM32

 

از مباحث آموزش stm32در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

8 دیدگاه ها

  1. فکرنکنم دیگه جای سوالی باقی مونده باشه. خیلی خوشم اومد. مرسی

    پاسخ
    • خواهش میکنم. نظر لطف شماست.

      پاسخ
  2. این که مدهای تایمر رو از هم تفکیک کردید و هر کدوم رو بار سم نمودار نشون دادید خیلی بهتر از دیتاشیت شده و فهمش راحت تر شده. دستتون درد نکنه. تمرین 1 بهتر نیست با خروجی های خود تایمر یعنی پایه OC0 این کار انجام بشه؟

    پاسخ
    • خواهش میکنم. سعی بر راحت بودن درک مطلب کردیم. بله بهتره همین طور باشه. در واقع برای تولید شکل موج بهترین راه خروجی های تایمر هستش که به صورت سخت افزاری موج تولید بشه. اینطوری از بار پردازشی CPU هم کم میشه. چون این شکل موج به صورت نرم افزاری و با درگیر کردن CPU تولید میشه. توی نوشتۀ ساخت PWM با AVR هم همین کار رو کردیم. در واقع این کار اصولی و صحیح نیست و فقط جنبۀ آموزشی داره. البته استفاده از وقفه های تایمر برای ایجاد زمان های مساوی هم هدف این تمرین بوده که این موضوع رو میتونید توی نوشتۀ تاخیر با تایمر در میکروکنترلرها ببینید.

      پاسخ
  3. سلام. ببخشید مقایسه اجباری چه کاربردی میتونه داشته باشه؟ متشکرم

    پاسخ
    • سلام. بستگی به شرایط پروژه ممکنه کاربردهای متنوعی داشته باشه. بنابر مطالب گفته شده، توی مدهای CTC نرمال هر وقت یک مقایسه به وجود بیاد یک تغییر وضعیت توی خروجی رخ میده. البته اگه حالت COM روی Toggle باشن. فرض کنید برنامه ای نوشتید که با هر بار مقایسه، خروجی toggle میشه. حالا میخواید زمانی به غیر از مقایسه یه تاگل انجام بشه. این موضوع اگه جواب بده شاید بشه باهاش یه موج PWM هم ساخت. وقتی که مقدار شمارش به یه جایی رسید، یه مقایسۀ اجباری اتفاق بیفته و خروجی یه تغییر وضعیت بده. حالا این تغییر وضعیت به همراه تغییر وضعیت ناشی از مقایسۀ اصلی، با هم یه موج PWM رو بسازن. خواهش میکنم

      پاسخ
  4. خیلی ممنونم
    فقط داخل کد خروجی oc0 را اشتباهی PB4 قرار داده اید به جای PB3

    پاسخ
    • سلام. خواهش میکنم. اشتباهی باشه در آینده ویرایش می کنیم. ممنون از نظر و بازخوردتون

      پاسخ

یک دیدگاه بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است