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

توسط | 26 دی, 1398 | AVR, میکروکنترلر, وبلاگ | 7 دیدگاه ها

تایمر-1-3-avr

آموزش AVR یوبرد

شاهکار 8بیتی اتمل

آموزش های رایگان AVR

فیلم های آموزش AVR

آموزش خصوصی AVR

اخبار جدید یوبرد در اینستاگرام

تایمر/کانتر 1 و 3 دقیقاً شبیه هم هستند. هر دو 16 بیتی هستند، هر کدام تعداد پنج وقفه، یک واحد Capture، سه واحد مقایسه، سه پایۀ خروجی برای تولید موج PWM، یک پایه برای کاربرد کانتر و یک پایه برای واحد Capture دارند.در این نوشته می خواهیم آموزش تایمر در AVR را با مبحث تایمر/کانتر 1 و 3 در ATmega128A به اتمام برسانیم. شکل زیر بلوک دیاگرام تایمر/کانتر 1 و 3 را نشان می دهد.

بلوک-دیاگرام-تایمر-کانتر-1-3-avr-atmega128a

تصویر 1 – بلوک دیاگرام تایمر/کانتر 1 و 3 در میکروکنترلر ATmega128A

در پیکربندی ATmega103 Compatibility mode، تایمر/کانتر 3 در دسترس نیست و برای تایمر/کانتر 1 نیز رجیستر مقایسۀ A و B فعال هستند و رجیستر مقایسۀ C غیر فعال است.

فیلم آموزش تایمر در STM32                         (فیلم آموزش ARM STM32 مقدماتی)

فیلم آموزش تایمر پیشرفته در STM32

فیلم آموزش تایمر در AVR                             (فیلم آموزش میکروکنترلرهای AVR مقدماتی)

فیلم آموزش تایمر پیشرفته در AVR

فیلم آموزش تایمر در آردوینو                          (فیلم آموزش آردوینو مقدماتی)

فیلم آموزش تایمر پیشرفته در آردوینو

چند اصطلاح در تایمر/کانتر 1 و 3

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

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

TOP: مقدار نهایی در مد مورد نظر است. TOP می تواند مقادیر ثابت 0x00FF، 0x01FF، 0x03FF یا مقادیر ذخیره شده در رجیسترهای OCRnA یا ICRn باشد. (n می تواند 1 یا 3 باشد.)

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

حرف n: در بحث تایمر/کانتر 1 و 3 این حرف نشان دهندۀ شمارۀ تایمر/کانتر است. n می تواند 1 یا 3 باشد.

حرف x: در بحث تایمر/کانتر 1 و 3 این حرف نشان دهندۀ نام واحد مقایسه است. x می تواند A یا B یا C باشد.

 

حالت های خروجی مقایسه کننده های تایمر/کانتر 1 و 3

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

بلوک-دیاگرام-واحد-مقایسه-تایمر-کانتر-1-3-avr-atmega128a

تصویر 2 – بلوک دیاگرام واحد مقایسۀ تایمر/کانتر 1 و 3 در میکروکنترلر ATmega128A

برای هر یک از خروجی های مقایسۀ A، B و C سه حالت وجود دارد. این حالت ها بیانگر نوعِ تغییر سطح ولتاژ روی پایه های مقایسه یعنی OCnA، OCnB و OCnC هستند. این حالت ها در هر کدام از مدهای تایمر/کانتر 1 و 3 متفاوت هستند. در جداول زیر به بررسی این حالت ها در مدهای مختلف می پردازیم. برای فهم آسان تر این حالت ها تصاویر مد ها را نیز مشاهده کنید.

 

حالت های OCnx در مد Normal و CTC – مدهای 0 و 4 و 12

تغییر وضعیت پایۀ OCnx در مدهای نرمال و CTC یعنی مدهای شمارۀ صفر، 4 و 12 به صورت زیر است.

توضیحات COMnx0 COMnx1
حالت disconnected

 

در این حالت خروجی های OCnx قطع هستند.

0 0
حالت Toggle

 

در این حالت هر گاه CM اتفاق بیفتد وضعیت پایۀ OCnx تغییر می کند. یعنی اگر 1 باشد 0 می شود و اگر 0 باشد 1 می شود.

1 0
حالت Clear OCnx on compare match

 

در این حالت وقتی CM اتفاق می افتد، پایۀ OCnx همواره صفر می باشد.

0 1
حالت Set OCnx on compare match

 

در این حالت وقتی CM اتفاق می افتد، پایۀ OCnx همواره یک می باشد.

1 1

جدول 1 – حالت های OCnx در مد نرمال و CTC تایمر/کانتر 1 و 3

حالت های OCnx در مدهای PWM سریع (Fast PWM) – مدهای 5 و 6 و 7 و 14 و 15

در مدهای PWM سریع پایه های OCnx به صورت زیر تتغییر می کنند.

توضیحات COMnx0 COMnx1
حالت disconnected

 

در این حالت خروجی های OCnx قطع هستند.

0 0
حالت Toggle

 

– این حالت تنها در مد 15 وجود دارد و تنها برای خروجی OCnA. هر گاه CM اتفاق بیفتد خروجی OCnA تغییر وضعیت می دهد. یعنی toggle می شود.

– پایه های OCnB و OCnC در این حالت قطع هستند.

1 0
حالت non-inverting (حالت PWM ناوارون)

 

– در این حالت هر گاه CM اتفاق بیفتد، پایۀ OCnx صفر می شود و هر گاه تایمر به BOTTOM برسد، پایۀ OCnx یک می شود.

 

– در مد 15 هنگام اتفاق افتادن CM، خروجی OCnA همواره یک می باشد.

 

– دلیل این که نام این حالت، PWM ناوارون است این است که با افزایش دادنِ مقدار رجیسترِ OCRnx عرض پالس های روی OCnx افزایش می یابد. یعنی Duty Cycle آنها زیاد می شود.

0 1
حالت inverting (حالت PWM وارون)

 

– در این حالت هر گاه CM اتفاق بیفتد، پایۀ OCnx یک می شود و هر گاه تایمر به BOTTOM برسد، پایۀ OCnx صفر می شود.

 

– در مد 15 هنگام اتفاق افتادن CM، خروجی OCnA همواره صفر می باشد.

 

– دلیل این که نام این حالت، PWM وارون است، این است که با افزایش دادنِ مقدار رجیسترِ OCRnx عرض پالس های روی OCnx کاهش می یابد. یعنی Duty Cycle آنها کم می شود.

1 1

جدول 2 – حالت های OCnx در مد PWM سریع تایمر/کانتر 1 و 3

حالت های OCnx در مد PWM تصحیح فاز و PWM تصحیح فاز و فرکانس

در مدهای PWM تصحیح فاز (PWM,Phase Correct) و مدهای PWM تصحیح فاز و فرکانس (PWM,Phase and Frequency Correct) که همان مدهای شمارۀ  1 و 2 و 3 و 10 و 11 و 8 و 9 هستند، وضعیت پایه های OCnx به صورت زیر است.

توضیحات COMnx0 COMnx1
حالت disconnected

 

در این حالت خروجی های OCnx قطع هستند.

0 0
حالت Toggle

 

– این حالت تنها در مد 9 و 11 وجود دارد و تنها برای خروجی OCnA. هر گاه CM اتفاق بیفتد خروجی OCnA تغییر وضعیت می دهد. یعنی toggle می شود. همچنین پایه های OCnB و OCnC در این حالت قطع هستند.

– در مد های 1، 2، 3، 8 و 10 هر سه خروجی OCnA، OCnB و OCnC قطع هستند.

1 0
حالت non-inverting (حالت PWM ناوارون)

 

– در این حالت هر گاه CM در شمارش صعودی اتفاق بیفتد، پایۀ OCnx صفر می شود و هر گاه CM در شمارش نزولی اتفاق بیفتد، پایۀ OCnx یک می شود.

 

– در مد 9 و 11 هنگام اتفاق افتادن CM خروجی OCnA همواره یک می باشد.

 

– دلیل این که نام این حالت، PWM ناوارون است این است که با افزایش دادنِ مقدار رجیسترِ OCRnx عرض پالس های روی OCnx افزایش می یابد. یعنی Duty Cycle آنها زیاد می شود.

0 1
حالت inverting (حالت PWM وارون)

 

– در این حالت هر گاه CM در شمارش صعودی اتفاق بیفتد، پایۀ OCnx یک می شود و هر گاه CM در شمارش نزولی اتفاق بیفتد، پایۀ OCnx صفر می شود.

 

– در مد 9 و 11 هنگام اتفاق افتادن CM خروجی OCnA همواره صفر می باشد.

 

– دلیل این که نام این حالت، PWM وارون است، این است که با افزایش دادنِ مقدار رجیسترِ OCRnx عرض پالس های روی OCnx کاهش می یابد. یعنی Duty Cycle آنها کم می شود.

1 1

جدول 3 – حالت های OCnx در مد PWM تصحیح فاز و PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3

مدهای عملیاتی تایمر/کانتر 1 و 3 در میکروکنترلر ATmega128A

تایمر/کانتر 1 و 3 می توانند 14 مد عملیاتی داشته باشند که آن ها را در جدول زیر مشاهده می کنید. در انتهای توضیحات هر مد یک تصویر حاوی نمودار تایمر/کانتر و شکل موج های خروجی آن با توجه به حالت های مختلف خروجی قرار گرفته است. توضیحات این جداول و تصاویر موجود در فایل های PDF مربوط به آنها بسیار مهم هستند.

مد Normal تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ صفر)

مشخصات مد نرمال تایمر/کانتر 1 و 3 در ATmega128A به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
MAX Immediate 0xFFFF Normal 0 0 0 0 0

جدول 4 – مشخصات مد نرمال تایمر/کانتر 1 و 3

توضیحات مد نرمال تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر/کانتر تا مقدار MAX بالا می رود و پس از آن سرریز می شود و از مقدار BOTTOM شروع به شمارش می کند.
  • هر جایی که رجیسترهای مقایسه مقدار دهی شوند، مقدار آنها فوراً در آن رجیسترها قرار می گیرد.
  • در این مد سرریز در MAX اتفاق می افتد و هر گاه تایمر/کانتر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر/کانتر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر/کانتر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-نرمال-تایمر-کانتر-1-3-avr-atmega128a

تصویر 3 – نمودار زمانی مد نرمال تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز 8 بیتی تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 1)

مشخصات مد PWM,Phase Correct,8bit تایمر/کانتر 1 و 3 به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM TOP 0x00FF PWM,Phase Correct,8bit 1 0 0 0 1

جدول 5 – مشخصات مد PWM تصحیح فاز 8 بیتی تایمر/کانتر 1 و 3

توضیحات مد PWM تصحیح فاز 8 بیتی در تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار 0x00FF بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش صعودی می شود.
  • در این مد هر جایی که رجیسترهای مقایسه مقدار دهی شوند مقدار آن ها در زمانی که تایمر به TOP می رسد، در آن رجیسترها قرار می گیرد.
  • در این مد سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-تصحیح-فاز-8-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 4 – نمودار زمانی مد PWM تصحیح فاز 8 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز 9 بیتی تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 2)

مشخصات مد PWM,Phase Correct,9bit در تایمر/کانتر 1 و 3 به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM TOP 0x01FF PWM,Phase Correct,9bit 0 1 0 0 2

جدول 6 – مشخصات مد PWM تصحیح فاز 9 بیتی تایمر/کانتر 1 و 3

عملکرد مد PWM تصحیح فاز 9 بیتی تایمر/کانتر 1 و 3 شبیه مد شمارۀ 1 است. تنها تفاوت آن مقدار TOP است. مقدار تایمر در این مد تا 0x01FF بالا می رود.

نمودار-زمانی-مد-pwm-تصحیح-فاز-9-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 5 – نمودار زمانی مد PWM تصحیح فاز 9 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز 10 بیتی تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 3)

مشخصات مد PWM,Phase Correct,10bit تایمر/کانتر 1 و 3 به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM TOP 0x03FF PWM,Phase Correct,10bit 1 1 0 0 3

جدول 7 – مشخصات مد PWM تصحیح فاز 10 بیتی تایمر/کانتر 1 و 3

عملکرد مد PWM تصحیح فاز 10 بیتی شبیه مد شمارۀ 1 است. تنها تفاوت آن مقدار TOP است. مقدار تایمر در این مد تا 0x03FF بالا می رود.

نمودار-زمانی-مد-pwm-تصحیح-فاز-10-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 6 – نمودار زمانی مد PWM تصحیح فاز 10 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد CTC تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 4)

مشخصات مد CTC تایمر/کانتر 1 و 3 در ATmega128A به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
MAX Immediate OCRnA CTC 0 0 1 0 4

جدول 8 – مشخصات مد CTC تایمر/کانتر 1 و 3 (مد شمارۀ 4)

توضیحات مد CTC (Clear Timer on Compare Match) تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار رجیستر OCRnA می شمارد و پس از آن به مقدار BOTTOM می رسد و دوباره از BOTTOM شروع به شمارش می کند.
  • مقدار TOP را رجیستر OCRnA تعیین می کند. همچنین می توان OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM برای رجیسترهای مقایسۀ B و C اتفاق بیفتد، مقدار رجیسترهای OCRnB و OCRnC باید کمتر از OCRnA باشد.
  • مقادیر جدید برای رجیسترهای مقایسه فوراً در آنها قرار می گیرد.
  • سرریز در MAX اتفاق می افتد و این امر تنها زمانی امکان پذیر است که OCRnA=MAX (یعنی 0xFFFF) باشد. هر گاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد. وقفۀ مقایسۀ A نیز به هنگام رسیدن تایمر به OCRnA (TOP) اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-ctc-تایمر-کانتر-1-3-avr-atmega128a

تصویر 7 – نمودار زمانی مد CTC تایمر/کانتر 1 و 3 (مد شمارۀ 4) و شکل موج روی OCnx

مد Fast PWM,8bit تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 5)

مشخصات مد PWM سریع 8 بیتی تایمر/کانتر 1 و 3 در ATmega128A را در جدول زیر مشاهده می کنید.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
TOP BOTTOM 0x00FF Fast PWM,8bit 1 0 1 0 5

جدول 9 – مشخصات PWM سریع 8 بیتی در تایمر/کانتر 1 و 3

توضیحات مد PWM سریع 8 بیتی (Fast PWM,8bit) تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار 0x00FF بالا می رود و پس از آن سرریز می شود و مقدارش به BOTTOM می رسد و دوباره از BOTTOM می شمارد.
  • هر جایی که رجیسترهای مقایسه مقدار دهی شوند این مقدار در زمانی که تایمر به BOTTOM می رسد، در رجیسترهای مقایسه قرار داده می شوند.
  • در این مد سرریز در مقدار TOP که برابر 0x00FF است اتفاق می افتد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-سریع-8-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 8 – نمودار زمانی مد PWM سریع 8 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد Fast PWM,9bit تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 6)

مشخصات مد PWM سریع 9 بیتی تایمر/کانتر در ATmega128A 1 و 3 به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
TOP BOTTOM 0x01FF Fast PWM,9bit 0 1 1 0 6

جدول 10 – مشخصات PWM سریع 9 بیتی تایمر/کانتر 1 و 3

عملکرد مد PWM سریع 9 بیتی شبیه مد شمارۀ 5 است. تنها تفاوت آن مقدار TOP است. مقدار تایمر در این مد تا 0x01FF بالا می رود.

نمودار-زمانی-مد-pwm-سریع-9-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 9 – نمودار زمانی مد PWM سریع 9 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد Fast PWM,10bit تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 7)

مشخصات مد PWM سریع 10 بیتی تایمر/کانتر 1 و 3 در ATmega128A به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
TOP BOTTOM 0x03FF Fast PWM,10bit 1 1 1 0 7

جدول 11 – مشخصات PWM سریع 10 بیتی تایمر/کانتر 1 و 3

عملکرد مد PWM سریع 10 بیتی شبیه مد شمارۀ 5 است. تنها تفاوت آن مقدار TOP است. مقدار تایمر در این مد تا 0x03FF بالا می رود.

نمودار-زمانی-مد-pwm-سریع-10-بیتی-تایمر-کانتر-1-3-avr-atmega128a

تصویر 10 – نمودار زمانی مد PWM سریع 10 بیتی تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 درATmega128A (مد شمارۀ 8):

مشخصات مد PWM,Phase and Frequency Correct تایمر/کانتر 1 و 3 در ATmega128A به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM BOTTOM ICRn PWM,Phase and Frequency Correct 0 0 0 1 8

جدول 12 – مشخصات مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3

توضیحات مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار رجیستر ICRn (که در برنامه مقدار دهی شده است) بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش، صعودی می شود. (در این مد واحد capture قابل راه اندازی نیست.)
  • مقدار TOP را رجیستر ICRn تعیین می کند. همچنین می توان OCRnA، OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM برای رجیسترهای مقایسۀ A، B و C اتفاق بیفتد، مقدار رجیسترهای OCRnA، OCRnB و OCRnC باید کمتر از ICRn باشد.
  • در این مد هر جایی که رجیسترهای مقایسه مقدار دهی شوند مقدار آن ها در زمانی که تایمر به BOTTOM می رسد، در آن رجیسترها قرار می گیرد. و هر جایی که مقدار ICRn مقدار دهی شود این مقدار فوراً در آن رجیستر قرار می گیرد.
  • سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد واحد capture تحریک نمی شود و می توان از پایۀ ICPn به عنوان یک پورت ورودی/خروجی استفاده کرد. مقدار نوشته شده در رجیستر ICRn نیز تعیین کنندۀ مقدار TOP است. همچنین در صورت فعال بودن وقفۀ capture، این وقفه زمانی اتفاق می افتد که مقدار تایمر به BOTTOM برسد. اولویت اتفاق افتادن وقفۀ capture نیز از وقفۀ سرریز بیشتر است و ابتدا وقفۀ capture اتفاق می افتد.

نمودار-زمانی-مد-pwm-تصحیح-فاز-فرکانس-تایمر-کانتر-1-3-avr-atmega128a

تصویر 11 – نمودار زمانی مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 درATmega128A (مد شمارۀ 9):

مشخصات مد PWM,Phase and Frequency Correct تایمر/کانتر 1 و 3 در ATmega128A به صورت زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM BOTTOM OCRnA PWM,Phase and Frequency Correct 1 0 0 1 9

جدول 13 – مشخصات مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3

توضیحات مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 در ATmega128A:

  • این مد شبیه مد 8 است. تفاوت آنها با هم در مقدار TOP است.
  • تایمر تا مقدار رجیستر OCRnA بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش صعودی می شود.
  • مقدار TOP را رجیستر OCRnA تعیین می کند. همچنین می توان OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM برای رجیسترهای مقایسۀ B و C اتفاق بیفتد، مقدار رجیسترهای OCRnB و OCRnC باید کمتر از OCRnA باشد.
  • در این مد هر جایی که رجیسترهای مقایسۀ B و C مقدار دهی شوند مقدار آن ها در زمانی که تایمر به BOTTOM می رسد، در آن رجیسترها قرار می گیرد. و هر جایی که مقدار OCRnA مقدار دهی شود این مقدار فوراً در آن رجیستر قرار می گیرد.
  • سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد. همچنین در صورت فعال بودن وقفۀ مقایسۀ A، این وقفه زمانی اتفاق می افتد که مقدار تایمر به BOTTOM برسد. اولویت اتفاق افتادن وقفۀ مقایسۀ A از وقفۀ سرریز بیشتر است و ابتدا وقفۀ مقایسۀ A اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-تصحیح-فاز-فرکانس-تایمر-کانتر-1-3-avr-atmega128a

تصویر 12 – نمودار زمانی مد PWM تصحیح فاز و فرکانس تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 10):

در جدول زیر مشخصات مد PWM,Phase Correct تایمر/کانتر 1 و 3 در ATmega128A را مشاهده می کنید.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM TOP ICRn PWM,Phase Correct 0 1 0 1 10

جدول  14 – مشخصات مد PWM تصحیح فاز تایمر/کانتر 1 و 3

توضیحات مد PWM تصحیح فاز تایمر/کانتر 1 و 3 در ATmega128A:

  • عملکرد این مد شبیه مد 8 است. با این تفاوت که در این مد زمان آپدیت شدن رجیسترهای OCRnx در TOP است.
  • تایمر تا مقدار رجیستر ICRn (که در برنامه مقدار دهی شده است) بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش، صعودی می شود. (در این مد واحد capture قابل راه اندازی نیست.)
  • مقدار TOP را رجیستر ICRn تعیین می کند. همچنین می توان OCRnA، OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM برای رجیسترهای مقایسۀ A، B و C اتفاق بیفتد، مقدار رجیسترهای OCRnA، OCRnB و OCRnC باید کمتر از ICRn باشد.
  • در این مد هر جایی که رجیسترهای مقایسه مقدار دهی شوند مقدار آن ها در زمانی که تایمر به TOP (مقدار قرار گرفته در ICRn) می رسد، در آن رجیسترها قرار می گیرد. و هر جایی که مقدار ICRn مقدار دهی شود این مقدار فوراً، در آن رجیستر قرار می گیرد.
  • در این مد سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد واحد capture تحریک نمی شود و می توان از پایۀ ICPn به عنوان یک پورت ورودی/خروجی استفاده کرد. مقدار نوشته شده در رجیستر ICRn نیز تعیین کنندۀ مقدار TOP است. همچنین در صورت فعال بودن وقفۀ capture، این وقفه زمانی اتفاق می افتد که مقدار تایمر به BOTTOM برسد. اولویت اتفاق افتادن وقفۀ capture نیز از وقفۀ سرریز بیشتر است و ابتدا وقفۀ capture اتفاق می افتد.

نمودار-زمانی-مد-pwm-تصحیح-فاز-تایمر-کانتر-1-3-avr-atmega128a

تصویر 13 – نمودار زمانی مد PWM تصحیح فاز تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد PWM تصحیح فاز تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 11):

مشخصات مد تصحیح فاز تایمر/کانتر 1 و 3 در ATmega128A به صورت جدول زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
BOTTOM TOP OCRnA PWM,Phase Correct 1 1 0 1 11

جدول  15 – مشخصات مد PWM تصحیح فاز تایمر/کانتر 1 و 3

توضیحات مد PWM تصحیح فاز تایمر/کانتر 1 و 3 در ATmega128A:

  • عملکرد این مد شبیه مد 9 است. با این تفاوت که در این مد زمان آپدیت شدن رجیسترهای OCRnx در TOP است.
  • تایمر تا مقدار OCRnA بالا می رود و سپس به صورت نزولی تا مقدار BOTTOM می شمارد. و دوباره جهت شمارش صعودی می شود.
  • مقدار TOP را رجیستر OCRnA تعیین می کند. همچنین می توان OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM برای رجیسترهای مقایسۀ B و C اتفاق بیفتد، مقدار رجیسترهای OCRnB و OCRnC باید کمتر از OCRnA باشد.
  • در این مد هر جایی که رجیسترهای مقایسه مقدار دهی شوند مقدار آن ها در زمانی که تایمر به TOP (مقدار قرار گرفته در OCRnA) می رسد، در آن رجیسترها قرار می گیرد. البته مقدار رجیستر OCRnA اگر تغییر کند فوراً در آن رجیستر قرار می گیرد.
  • سرریز وقتی اتفاق می افتد که مقدار تایمر (در حالی که جهت شمارش نزولی دارد) به BOTTOM برسد. هرگاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد. همچنین در صورت فعال بودن وقفۀ مقایسۀ A، این وقفه زمانی اتفاق می افتد که مقدار تایمر به BOTTOM و OCRnA برسد. اولویت اتفاق افتادن وقفۀ مقایسۀ A از وقفۀ سرریز بیشتر است و ابتدا وقفۀ مقایسۀ A اتفاق می افتد.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-تصحیح-فاز-تایمر-کانتر-1-3-avr-atmega128a

تصویر 14 – نمودار زمانی مد PWM تصحیح فاز تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد CTC تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 12):

مشخصات مد CTC تایمر/کانتر 1 و 3 در ATmega128A مطابق جدول زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
MAX Immediate ICRn CTC 0 0 1 1 12

جدول  16 – مشخصات مد CTC تایمر/کانتر 1 و 3

توضیحات مد CTC (Clear Timer on Compare) تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار رجیستر ICRn (که در برنامه مقدار دهی شده است) می شمارد و پس از آن به مقدار BOTTOM می رسد و دوباره از BOTTOM شروع به شمارش می کند. (در این مد واحد capture قابل راه اندازی نیست.)
  • مقدار TOP را رجیستر ICRn تعیین می کند. همچنین می توان OCRnA، OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM ها اتفاق بیفتند، مقدار رجیسترهای OCRnA، OCRnB و OCRnC باید کمتر از ICRn باشد.
  • مقادیر جدید برای رجیسترهای مقایسه فوراً در آنها قرار می گیرد. همچنین با تغییر رجیستر ICRn، مقدارِ جدید فوراً در آن قرار می گیرد.
  • سرریز در MAX اتفاق می افتد و این امر تنها زمانی امکان پذیر است که ICRn=MAX (یعنی 0xFFFF) باشد. هر گاه تایمر سرریز شود وقفۀ سرریز در صورت فعال بودن اتفاق می افتد. و هر گاه CM اتفاق بیفتد وقفۀ مقایسۀ متناظر در صورت فعال بودن اتفاق می افتد.
  • در این مد واحد capture تحریک نمی شود و می توان از پایۀ ICPn به عنوان یک پورت ورودی/خروجی استفاده کرد. مقدار نوشته شده در رجیستر ICRn نیز تعیین کنندۀ مقدار TOP است. همچنین در صورت فعال بودن وقفۀ capture، این وقفه زمانی اتفاق می افتد که مقدار تایمر به MAXبرسد. (یعنی باید مقدار ICRn برابر MAX باشد و وقتی تایمر به MAX برسد وقفۀ capture اتفاق می افتد.) اولویت اتفاق افتادن وقفۀ capture نیز از وقفۀ سرریز بیشتر است و ابتدا وقفۀ capture اتفاق می افتد.

نمودار-زمانی-مد-pwm-ctc-تایمر-کانتر-1-3-avr-atmega128a

تصویر 15 – نمودار زمانی مد CTC تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد شمارۀ 13 رزرو شده است.

مد Fast PWM تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 14)

مشخصات مد PWM سریع تایمر/کانتر 1 و 3 در ATmega128A در جدول زیر آمده است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
TOP BOTTOM ICRn Fast PWM 0 1 1 1 14

جدول  17 – مشخصات مد PWM سریع تایمر/کانتر 1 و 3

توضیحات مد PWM سریع تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار ICRn (که در برنامه مقداردهی شده است) بالا می رود و پس از آن سرریز می شود و مقدارش به BOTTOM می رسد و دوباره از BOTTOM می شمارد.
  • مقدار TOP را رجیستر ICRn تعیین می کند. همچنین می توان OCRnA، OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM ها اتفاق بیفتند، مقدار رجیسترهای OCRnA، OCRnB و OCRnC باید کمتر از ICRn باشد.
  • هر جایی که رجیسترهای مقایسه مقدار دهی شوند این مقدار در زمانی که تایمر به BOTTOM برسد، در رجیسترهای مقایسه قرار داده می شوند. همچنین صورت تغییر مقدار ICRn، مقدار جدید فوراً در آن قرار می گیرد.
  • در این مد سرریز درهنگام رسیدن مقدار تایمر به TOP است. یعنی هنگامی که مقدار تایمر به مقدار قرار گرفته در ICRn برسد، سرریز اتفاق می افتد. هرگاه وقفۀ سرریز فعال باشد، وقفۀ آن اتفاق می افتد و هرگاه هر یک از CMها اتفاق بیفتد و وقفۀ آن فعال باشد، وقفۀ CM اتفاق می افتد.
  • در این مد واحد capture تحریک نمی شود و می توان از پایۀ ICPn به عنوان یک پورت ورودی/خروجی استفاده کرد. مقدار نوشته شده در رجیستر ICRn نیز تعیین کنندۀ مقدار TOP است. همچنین در صورت فعال بودن وقفۀ capture، این وقفه زمانی اتفاق می افتد که تایمر سرریز شود. اولویت اتفاق افتادن وقفۀ capture نیز از وقفۀ سرریز بیشتر است و ابتدا وقفۀ capture اتفاق می افتد.

نمودار-زمانی-مد-pwm-سریع-تایمر-کانتر-1-3-avr-atmega128a

تصویر 16 – نمودار زمانی مد Fast PWM تایمر/کانتر 1 و 3 و شکل موج روی OCnx

مد Fast PWM تایمر/کانتر 1 و 3 در ATmega128A (مد شمارۀ 15)

مشخصات مد PWM سریع تایمر/کانتر 1 و 3 در ATmega128A به صورت جدول زیر است.

TOVn flag set on Update of OCRnx at TOP Timer/Counter Mode Operation WGMn0

(PWMn0)

WGMn1

(PWMn1)

WGMn2

(CTCn)

WGMn3 Mode
TOP BOTTOM OCRnA Fast PWM 1 1 1 1 15

جدول  18 – مشخصات مد PWM سریع تایمر/کانتر 1 و 3

توضیحات مد PWM سریع تایمر/کانتر 1 و 3 در ATmega128A:

  • تایمر تا مقدار OCRnA بالا می رود و پس از آن سرریز می شود و مقدارش به BOTTOM می رسد و دوباره از BOTTOM می شمارد.
  • مقدار TOP را رجیستر OCRnA تعیین می کند. همچنین می توان OCRnB و OCRnC را مقداردهی کرد و از خروجی های مقایسۀ آنها استفاده کرد. برای این که CM ها اتفاق بیفتند، مقدار رجیسترهای OCRnB و OCRnC باید کمتر از OCRnA باشد.
  • هر جایی که رجیسترهای مقایسه مقدار دهی شوند این مقدار در زمانی که تایمر به BOTTOM می رسد، در رجیسترهای مقایسه قرار داده می شوند.
  • در این مد سرریز درهنگام رسیدن مقدار تایمر به TOP است. یعنی هنگامی که مقدار تایمر به مقدار قرار گرفته در OCRnA برسد، سرریز اتفاق می افتد. هرگاه وقفۀ سرریز فعال باشد، وقفۀ آن اتفاق می افتد و هرگاه هر یک از CMها اتفاق بیفتد و وقفۀ آن فعال باشد، وقفۀ CM اتفاق می افتد. وقفۀ مقایسۀ A هم در هنگام سرریز اتفاق می افتد و هم در BOTTOM.
  • در این مد اگر واحد capture تحریک شود، مقدار تایمر در رجیستر ICRn ذخیره می شود و وقفۀ capture در صورت فعال بودن اتفاق می افتد. (ابتدا وقفه اتفاق می افتد سپس مقدار تایمر در رجیستر ICRn ذخیره می شود.)

نمودار-زمانی-مد-pwm-سریع-تایمر-کانتر-1-3-avr-atmega128a

تصویر 17 – نمودار زمانی مد Fast PWM تایمر/کانتر 1 و 3 و شکل موج روی OCnx

چند نکته دربارۀ تایمر/کانتر 1 و 3:

  • در همۀ مدهای تایمر/کانتر می توان در رجیستر TCNTn (مقدار تایمر) نوشت. در این صورت تایمر به محض دریافت مقدار TCNTn، از مقدار قرار گرفته در TCNTn شروع به شمارش می کند. این امر تنها برای یک بار قابل اجراست و پس از اولین سرریز (سرریز ممکن است در BOTTOM باشد)، تایمر طبق مد کاری خود شمارش می کند. برای این که همواره تایمر از مقدار معینی (به غیر از صفر) شروع به شمارش کند باید آن مقدار معین هنگام سرریز و در روتین وقفۀ سرریز یا در وقفه های دیگر در TCNTn نوشته شود. در این صورت تایمر همواره از مقدار قرار گرفته در TCNTn شروع به شمارش می کند و این امر تکرار می شود. در مدهایی که شمارش صعودی و نزولی داریم وقتی مقدار تایمر در حال افزایش است و مقداری به آن بدهیم، تایمر از آن مقدار به صورت صعودی می شمارد و وقتی شمارش تایمر نزولی است و مقداری به آن بدهیم تایمر از آن مقدار به صورت نزولی می شمارد.
  • بیت های WGMn0، WGMn1 و WGMn2 به ترتیب نام های جدید بیت های PWMn0، PWMn1 و CTCn هستند.
  • هر یک از واحدهای مقایسۀ A، B و C یک روتین وقفۀ جداگانه دارند.
  • در تمام مدهای بالا منبع کلاک تایمر/کانتر می تواند از خارج از میکروکنترلر نیز باشد. یعنی برای کاربرد کانتر نیز می توان مدهای بالا را به کار برد.
  • در مدهایی که ICRn و OCRnA تعیین کنندۀ مقدار TOP هستند، این رجیسترها باید بعد از بیت های WGMn[3:0]مقداردهی شوند.
  • در نوشتن رجیسترهای 16 بیتی باید دقت کرد که ابتدا بایت پر ارزش نوشته شود سپس بایت کم ارزش و در هنگام خواندن آنها باید ابتدا بایت کم ارزش خوانده شود سپس بایت پر ارزش. برای مثال به رجیستر OCR1A مقدار می دهیم ومقدار رجیستر TCNT1 را میخوانیم و در متغیرهای TH و TL قرار می دهیم:

OCR1AH=0xFA;

OCR1AL=0xE5;

TL=TCNT1L;

TH=TCNT1H;

واحد Capture (تسخیر) در تایمر/کانتر 1 و 3

در مدهایی از تایمر 1 که رجیستر ICRn مقدار TOP را تعیین نمی کند، این واحد قابل استفاده است. عملکرد این واحد به این  صورت است که با تحریک آن، مقدار فعلیِ تایمر (یا کانتر) در رجیستر ICRn ذخیره می شود. تحریک این واحد می تواند از دو منبع باشد:

  • لبۀ بالا رونده یا پایین رونده روی پایۀ ICPn که نوع آن در رجیستر تعیین می شود؛
  • خروجی مقایسه گر آنالوگ (ACO) که این منبع در رجیستر ACSR از رجیسترهای مقایسه گر آنالوگ تعیین می شود.

هر گاه یکی از این دو منبع واحد capture را تحریک کند، مقدار تایمر در رجیستر ICRn ذخیره می شود. در این واحد یک المان وجود دارد که با فعال سازی آن می توان عملکرد واحد capture را با استفاده از یک فیلتر دیجیتال ساده در برابر نویز ایمن کرد. این المان Noise Canceler نام دارد. با فعال سازی این المان، تعداد 4 نمونه از سیگنالی که روی پایۀ ICPn قرار دارد گرفته می شود. در صورت برابر بودن هر چهار نمونه، واحد capture تحریک می شود. المان noise canceler از کلاک cpu استفاده می کند، نه از فرکانس خروجی تقسیم کنندۀ فرکانس. استفاده از noise canceler باعث ایجاد تأخیر (به اندازۀ چهار کلاک cpu) در تحریک واحد capture می شود. که این تأخیر در مواردی که کلاک تایمر برابر کلاک cpu است، مقدار قابل توجهی است.

باید توجه داشت که اگر واحد capture قرار است چند بار پشت سر هم یا دائماً تحریک شود، مقدار رجیستر ICRn هر چه سریع تر خوانده شود. زیرا ممکن است تحریک بعدی پیش از خواندن مقدار ICRn، مقدار این رجیستر را تغییر دهد. برای این منظور وقفۀ capture بهترین زمان برای خواندن مقدار ICPn است. فواصل زمانی بین تحریک ها نیز باید به گونه ای باشد که این موضوع اتفاق نیفتد. همچنین استفاده از واحد capture در مدهایی که مقدار TOP دائماً در تغییر است توصیه نمی شود. شکل زیر بلوک دیاگرام واحد capture را نشان می دهد.

بلوک-دیاگرام-واحد-capture-تایمر-کانتر-1-3-avr-atmega128a

تصویر 18 – بلوک دیاگرام واحد Capture تایمر/کانتر 1 و 3 در AVR

Prescaler در تایمر/کانتر 1 و 3

تایمر/کانتر 1 و 3 دارای یک واحد تقسیم کنندۀ فرکانس است که می تواند فرکانسِ cpu را به اعداد 8 و 64 و 256 و 1024 تقسیم کند و آنگاه آن را به تایمر بدهد. بلوک تایمر/کانتر می تواند با فرکانس cpu هم کار کند که در این صورت نیاز به تقسیم فرکانس نیست. همچنین در کاربرد کانتر، تقسیم کنندۀ فرکانس غیر قابل استفاده است. بلوک دیاگرام تقسیم کنندۀ فرکانس را در شکل زیر مشاهده می کنید.

بلوک-دیاگرام-تقسیم-کننده-فرکانس-تایمر-کانتر-1-3-avr-atmega128a

تصویر 19 – بلوک دیاگرام واحد تقسیم کنندۀ فرکانس تایمر/کانتر 1 و 2 و 3

نوع کلاکِ بلوک تایمر/کانتر 1 و 3 با بیت های CSn[2:0] از رجیستر TCCRnB انتخاب می شود. اگر این سه بیت صفر باشند، تایمر/کانتر خاموش است، در غیر این صورت تایمر/کانتر فعال است و منبع کلاک آن با توجه به جدول زیر تعیین می شود.

نوع کلاک تایمر/کانتر CSn0 CSn1 CSn2
تایمر/کانتر متوقف (خاموش) است. 0 0 0
کلاک cpu بدون تقسیم (clkI/O) 1 0 0
کلاک cpu تقسیم بر 8 (clkI/O/8) – از تقسیم کنندۀ فرکانس 0 1 0
کلاک cpu تقسیم بر 64 (clkI/O/64) – از تقسیم کنندۀ فرکانس 1 1 0
کلاک cpu تقسیم بر 256 (clkI/O/256) – از تقسیم کنندۀ فرکانس 0 0 1
کلاک cpu تقسیم بر 1024 (clkI/O/1024) – از تقسیم کنندۀ فرکانس 1 0 1
لبۀ پایین روندۀ سیگنال اعمالی به پایۀ Tn – سیگنال خارجی 0 1 1
لبۀ بالا روندۀ سیگنال اعمالی به پایۀ Tn – سیگنال خارجی 1 1 1

جدول 19 – نوع کلاک تایمر/کانتر 1 و 3 در ATmega128A

کاربرد کانتر (Counter Mode) در تایمر/کانتر 1 و 3

همان طور که گفته شد اگر منبع کلاک بلوک تایمر/کانتر از بیرون از میکروکنترلر باشد، این بلوک در کاربرد کانتر قرار دارد. در این کاربرد بلوک تایمر/کانتر با هر لبۀ بالا رونده یا پایین روندۀ یک کلاک خارجی که روی پایۀ Tn اعمال می شود، کار می کند. با هر لبۀ بالا رونده یا پایین رونده، یک واحد به مقدار شمارش اضافه می شود. کاربرد کانتر در شمارشِ تعداد پالس های یک سیگنال است. این سیگنال می تواند از خرجی یک سنسور یا هر المان دیگری که نیاز به شمارش پالس های آن است، باشد. در کابرد کانتر نمی توان از تقسیم کنندۀ فرکانس استفاده کرد. همچنین بهتر است فرکانس سیگنال ورودی کانتر کمتر از 0.4 فرکانس cpu (یعنی 0.4 fclk_I/O) باشد. بلوک دیاگرام کانتر را در شکل زیر مشاهده می کنید.

بلوک-دیاگرام-کانتر-1-3-avr-atmega128a

تصویر 20 – بلوک دیاگرام کانتر 1 و 3 در ATmega128A

واحدهای مقایسۀ خروجی (Output Compare Units) یا واحد های مقایسه

تایمر/کانتر 1 و 3 در میکروکنترلر ATmega128 هر کدام دارای سه واحد مقایسه (یا واحد مقایسۀ خروجی) به نام های واحد مقایسۀ A، واحد مقایسۀ B و واحد مقایسۀ C هستند. این واحد های مقایسه دائماً مقدار خروجی تایمر را با رجیسترهای OCRnA، OCRnB و OCRnC (که در برنامه مقدار دهی شده اند) مقایسه می کنند و در صورت تطابق می توانند یک وقفه بدهند. هر یک از واحد های مقایسه دارای یک روتین وقفۀ جداگانه هستند. همچنین در هر یک از واحد های مقایسه یک بخش Waveform Generator وجود دارد که در صورت تطابق مقدار تایمر با مقدار رجیستر OCRnx می تواند خروجی واحد مقایسه (یعنی پایه های OCnx) را با توجه به مقادیر بیت های COMnx[1:0] صفر و یک کند. از این واحد می توان برای تولید موج PWM استفاده کرد. بلوک دیاگرام این واحد را در تصویر 2 مشاهده می کنید. همچنین بلوک دیاگرام خروجی واحد مقایسه را در شکل زیر می بینید.

بلوک-دیاگرام-خروجی-واحد-مقایسه-تایمر-کانتر-1-3-avr-atmega128a

تصویر 21 – بلوک دیاگرام خروجی واحد مقایسۀ تایمر/کانتر 1 و 3

مقایسۀ اجباری در تایمر/کانتر 1 و 3

در مدهایی به غیر از مدهای PWM (مدهای Normal و CTC)، با فعال سازی این بخش از واحدهای مقایسه، یک تطابق اجباری ایجاد می شود و با توجه به حالات خروجی مقایسه کننده ها یک تغییر سطح روی پایه های OCnx اتفاق می افتد. این تطابق اجباری تنها روی خروجی های واحد مقایسه اثر می گذارد و روی وقفه های آن اثر گذار نیست.

 

وقفه های تایمر کانتر 1 و 3

هر یک از بلوک های تایمر/کانتر 1 و 3، 5 وقفه دارند که با فعال کردن آنها می توان از روتین وقفۀ مربوطه برای نوشتن کدهای برنامه استفاده کرد. زمان اتفاق افتادن این وقفه ها به مد تایمر بستگی دارد. این 5 وقفه عبارتند از:

  1. وقفۀ سرریز؛
  2. وقفۀ capture؛
  3. وقفۀ مقایسۀ A؛
  4. وقفۀ مقایسۀ B؛
  5. وقفۀ مقایسۀ C.

 

رجیسترهای تایمر/کانتر 1 و 3

رجیسترهای تایمر/کانتر 1 و 3 دقیقاً شبیه هم هستند. در این رجیسترها n به معنای شمارۀ تایمر/کانتر (1 یا 3) و x بیانگر نام رجیستر مقایسه (A و B و C) است. این رجیسترها به شرح زیر می باشند:

رجیستر TCCR1A و TCCR1B و TCCR1C

این سه رجیستر کنترلی شامل بیت های WGM و COM است که حالات مختلف و مدهای مختلف با مقدار دهی به این رجیسترها حاصل می شوند. همچنین در این رجیسترها فرکانس کاری تایمر (مقدار تقسیم فرکانس از بلوک تقسیم فرکانس) یا کاربرد کانتر انتخاب می شود. در رجیستر سوم نیز بیت های مربوط به مقایسۀ اجباری قرار دارند که در ادامه توضیح داده می شوند.

TCCRnA (Timer/Counter Control Register n A)
0 1 2 3 4 5 6 7 Bit number
WGMn0 WGMn1 COMnC0 COMnC1 COMnB0 COMnB1 COMnA0 COMnA1 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 20 – رجیستر TCCRnA

TCCRnB (Timer/Counter Control Register n B)
0 1 2 3 4 5 6 7 Bit number
CSn0 CSn1 CSn2 WGMn2 WGMn3 ICESn ICNCn 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

جدول 21 – رجیستر TCCRnB

TCCRnC (Timer/Counter Control Register n C)
0 1 2 3 4 5 6 7 Bit number
FOCnC FOCnB FOCnA Bit name
R R R R R W W W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 22 – رجیستر TCCRnC

بیت های  WGMn[3:0](Waveform Generation Mode): این بیت ها تعیین کنندۀ مد عملیاتی تایمر/کانتر 1 و 3 است.

بیت های COMnx[1:0] (Compare Output Mode): این بیت ها حالت های خروجی مقایسه کننده های تایمر/کانتر 1 و 3 را تعیین می کنند.

بیت ICESn (Input Capture Edge Select): اگر این بیت صفر باشد، لبۀ پایین روندۀ سیگنال روی پایۀ ICPn واحد capture را تحریک می کند و اگر در این بیت 1 نوشته شود، لبۀ بالا روندۀ سیگنال روی پایۀ ICPn واحد capture را تحریک می کند.

بیت ICNCn (Input Capture Noise Canceler): با نوشتن 1 در این بیت، المان Noise Canceler فعال می شود و با نوشتن صفر در آن این المان غیر فعال می شود.

بیت های CSn[2:0] (Clock Select): این بیت ها تعیین کنندۀ نوع و مقدار کلاک تایمر/کانتر است.

بیت های FOCnx (Force Output Compare): با یک شدن هر یک از این بیت ها یک مقایسۀ اجباری برای مقایسه کنندۀ متناظر اتفاق می افتد.

رجیسترهای TCNTn (TCNTnL و TCNTnH)

مقدار تایمر در این رجیسترها قرار دارد. یعنی با هر کلاک به بلوک تایمر/کانتر یک واحد به این رجیستر اضافه می شود. این رجیسترِ 16 بیتی از دو رجیستر 8 بیتی تشکیل شده است.

TCNTnL (Timer/Counter n Register Low Byte)
0 1 2 3 4 5 6 7 Bit number
TCNTnL.0 TCNTnL.1 TCNTnL.2 TCNTnL.3 TCNTnL.4 TCNTnL.5 TCNTnL.6 TCNTnL.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 23 – رجیستر TCNTnL

TCNTnH (Timer/Counter n Register High Byte)
0 1 2 3 4 5 6 7 Bit number
TCNTnH.0 TCNTnH.1 TCNTnH.2 TCNTnH.3 TCNTnH.4 TCNTnH.5 TCNTnH.6 TCNTnH.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 24 – رجیستر TCNTnH

رجیسترهای OCRnAو OCRnB و OCRnC

این رجیسترها مربوط به واحد مقایسه هستند. در واحد مقایسه، مقدار تایمر با مقدار نوشته شده در این رجیسترها مقایسه می شود. هر کدام از این رجیسترهای 16 بیتی از دو رجیستر 8 بیتی تشکیل شده است.

OCRnAL (Output Compare Register n A Low Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnAL.0 OCRnAL.1 OCRnAL.2 OCRnAL.3 OCRnAL.4 OCRnAL.5 OCRnAL.6 OCRnAL.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 25 – رجیستر OCRnAL

OCRnAH (Output Compare Register n A High Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnAH.0 OCRnAH.1 OCRnAH.2 OCRnAH.3 OCRnAH.4 OCRnAH.5 OCRnAH.6 OCRnAH.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 26 – رجیستر OCRnAH

OCRnBL (Output Compare Register n B Low Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnBL.0 OCRnBL.1 OCRnBL.2 OCRnBL.3 OCRnBL.4 OCRnBL.5 OCRnBL.6 OCRnBL.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 27 – رجیستر OCRnBL

OCRnBH (Output Compare Register n B High Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnBH.0 OCRnBH.1 OCRnBH.2 OCRnBH.3 OCRnBH.4 OCRnBH.5 OCRnBH.6 OCRnBH.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 28 – رجیستر OCRnBH

OCRnCL (Output Compare Register n C Low Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnCL.0 OCRnCL.1 OCRnCL.2 OCRnCL.3 OCRnCL.4 OCRnCL.5 OCRnCL.6 OCRnCL.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 29 – رجیستر OCRnCL

OCRnCH (Output Compare Register n C High Byte)
0 1 2 3 4 5 6 7 Bit number
OCRnCH.0 OCRnCH.1 OCRnCH.2 OCRnCH.3 OCRnCH.4 OCRnCH.5 OCRnCH.6 OCRnCH.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 30 – رجیستر OCRnCH

رجیستر ICRn (ICRnL و ICRnH)

این رجیستر مربوط به واحد capture است. هر گاه واحد capture تحریک شود مقدار تایمر که در رجیستر TCNTn قرار دارد در رجیستر ICRn ذخیره می شود.

ICRnL (Input Capture Register n Low Byte)
0 1 2 3 4 5 6 7 Bit number
ICRnL.0 ICRnL.1 ICRnL.2 ICRnL.3 ICRnL.4 ICRnL.5 ICRnL.6 ICRnL.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 31 – رجیستر ICRnL

ICRnH (Input Capture Register n High Byte)
0 1 2 3 4 5 6 7 Bit number
ICRnH.0 ICRnH.1 ICRnH.2 ICRnH.3 ICRnH.4 ICRnH.5 ICRnH.6 ICRnH.7 Bit name
R/W R/W R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 0 0 Initial Value

جدول 32 – رجیستر ICRnH

رجیستر TIMSK

بیت های 2 تا 5 این رجیستر مربوط به وقفه های تایمر/کانتر 1 است.

TIMSK (Timer/Counter Interrupt Mask Register)
0 1 2 3 4 5 6 7 Bit number
TOIE1 OCIE1B OCIE1A TICIE1 Bit name
R/W R/W R/W R/W Access
0 0 0 0 Initial Value

جدول 33 – رجیستر TIMSK در تایمر/کانتر 1 و 3

بیت TICIE1 (Timer/Counter 1 Input Capture Interrupt Enable): با یک شدن این بیت، وقفۀ capture برای تایمر/کانتر 1 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE1A (Timer/Counter 1 Output Compare A Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ A برای تایمر/کانتر 1 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE1B (Timer/Counter 1 Output Compare B Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ B برای تایمر/کانتر 1 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت TOIE1 (Timer/Counter 1 Overflow Interrupt Enable): با یک شدن این بیت، وقفۀ سرریز برای تایمر/کانتر 1 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

رجیستر ETIMSK

بیت صفر این رجیستر مربوط به وقفۀ مقایسۀ C تایمر/کانتر 1 و بیت های 1 تا 5 آن نیز مربوط به وقفه های تایمر/کانتر 3 می باشد.

ETIMSK (Extended Timer/Counter Interrupt Mask Register)
0 1 2 3 4 5 6 7 Bit number
OCIE1C OCIE3C TOIE3 OCIE3B OCIE3A TICIE3 Bit name
R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 Initial Value

جدول 34 – رجیستر ETIMSK

بیت TICIE3 (Timer/Counter 3 Input Capture Interrupt Enable): با یک شدن این بیت، وقفۀ capture برای تایمر/کانتر 3 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE3A (Timer/Counter 3 Output Compare A Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ A برای تایمر/کانتر 3 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE3B (Timer/Counter 3 Output Compare B Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ B برای تایمر/کانتر 3 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت TOIE3 (Timer/Counter 3 Overflow Interrupt Enable): با یک شدن این بیت، وقفۀ سرریز برای تایمر/کانتر 3 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE3C (Timer/Counter 3 Output Compare C Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ C برای تایمر/کانتر 3 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

بیت OCIE1C (Timer/Counter 1 Output Compare C Match Interrupt Enable): با یک شدن این بیت، وقفۀ مقایسۀ C برای تایمر/کانتر 1 فعال می شود و با صفر شدن آن، این وقفه غیر فعال می شود.

رجیستر TIFR

در این رجیستر پرچم های مربوط به وقفه های تایمر/کانتر 1 قرار دارد.

TIFR (Timer/Counter Interrupt Flag Register)
0 1 2 3 4 5 6 7 Bit number
TOV1 OCF1B OCF1A ICF1 Bit name
R/W R/W R/W R/W Access
0 0 0 0 Initial Value

جدول 35 – رجیستر TIFR

بیت ICF1 (Timer/Counter 1 Input Capture Flag): با اتفاق افتادن وقفۀ capture برای تایمر/کانتر 1، این پرچم 1 می شود.

بیت OCF1A (Timer/Counter 1 Output Compare A Match Flag): با اتفاق افتادن وقفۀ مقایسۀ A برای تایمر/کانتر 1، این پرچم 1 می شود.

بیت OCF1B (Timer/Counter 1 Output Compare B Match Flag): با اتفاق افتادن وقفۀ مقایسۀ B برای تایمر/کانتر 1، این پرچم 1 می شود.

بیت TOV1 (Timer/Counter 1 Overflow Flag): با اتفاق افتادن وقفۀ سرریز برای تایمر/کانتر 1، این پرچم 1 می شود.

رجیستر ETIFR

بیت صفر این رجیستر، پرچم وقفۀ مقایسۀ C برای تایمر/کانتر 1 و بیت های 1 تا 5 آن نیز پرچم وقفه های تایمر/کانتر 3 می باشد.

ETIFR (Extended Timer/Counter Interrupt Flag Register)
0 1 2 3 4 5 6 7 Bit number
OCF1C OCF3C TOV3 OCF3B OCF3A ICF3 Bit name
R/W R/W R/W R/W R/W R/W Access
0 0 0 0 0 0 Initial Value

جدول 36 – رجیستر ETIFR

بیت ICF3 (Timer/Counter 3 Input Capture Flag): با اتفاق افتادن وقفۀ capture برای تایمر/کانتر 3، این پرچم 1 می شود.

بیت OCF3A (Timer/Counter 3 Output Compare A Match Flag): با اتفاق افتادن وقفۀ مقایسۀ A برای تایمر/کانتر 3، این پرچم 1 می شود.

بیت OCF3B (Timer/Counter 3 Output Compare B Match Flag): با اتفاق افتادن وقفۀ مقایسۀ B برای تایمر/کانتر 3، این پرچم 1 می شود.

بیت TOV3 (Timer/Counter 3 Overflow Flag): با اتفاق افتادن وقفۀ سرریز برای تایمر/کانتر 3، این پرچم 1 می شود.

بیت OCF3C (Timer/Counter 3 Output Compare C Match Flag): با اتفاق افتادن وقفۀ مقایسۀ C برای تایمر/کانتر 3، این پرچم 1 می شود.

بیت OCF1C (Timer/Counter 1 Output Compare C Match Flag): با اتفاق افتادن وقفۀ مقایسۀ C برای تایمر/کانتر 1، این پرچم 1 می شود.

 

چند تمرین برای تایمر/کانتر 1 و 3

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

تمرین 1: عبوردهندۀ سیگنال با فرکانس زیر 1kHz با تایمر/کانتر 1 و 3

یک سیگنال پالسی شکل به پایۀ INT4 اعمال می شود که فرکانس آن بین 200 Hz تا 5 kHz تغییر می کند. با استفاده از مد صفر تایمر یک و استفاده از وقفۀ خارجی شمارۀ چهار (با حساسیت به هر دو لبۀ بالا رونده و پایین رونده) برنامه ای بنویسید که سیگنال ورودی با فرکانس های کمتر از 1 kHz (از 200 Hz تا 1 kHz) را به پایۀ OC1A انتقال دهد. فرکانس کاری میکروکنترلر را 8 MHz قرار دهید و فرکانس کاری تایمر یک همان 8 MHz باشد. برنامۀ تایمر با کدویژن نوشته شود.

راهنمایی: زمان هر پله از تایمر برابر 1/8M = 0.125us است. و پریود یک سیگنال 1 kHz برابر 1000 us می باشد. برای این که یک سیگنال با فرکانس 1 kHz روی پایۀ OC1A داشته باشیم باید رجیستر OCR1A برابر 4000 باشد و مقدار تایمر تا عدد 4000 بالا برود و پس از آن تایمر صفر شود و دوباره این سیکل تکرار شود. هر بار که تایمر به مقدار 4000 می رسد خروجی OC1A یک بار تغییر وضعیت می دهد (حالت toggle برای OC1A، یعنی  COM1A[1:0]=01 باشد). پس پریود سیگنال خروجی که حاصل دو تغییر وضعیت OC1A است، برابر 8000 پلۀ تایمر می باشد که زمان آن برابر 8000 * 0.125 = 1000 us می شود. حال برای این که فقط فرکانس های کمتر از 1 KHz از میکروکنترلر عبور کند باید مقدار OCR1A برابر 4000 باشد و ما در وقفۀ خارجی شمارۀ چهار مقدار تایمر را صفر کنیم. در این صورت تایمر تا زمانی که وقفه اتفاق می افتد بالا می رود و سپس صفر می شود. حال اگر مقدار تایمر کمتر از 4000 باشد مقایسۀ A اتفاق نمی افتد و خروجی آن toggle نمی شود. ولی اگر مقدار تایمر بالاتر از 4000 باشد خروجی OC1A همواره toggle می شود و همان سیگنال با همان فرکانس به خروجی منتقل می شود. در این برنامه هدفِ استفاده از وقفه آن است که در آن وقفه، مقدار تایمر را صفر کنیم. و این وقفه حتماً باید حساس به هر دو لبه باشد.

تمرین-1-تایمر-کانتر-1-3-عبور-دهنده-سیگنال-زیر-1-کیلو-هرتز-avr-atmega128a

تصویر 22 – انتقال سیگنال زیر یک کیلو هرتز به پایۀ OC1A

تمرین 2: ساخت موج مربعی با فرکانس بین 100 هرتز تا 4 کیلوهرتز

با استفاده از مد شماره 4 تایمر/کانتر یک، یک تولید کنندۀ پالس با فرکانس متغیر بین 100 Hz تا 4 kHz بسازید. فرکانس کاری میکروکنترلر و تایمر یک هر دو 8 MHz باشد.

راهنمایی: OC1A را در حالت toggle قرار دهید و مقدار OCR1A را بین دو عدد بگیرید تا محدودۀ فرکانسی مورد نظر بدست بیاید. پایه های PD.0 و PD.1 را ورودی می کنیم. قرار است با فشردن کلید روی PD.0 فرکانس زیاد شود و با فشردن کلید روی PD.1 فرکانس کم شود. تایمر با پله های 0.125 میکرو ثانیه ای تا مقدار OCR1A بالا می رود. در این هنگام با قرار دادن OC1A روی حالت toggle پایۀ OC1A تغییر وضعیت می دهد. حال باید محاسبه کنیم که مقدار OCR1A برای فرکانس های 100Hz و 4kHz چقدر است. پریود سیگنال 100Hz برابر 10000 میکرو ثانیه است. برای تولید این شکل موج OC1A باید هر 5000 میکرو ثانیه یک بار تغییر وضعیت دهد. پس مقدار OCR1A باید برابر 5000/0.125 = 40000 باشد. به همین صورت برای فرکانس 4kHz پریود سیگنال برابر 250 میکرو ثانیه است. برای تولید این شکل موج باید تایمر تا مقدار 125 بالا برود و OCR1A یک بار تغییر وضعیت بدهد. بنابراین مقدار OCR1A برابر است با 125/0.125 = 1000 باشد. برنامه را طوری می نویسیم که با هر بار فشردن کلیدهای روی PD.0 و PD.1، 500 واحد از OCR1A کم شود و یا به آن اضافه شود. مقدار دهی به رجیستر 16 بیتی نیز باید رعایت شود و ابتدا باید OCR1AH مقداردهی شود و سپس OCR1AL.

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

در این تمرین که می تواند یک پروژۀ تایمر با AVR باشد، قصد داریم با استفاده از مد صفر تایمر/کانتر یک، یک فرکانس متر با رنج اتوماتیک بسازیم. برنامه به این صورت است که برای تعیین رنج چند حلقۀ while بی نهایت تعریف شده است. برنامه قرار است در یک زمان مشخص (delay) تعداد پالس هایی را که به پایۀ T1 (پایۀ PD.6 از میکروکنترلر ATmega128) اعمال می شود بشمارد. برای این کار در ابتدای هر حلقه، کانتر 1 روشن می شود و بعد از یک delay دوباره خاموش می شود. مقدار شمارش شده از رجیستر TCNT1 خوانده می شود. همچنین یک مقدار دیگر (i) هم خوانده می شود. i مقداری است که در اثر سرریز کانتر 1 بدست آمده است. هر بار که کانتر 1 سرریز می شود در روتینِ وقفۀ سرریزِ کانتر 1، به i یک واحد اضافه می شود. مقدار TCNT1 با مقدار i*65536 جمع می شود که کل زمان مورد نظر ما را در بر می گیرد. اگر تعداد پالس های شمارش شده بر زمان مورد نظر تقسیم شود فرکانس بدست می آید. در این برنامه از مد صفر تایمر/کانتر 1 استفاده شده است.

حلقۀ اول (رنج 1000Hz)

در این حلقه ابتدا کانتر 1 روشن می شود. سپس یک delay برابر 1000ms ایجاد می شود. بعد از این delay مقدار شمارش شدۀ پالس (TCNT1) و تعداد دفعات سرریز (i) خوانده می شوند. همچنین مقدار i در عدد 65536 ضرب می شود تا تعداد پالس‌ های شمارش شده در یک چرخۀ کامل سرریز بدست بیاید. در سطر بعدی TCNT1 و تعداد پالس حاصل از سرریزها (i) با هم جمع می شوند تا تعداد پالس های شمرده شده (F) در 1000ms بدست بیاید. حال کانتر 1 خاموش می شود. در مرحلۀ بعد F که همان فرکانس است روی LCD نمایش داده می‌شود. بعد از نمایش F، مقدار i و TCNT1 صفر می شوند تا دوباره در چرخۀ دیگر حلقۀ بی نهایت اندازه‌ گیری شوند.

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (1<<CS11) | (0<<CS10);
delay_ms(1000);
F=TCNT1/1.0;
i=i*65536.0;
F=F+i;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
lcd_clear();
sprintf(str,"RANGE:1000Hz\nf = %.0f Hz",F);
lcd_puts(str);
delay_ms(50);
TCNT1=0;
i=0;

 

سطر اول و دوم: روشن شدن کانتر

سطر سوم: delay برابر با 1 ثانیه

سطر چهارم: خواندن مقدار TCNT1 و قرار دادن آن در متغیر F و همچنین تبدیل آن به متغیر نوع float

سطر پنجم: خواندن تعداد دفعات سرریز و ضرب آن در تعداد پالس یک چرخۀ کامل کانتر (65536)

سطر ششم: جمع پالس های حاصل از سرریز و پالس های شمارش شده در تایمر قبل از سرریز و قرار دادن آن در F

سطر هفتم و هشتم: خاموش کردن کانتر 1

سطر نهم و دهم و یازدهم: نمایش F در LCD کاراکتری

سطر دوازدهم: ایجاد یک delay برای نمایش روی LCD

سطر سیزدهم و چهاردهم: بازگرداندن i و TCNT1 به مقدار اولیه یعنی صفر.

رنج اتوماتیک

برای این که فرکانس در محدودۀ وسیعی اندازه گیری شود لازم است تا delay در محدوده های دیگر به کار گرفته شود. برای این منظور چند حلقۀ بی نهایت دیگر تعریف شده اند تا در صورتی که رنج فرکانس عوض شد، برنامه به حلقه های دیگر پرش کند و کدهای آن حلقه را اجرا کند.

برای رنج 1000Hz از delay برابر با 1000ms استفاده شده است.

برای رنج 10kHz از delay برابر با 500ms استفاده شده است.

برای رنج 100kHz از delay برابر با 500ms استفاده شده است.

برای رنج 1MHz از delay برابر با 10ms استفاده شده است.

برای رنج 8MHz از delay برابر با 1000µs استفاده شده است.

برای این که از خاصیت Auto Range استفاده کنیم لازم است در هر حلقۀ بی نهایت مقدار فرکانس در محدوده‌ی رنج خود سنجیده شود. به طوری که اگر فرکانس در آن رنج نباشد برنامه به حلقه ای پرش کند که آن فرکانس را در بر می گیرد. در برنامه رنج ها به ترتیب قرار گرفته اند. در انتهای هر حلقۀ بی نهایت دو شرط (if) تعریف شده است که فرکانس را می سنجند. اگر فرکانس از محدودۀ رنجِ در حالِ اجرا کمتر باشد، برنامه به رنج قبلی پرش می کند. و اگر فرکانس بیشتر از محدودۀ رنجِ این حلقه باشد برنامه به رنجِ بعدی که محدوده ای با فرکانس بالاتر است پرش می کند. مثلاً در حلقۀ بی نهایت سوم که رنج فرکانس محدودۀ 100kHz می باشد، اگر فرکانس کمتر از 10kHz باشد برنامه به حلقۀ قبلی پرش می کند و اگر فرکانس بزرگتر از 100kHz باشد به حلقۀ بعدی که رنج بالاتر است پرش می کند.

if ((F>100)&(j==7)){
	goto range4;
}

if ((F<=10)&(j==7)){
	goto range2;
}

 

در ابتدای هر حلقه یک برچسب زده شده است که وقتی در انتهای حلقه ها این دو شرط بررسی می شوند برنامه به برچسب مورد نظر پرش کند. برای این منظور از دستور goto استفاده می‌شود.

range1 , range2 , range3 , range4 , range5

 

لازم به ذکر است که این فرکانس متر در تئوری تا فرکانس 8MHz را اندازه می گیرد. اما بنا به مطالب دیتاشیت، بهتر است فرکانس اعمال شده به کانتر کمتر از 0.4 فرکانس کاری CPU (یعنی 3.2MHz) باشد.

تمرین 4: تولید سه موج PWM با استفاده از تایمر/کانتر 3

با استفاده از مد 6 تایمر/کانتر سه، سه شکل موج PWM بسازید و با 6 کلید عرض پالس آنها را بین 1 تا 254 پله از تایمر تغییر دهید. فرکانس کاری میکروکنترلر 8 MHz و فرکانس کاری تایمر 1 MHz باشد. راه اندازی تایمر در کدویژن انجام شود.

راهنمایی: 6 پایۀ اول پورت D را ورودی با پول آپ داخلی می کنیم. 6 کلید روی این پورت ها قرار می دهیم و سر دیگر کلیدها را به زمین وصل می کنیم. تایمر سه را روی مد 6 می گذاریم. هر سه خروجی آن را فعال می کنیم و روی PWM ناوارون تنظیم می کنیم. همچنین با تنظیم بیت های CS به صورت CS3[2:0]=010 فرکانس cpu را به 8 تقسیم می کنیم تا فرکانس کاری تایمر 1 MHz شود. برای هر کلید شرط می نویسیم که به مقادیر OCR3xL اضافه یا از آن کم شود.

 

از آموزش تایمر/کانتر 1 و 3 نتایج زیر حاصل می شوند:

  1. بلوک های تایمر/کانتر در AVR یا 8 بیتی هستند یا 16 بیتی.
  2. تایمر/کانتر 1 و 3 در ATmega128A هم تایمر است و هم کانتر. تایمر/کانتر 1 و شبیه همدیگر هستند.
  3. در هر کدام از مدهای تایمر/کانتر حالت هایی برای تغییر وضعیت OCnx وجود دارد. این حالات با بیت های COMnx1 و COMnx0 انتخاب می شوند.
  4. تایمر/کانتر 1 و 3 دارای چهارده مد است که شامل مدهای نرمال، PWM تصحیح فاز، PWM تصحیح فاز و فرکانس، PWM سریع و CTC می شوند.
  5. مد شمارۀ 13 رزرو شده است. یعنی برای این مد عملکردی تعریف نشده است.
  6. اگر به رجیستر TCNTn مقدار بدهیم، تایمر/کانتر از آن مقدار شروع به شمارش می کند.
  7. بیت های WGMn0 و WGMn1 و WGMn2 به ترتیب نام های جدید بیت های PWMn0 و PWMn1 و CTCn هستند.
  8. هر کدام از واحدهای مقایسۀ A و B و C، یک روتین وقفۀ جداگانه دارند.
  9. در مدهایی که ICRn و OCRnA تعیین کنندۀ مقدار TOP هستند، این رجیسترها باید بعد از مقداردهی به بیت های WGMn[3:0] مقداردهی شوند.
  10. در نوشتن رجیسترهای 16 بیتی ابتدا باید بایت پرارزش نوشته می شود.
  11. در خواندن رجیسترهای 16 بیتی باید ابتدا بایت کم ارزش خوانده شود.
  12. واحد Capture در مدهایی که رجیستر ICRn مقدار TOP را مشخص نمی کند قابل استفاده است.
  13. واحد Capture می تواند توسط دو منبع تحریک شود: 1- لبۀ بالا رونده یا پایین روندۀ سیگنال روی پایۀ ICPn؛ 2- خروجی مقایسه گر آنالوگ.
  14. یک المان Noise Canceler در واحد Capture وجود دارد که با استفاده از 4 نمونه برداری از سیگنال روی پایۀ ICPn، از تحریک واحد Capture توسط نویز جلوگیری می کند.
  15. در استفاده از Noise Canceler در مواردی که فرکانس تایمر/کانتر برابر با فرکانس CPU است، در ذخیره کردن مقدار تایمر/کانتر در رجیستر ICRn تأخیر قابل توجهی ایجاد می کند.
  16. برای راه اندازی تایمر/کانتر کافی است بیت های CSn[2:0] برابر 000 نباشند.
  17. در کاربرد کانتر در تایمر/کانتر 1 و 3، کلاک از پایۀ T1 و T3 گرفته می شود. این کلاک نمی تواند با واحد تقسیم فرکانس تقسیم بر عددی شود و مستقیماً به تایمر/کانتر وصل می شود.
  18. مقایسۀ اجباری در مدهای نرمال و CTC وجود دارد. با مقایسۀ اجباری وقفۀ مقایسه اتفاق نمی افتد.
  19. فرکانس سیگنال ورودی به پایۀ T1 و T3 در کاربرد کانتر بهتر است کمتر از 4 فرکانس کلاک CPU باشد. یعنی کمتر از 0.4fclk_I/O باشد.
  20. با توجه به 16 بیتی بودن تایمر/کانتر 1 و 3، رجیسترهای TCNTn و OCRnx و ICRnنیز 16 بیتی هستند.
  21. در راه اندازی تایمر 1 و 3 در مدهایی که ICRn و OCRnA مقدار TOP را تعیین می کنند، توجه شود که این رجیسترها پس از بیت های WGMn[3:0] مقداردهی شوند.


 

رضا اسدی

رضا اسدی

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

سفارش پروژه میکروکنترلر یوبرد

زیرساخت مطمئن صنعت

جدیدترین تاپیک های AVR

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

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

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

رله-relay

رله، سوییچ تحریک پذیر

تعریف رله، تاریخچه، طرز کار رلۀ الکترومکانیکی، اصطلاحات، انواع الکترومکانیکی، رلۀ حالت جامد، رلۀ هیبریدی، رلۀ حرارتی و انواع تحریک شونده با عوامل غیر الکتریکی، انواع موجود در صنعت برق و برق صنعتی، رلۀ ایمنی و برخی انواع حفاظتی، رلۀ دیجیتال، لزوم استفاده و راه اندازی رله، مشخصات الکتریکی

پروتکل-i2c-protocol

پروتکل I2C، ادغامی از USART و SPI توسط Philips

پروتکل I2C، تاریخچه I2C، ویژگی ها و کاربردهای I2C، عبارات و اصطلاحات I2C، باس، اتصالات و گسترش شبکه I2C، سیگنال های I2C، قالب داده و آدرس در I2C، انتقال داده در I2C، آدرس دهی 10 بیتی، قابلیت Multi-master، حکمیت، مشخصات الکتریکی و زمانی، مقدار مقاومت های پول آپ، Clock Stretching

سون-سگمنت-seven-segment

سون سگمنت، نمایشگر هفت قسمتی

سون سگمنت چیست؟ انواع 7-segment، تاریخچه 7-segment، ساختار 7-segment و نمایش در آن، تعداد ارقام و 7-segmentهای مالتی پلکس، کاربردها، انواع اندازه ها و رنگ ها و مدار راه اندازی 7-segment، بایاس 7-segment، مقدار مقاومت در راه اندازی 7-segment، درایور سون سگمنت، پایه های 7-segment

7 دیدگاه ها

  1. سلام مهندس اسدی‌. من زیاد با تایمرها کار نکردم.یعنی کلا تجربه زیادی توی میکروکنترلرها ندارم. شنیدم که دقت تایمرهای ۸ بیتی کمه و امروزه خیلی از مواقع به تایمرهای ۱۶ بیتی نیاز داریم. این حرف چقدر درسته؟

    پاسخ
    • سلام. این که یه تایمر دقتش بالا باشه یا پایین به تعداد بیت های اون بستگی نداره. به فرکانس کلاک تایمر بستگی داره. شما فرض کنید میخواید یه فاصلۀ زمانی رو بسازید. مثلاً میخواید هر n میلی ثانیه یک بار یه کاری انجام بشه. ساختن این n میلی ثانیه هم به فرکانس کلاک تایمر بستگی داره و هم به تعداد بیت های تایمر. چیزی توی دقت زمان n میلی ثانیه دخالت داره فرکانس کلاک تایمر هستش. فرض کنید فرکانس کلاک تایمر 1 مگاهرتز باشه. با این توصیف زمان هر پله از تایمر 1 میکروثانیه س. حالا ما اگه بخوایم زمان 100 میکروثانیه بسازیم، میشه ساخت. 100 پله از تایمر میشه 100 میکروثانیه. حالا میتونیم زمان 112.25 میکروثانیه بسازیم؟ نه نمیتونیم. چون هر پله از تایمر 1 میکروثانیه است. حالا اگه فرکانس تایمر رو بالا ببریم دقت اون هم زیاد میشه. فرض کنید فرکانس تایمر رو 4 مگا هرتز انتخاب کنیم. الان هر پله از تایمر دارای زمان 0.25 میکروثانیه س. الان اگه بخوایم زمان 112.25 میکروثانیه رو بسازیم باید اون رو تقسیم بر 0.25 کنیم تا تعداد پله های تایمر به دست بیاد. که میشه 449 تا پله. ولی یه تایمر 8 بیتی تا 255 بیشتر نمیتونه بشمره و بعد از اون سرریز میشه. برای حل این مشکل از تایمر 16 بیتی استفاده می کنن. نتیجه میگیریم که دقت تایمر به فرکانس کلاک تایمر بستگی داره و نه تعداد بیت های تایمر. حالا اگه ما یه زمانی رو بخوایم با تایمر بسازیم که نیاز باشه تعداد پله های بیشتر از 255 تا رو بشمره، از تایمرهای 16 بیتی (یا تعداد بیت های بیشتر) استفاده می کنیم. در واقع دلیل اصلی استفاده از تایمر با تعداد بیت های بیشتر، دست یابی به زمان های طولانی تره. برای این که متوجه بشید زمانی که با تایمر میسازیم به چه کاری میاد میتونید نوشتۀ «تولید موج سینوسی با آی سی DAC0800 و میکروکنترلر AVR با فرکانس متغیر» رو مطالعه کنید. که توی اون از تایمر برای ساختن زمان های ثابت استفاده شده.

      پاسخ
  2. سلام استاد
    اولا بخاطر روش تدریس عالی و نوع گزارش نویسی و جزوه نوشتن که بسیار مفید و قابل استفاده هست به جنابعالی و تیم فنی یوبورد تبریک میگویم و امیدوارم همیشه موفق باشید.
    ثانیا در این مقاله یک تمرین بسیار خوبی در صفحه 57 ( تمرین 1 ) وجود دارد که بنام عبور دهنده سیگنال با فرکانس زیر 1KHz است ، سوال من اینست که اگر ممکنه راهنمایی بفرمایید چطور میتوانم برنامه ای برای عبور سیگنال با فرکانس بین دو فرکانس f1 و f2 بنویسم.
    باز هم از راهنمایی های شما سپاسگزارم.

    پاسخ
  3. سلام مهندس
    میکرو کنترلر atmega 64 دو تا تایمر 16 بیتی داره درست.
    داخل کدویژن از TCNT1 میشه استفاده کرد ولی برای استفاده از TCNT3 یعنی کل 16 بیت (TCNT3L & TCNT3H) باید چه دستور اسمبلی زد تا بتونم از 16 بیت استفاده کنیم ؟؟؟
    مشکل خیلی از کاربراس
    ممنون میشم راهنمایی کنید

    پاسخ
    • سلام. دوست عزیز دستور اسمبلی که این کار رو انجام بده اطلاعی ندارم. البته سعی کردم توی فایل mega64a.h تغییراتی بدم. خواستم عبارات sfrw TCNT3=0x88 رو وارد کنم که بعد از کامپایل ارور داد. بعد از اون این کار رو کردم. دیفاین زیر رو به اول فایل main اضافه کردم:

      #define TCNT3  (*(unsigned int *) 0x88)

      این دیفاین مطابق الگوی دیفاین رجیسترها توی فایل mega64a.h هستش. بعد توی برنامه به جای TCNT3L و TCNT3H نوشتم TCNT3. و توی پروتئوس چک کردم. مقادیر مختلف به TCNT3 از 8 بیتی تا 16 بیتی دادم. توی شبیه سازی درست کار کرد. در واقع از مد نرمال استفاده کردم و OC3A رو روی حالت Toggle گذاشتم. با تغییر مقادیر TCNT3، مقدار فرکانس موج خروجی درست و برابر با مقادیر تئوری بودن. دیگه تست نکردم ببینم با این روش مقدار رجیسترای دیگه تحت تأثیر قرار میگیره یا نه. این مورد رو خودتون زحمتش رو بکشید.

      پاسخ
  4. سلام و عرض ادب خدمت مهندس اسدی، ممنون از متن آموزشی و عالی شما. بنده قصد دارم که شکل موج PWM سه فاز تولید کنم. به نظر شما برای این کار از بردهای آردواینو استفاده کنم یا مستقیما از میکروکنترلر AVR و مثلا همین مدل ATmega128A یا هر مدل دیگری که تایمر آن امکانات کافی داشته باشد؟ در صورتی که مورد دوم را تایید می فرمایید، لطفا بفرمایید برای کار کردن مستقیم با میکروکنترلر چه تجهیزات سخت افزاری باید فراهم نمایم؟ از توجّه شما سپاسگزارم. غلامحسین نقی زاده

    پاسخ
    • سلام. خیلی ممنون. لطف دارید. برای ساخت شکل موج PWM سه فاز هم میتونید از آردوینو استفاده کنید و هم از میکروکنترلر. اما کاش مشخصات این موج PWM هم میگفتید تا ببینیم اصلا میشه این کار با AVR انجام بشه یا نه. مثلا اگه فرکانس های بالا بخواید نمیشه یه شکل موج PWM درآورد که دیوتی سایکل اون رو با دقت مناسب تغییر داد. حالا این که از آردوینو استفاده کنید یا نه، به نظرم بیشتر به خودتون بستگی داره. آردوینو راحت تره و سریع تر شما رو به نتیجه میرسونه. میتونه برای نمونه اولیه خوب باشه. اگه بخواید از میکروکنترلرها استفاده کنید میتونید از ATmega64A یا ATmega128A یا هر AVR دیگه ای که تایمری با سه خروجی PWM داره، استفاده کنید. برای این کار باید علاوه بر میکروکنترلر این قطعات و وسایل هم داشته باشید:

      پروگرمر AVR که پروگرمرهای MK2 و USBasp و STK500 و … موجود هست.

      رگولاتور ولتاژ. در صورتی که تغذیۀ کل مثلاً 12 ولته باید با رگولاتور، تغذیۀ میکروکنترلر رو فراهم کنید. مثل رگولاتور LM7805 یا رگولاتور سوییچینگ LM2576 یا رگولاتورهای دیگه. که هر کدوم یه مدار خارجی دارن که توی دیتاشیت اونا گفته شده که چه قطعاتی لازم دارن

      درصورتی که بخواید با شکل موج PWM یه المانی رو راه اندازی کنید، مثلاً یه موتور، باید درایور موتور بسازید یا اگه موجود هست، بخرید.

      و قطعات جانبی خود میکروکنترلر مثل سلف و خازن و مقاومت و کریستال و …

      حالا اگه میگفتید دقیقاً میخواید چی کار کنید بهتر میتونستم راهنماییتون کنم. موفق باشید

      پاسخ

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

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

دیگر آموزش های یوبرد

آموزش زبان C و MISRA-C یوبرد

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

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

تجسم دنیای الکترونیک

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

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

شروع بازی ST

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

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

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

یادگار فیلیپس

آموزش های شاخص

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

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