آموزش مد نرمال واحد تایمر/ کانتر

سلام روزتون بخیر، امیدوارم که خوب باشید! امروز با دومین جلسه از سلسله جلسات Timer/Counter در خدمتتون هستم . و قراره که با هم بیشتر جزئیات مد نرمال واحد تایمر/ کانتر آشنا بشیم. اما قبل از شروع، برای درک بهتر شما عزیزان یک توضیح کوتاه درباره واحد تایمر/کانتر میدم تا بدونید این واحد به چه کاری میاد.

اما این توضیح کوتاه فقط یه مقدمه برای این جلسه است و اگر می خواهید به طور مفصل با  این با این واحد آشنا شید. حتما آموزش Timer Counter میکروکنترلرهای AVR – مقدمه رو مطالعه کنید.

درباره تایمر/کانتر :

در میکرو کنترلر ها، این یک نیاز عادی است که یک رویداد را بشماریم یا اینکه یک تاخیر زمانی تولید کنیم، تا در اون زمان خاص یه کاری انجام شود. در این مواقع است که واحد تایمر/ کانتر به کمک ما میاد.

مادر اصل 4 مد تایمر داریم:

  • Normal
  • CTC
  • Fast PWM
  • Phase PWM

که این مد های در همه تایمر ها (تایمر0 ، تایمر 1 ، تایمر 2) مشترک اند و هر کدام بنا به کاری که میخواهیم انجام بدیم ، میتونن استفاده شوند یا نشوند.

در ادامه هر کدوم از این مد ها را در یک آموزش بطور مفصل توضیح دادم .

 

تایمر در هر مد بصورت جداگانه و توسط 2بیت WGM00 , WGM01 که در رجیستر TCCR قرار دارند، تنظیم میشود و بسته به اینکه به هر کدام از این بیت ها 1 یا 0 بدهیم مد تایمر تغییر میکند.

در مد نرمال مقدار دهی این 2 بیت به شرح زیر است.

 

 

ویژگی های مد نرمال واحد تایمر/ کانتر:

  • دراین مد مقدار TOP با MAX برابر است و این مقدار برای تایمر 8 بیتی(Timer0,Timer 2) 0xFF و برای تایمر 16 بیتی (Timer1) 0xFFFF می باشد.

[icon name=”star-half-o” class=”” unprefixed_class=””] 3 اصطلاح Top , Bottom , MAXدر آموزش قبل توضیح داده ایم.

  • دراین مد رجیستر TCNT n همواره به صورت افزایشی کار میکند،یعنی از مقدار Bottom شروع به شمارش میکند تا به مقدار Max  برسد.وقتی به مقدار Max خود رسید، با اعمال کلاک بعدی سرریز(Overflow) رخ میدهد وپرچم TOV n،1می شود و پس از پاک کردن پرچم،شمارش مجدا تکرار میگردد.دراین حالت اگر اینتراپت این تایمر فعال باشد، CPUبه اینتراپت میرود.
  • در صورتی که اینتراپت فعال باشد، با ورود به تابع اینتراپت پرچم خود به خود ریست میشود و آماده دریافت سرریز بعدی میشود.
  • اما اگر اینتراپت فعال نباشد، پرچم خودکار ریست نمی شود و برای ریست کردن آن باید عدد 1 را بر روی آن پرچم و عدد 0 را بر روی بقیه بیت ها می نویسیم.

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TIFR=0b00000001

TIFR=0b00000001

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””] Overflow: در شکل زیر پرش از MAX(255 یا 65535) به 0 است.

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””]کاربرد مد نرمال : از این مد بیشتر برای اندازه گیری زمان استفاده میشود.

حالا که مد نرمال را انتخاب کردیم، میریم سراغ تنظیم سایر بیت ها …

 

[icon name=”circle-o” class=”” unprefixed_class=””]بیت7(FOC n):

این بیت در مد های PWM  غیرفعال است، امادر مد نرمال فعال است.

وقتی در این بیت 1 منطقی نوشته شود،بلافاصله یک سیگنال تساوی مقایسه به واحد تولید موج فرستاده می شود که بسته به چگونگی تنظیم بیت های COMn0,COM0n1 پایه خروجی OC n را تغییر میدهد.

 

[icon name=”circle-o” class=”” unprefixed_class=””]بیت های 5و4 (COMn0,COM0n1)

این دوبیت رفتار پایه ی خروجی OC n را کنترل میکنند.

میدانیم که در صورتیکه یکی از این دوبیت یاهردو آنها 1 شوند، پایه OC n، وظیفه خود را بعنوان I/O را از دست میدهد و توسط تایمر کنترل می شود.البته باید توجه کنید که برای این منظور باید رجیستر DDRمربوط به این پایه حتمابه صورت خروجی تنظیم شده باشد.

 

 

روش ساده تر برای بخاطرسپردن جدول فوق :

  • اگر 00 شوند هیچگونه عملی روی پایه OC0 رخ نمی‌دهد.
  • اگر 01 شوند، با هربار برابری OCR0 و TCNT0 منطق پایه OC0 برعکس می‌شود.
  • اگر 10 شوند، با برابری دو رجیستر نام برده منطق پایه OC0 مطلقا 0 می‌شود.
  • اگر 11 شوند، منطق پایه با برابری دو رجیستر 1 می‌شود.

 

[icon name=”star-half-o” class=”” unprefixed_class=””] جدول بالا برای تایمر 1 نیز همین است فقط هرجا که OC n  داریم، بجا آن OC1A یا OC1B   می گذاریم.

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت های 0 تا 2(Clock Select ):

همانطور که در آموزش قبل گفتیم این بیت ها برای مشخص کردن منبع کلاک تایمر/کانتر اند.

 

 

 

در تایمر 1:

منبع کلاک تایمر/کانتر 16 بیتی، 1 میتواند داخلی و خارجی باشد.

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

و در صورتی که منبع کلاک،کلاک خارجی باشد که توسط پایه T1 تامین میشود ، به آن تایمر گفته می شود . این تنظیمات به 3بیتی که در جدول آورده ایم ،مربوط میشوند.

 

[icon name=”star-half-o” class=”” unprefixed_class=””] دو رجیستر TCNT , OCR را در آموزش قبلی بطور مفصل توضیح داده ایم .برای فهمیدن مفاهیم بالا حتما به آموزش قبل مراجعه کنید.

 

: (Timer/counter  Interrupt Mask Register)TIMSKرجیستر[icon name=”circle” class=”” unprefixed_class=””]

 

 

[icon name=”circle-o” class=”” unprefixed_class=””]بیت OCIE n:

درصورتیکه 1 منطقی در این بیت نوشته شود وعلاوه برآن بیت I در رجیستر وضعیت نیز 1 شده باشد، وقفه تساوی مقایسه خروجی تایمر/کانتر n فعال میشود.

[icon name=”circle-o” class=”” unprefixed_class=””] بیت TOIE n:

درصورتی که 1 منطقی در این بیت نوشته شود وعلاوه بر آن بیت I در رجیستر وضعیت نیز 1 شده باشد، وقفه سرریز تایمر/کانتر n فعال میشود.

 

یادآوری:

رجیستر وضعیت:

 

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””]طبق معمول 8 تا بیت داره ،با نام های I-T-H-S-V-N-Z-C .

  • این رجیستر وضعیت جاری پردازنده را نشان می دهد و بر اثر برخی از عملیاتهای  CPU  فعال میشود.
  • هنگام  Reset  شدن تمامی بیت های آن “0” میشوند.
  • این رجیستر همواره دارای اطلاعاتی از آخرین دستور محاسباتی اجرا شده است.
  • در این رجیستر هرکدوم از بیتها که ازشون به عنوان پرچم نیز یاد می شود، با حرف اختصاری وظیفه خود،نامگذاری می شوند.

 

حالا به توضیح پرچمی که در این آموزش از آن استفاده کردیم می پردازیم…

 

: ( Interupt Flag)Iپرچم[icon name=”circle-o” class=”” unprefixed_class=””]

این Flag مجوز صدور وقفه را صادر میکند.

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

با “یک” شدن این پرچم،مجوز صادر میشود و پس از اجرای وقفه مجددا “صفر” میشود.

 

: (Timer/counter  Interrupt Flag Register) TIFRرجیستر[icon name=”circle” class=”” unprefixed_class=””]

[icon name=”circle-o” class=”” unprefixed_class=””] بیت   OCF n:

با وقوع یک تطابق مقایسه ای (Compare match) در تایمر / کانتر n این پرچم 1 می شود و در صورتی که قبلا وقفه تطابق مقایسه فعال شده باشد، روتین وقفه اجرا میشه و سپس این پرچم پاک میشه.

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت   TOV n 0:

با وقوع سرریز  تایمر / کانتر n این پرچم1 می شود و در صورتی که قبلا وقفه سر ریز تایمر فعال شده باشد،روتین وقفه اجرا میشه و سپس این پرچم به صورت خودکار پاک میشه.

 

[icon name=”star-half-o” class=”” unprefixed_class=””] نکته کلی تایمر یک:

این تایمر تفاوت های اندکی با تایمر 0و2 دارد که آنها نیز به دلیل 16 بیتی بودن این تایمر اند، در ادامه به بررسی این تفاوت ها می پردازیم.

 

رجیسترها:

رجیسترهای TCNT1 ،OCR1A/Bو ICR1 اینها رجیستر های 16 بیتی اند.

رجیسترهای  OCR1A/B رجیسترهای 8 بیتی هستند که برای کنترل نحوه عملکرد تایمر /کانتر 1 استفاده می شوند.

برای توضیح برخی تفاوت ها به تعبیری دیگر به تصویر زیر دقت کنید.

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] Clock Source:

در قسمت Clock Source ،میتوانید منبع کلاک تایمر را به صورت داخلی یا خارجی (لبه ی پایین رونده یا بالا رونده پایه ی T1) انتخاب کنید.

درصورتیکه منبع کلاک را بصورت داخلی انتخاب کرده باشید…

میتوانید در قسمت Clock Value ، خود کلاک سیستم و یا تقسیمی از آن را به عنوان کلاک تایمر انتخاب کنید.

[icon name=”circle-o” class=”” unprefixed_class=””] Mode:

در این قسمت می توانید یکی از 16 مد عملیاتی تایمر/کانتر را انتخاب کنید که ما در این آموزش مد نرمال مد نظرمان است.

در مد نرمال واحد تایمر/ کانتر در قسمت های  Out. A  ، Out. B می توانید به ترتیب وضعیت پایه های خروجی OC1B  و OC1A به 4 صورت تغییر دهید…

 

حالا می خواهیم با یه مثال کاربرد عملی تایمر/ کانتر مد نرمال رو ببینیم…

 

[icon name=”laptop-code” style=”solid” class=”” unprefixed_class=””] میخواهیم برنامه‌ای بنویسیم که بدون درگیر شدن CPU یکی از پایه‌های میکروکنترلر به صورت چشمک‌زن عمل کند. این کار به دو روش میسر است:

1.استفاده از وقفه و معکوس کردن پین مورد نظر در سرویس روتین وقفه.

2.استفاده از بیت‌های COM و خروجی گرفتن روی پایه OC0 (این حالت حتی به وقفه هم احتیاج ندارد).

 

روش 1:

فرض بر اینکه فرکانس کاری میکروکنترلر 1 مگاهرتز است.

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

Include <mega16.h>

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

Include <mega16.h>

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

#include <delay .h>

با این کار تابع تاخیر را به برنامه فرا می خوانیم که وظیفه اش ایجاد وقفه زمانی است .مثلا در اینجا باعث چشمک زدن led میشه.

#include <delay .h>

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

DDRA=0xff;

با این دستور پورت  A را خروجی میکنیم .

DDRA=0xff;

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

PORTA.0 = 0x00

با این دستور مقدار  بیت 0 پورت A را 0 میکنیم ( اون پایه را خاموش میکنیم).

PORTA.0 = 0x00

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TIMSK = 0x01

با این دستور رجیستر TIMSK را برابر 0x01 می‌کنیم. با این کار بیت TOIE0 یک شده و وقفه سرریز فعال می‌شود.

TIMSK = 0x01

 

 

#دستور:

TCNT0 = 0x00

با این دستور مقدار TCNT0 را هم 0x00 کردیم که البته لزومی به اینکار نیست چون در حالت پیشفرض 0 است.

TCNT0 = 0x00

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TCCR0 = 0b00000101

سپس با مقدار 0b00000101 سه بیت CS در حالت 101 قرار گرفته که با این کار کلاک اعمالی به TCNT0 تقسیم به 1024 می‌شود.

از آن جایی که فرکانس میکرو 1 مگ است، فرکانس اعمالی 976Hz خواهد شد (1000000/1024= 976)

TCCR0 = 0b00000101

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

asm (” sei “) #

با این دستور بیت وقفه عمومی فعال میشود.

asm (" sei ") #

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

(1) while

با این دستور، برنامه وارد حلقه بدون دستور While میشود .

 (1) while

 

حال به سراغ وقفه  interrupt …

در خارج از main با نوشتن interrupt سرویس روتین وقفه را تعریف کردیم .

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

Interrupt [10]void ovf0(void)

در این دستور شماره Vector مربوط به سرریز تایمر 0 برابر 10 است. در نهایت هر بار که تایمر سرریز شود، دستورات داخل آن اجرا خواهد شد.

Interrupt [10]void ovf0(void)

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

PORTA.0 =  ! PORTA.0

با این دستور هر بار که وقفه interrupt فعال شود، این پایه Not حالت قبل خود می شود.

PORTA.0 =  ! PORTA.0

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””] چون یک دور کامل شمارش TCNT0 به 256 کلاک احتیاج دارد، پس با هر 256 کلاک یکبار وقفه اتفاق می‌افتد. به دلیل این که فرکانس اعمالی 976 هرتز است، در نتیجه در هر ثانیه تقریبا 4 بار (3.81 = 976/256) وقفه اتفاق می‌افتد. فرمول آن را مشاهده می‌نمایید:

 

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””] در فرمول فوق N همان ضرایب تقسیم (1 ، 8 ، 64 و …) و Clk I/O همان فرکانس کاری میکروکنترلر است.

 

روش 2:

در این روش بدون استفاده از وقفه این کار توسط رجیستر OCR0 انجام می‌شود. اگر مقدار OCR0 را 128 بگذاریم، با رسیدن TCNT0 به 128 دو رجیستر برابر شده و می‌توان مطابق جدول “آبی رنگ “که در بالا مشاهده کردیم،  عملی را که می خواهیم روی پایه OC0 انجام داد

.

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

Include <mega16.h>

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

Include <mega16.h>

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

#include <delay .h>

با این کار تابع تاخیر را به برنامه فرا می خوانیم که وظیفه اش ایجاد وقفه زمانی است .مثلا در اینجا باعث چشمک زدن led میشه.

#include <delay .h>

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

DDRB=0xff;

با این دستور پورت  A را  خروجی میکنیم .

DDRB=0xff;

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

PORTB.0 = 1

پایه OC0 نقش دیگر پایه 4 میکروکنترلر است.

PORTB.0 = 1

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TCNT0 = 0x00

با این دستور  مقدار TCNT0 را 0 قرار میدهیم تا شمارش ما از 0 شروع شود.

TCNT0 = 0x00

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

OCR0 = 128

با این دستور مقدار OCR0 را هم 128 دادیم به این معنی است که وقتی مقدار رجیستر TCNT0 به 128 برسد تطبیق مقایسه ای رخ داده است.

OCR0 = 128

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TCCR0 = 0b00010101

این دستور مهم‌ترین خط، مقداردهی TCCR0 است. با مقداردهی 0b00010101، بیت‌های CS در وضعیت 101 قرار میگیرند وکلاک را بر 1024 تقسیم می‌کنند.

همینطور مطابق جدول “آبی رنگ “که در بالا آمده است.دو بیت COM00 و COM01 به ترتیب 1 و 0 می‌شوند.

در این حالت با هربار برابری OCR0 و TCNT0 حالت Toggle یا برعکس شدن پایه OC0 رخ خواهد داد.

 

TCCR0 = 0b00010101

 

دورنما :

در جلسه بعد به بررسی تایمر در مد CTC می پردازیم، پس یادتون نره که مطالب مارو دنبال کنید.

 

خب اینم از آموزش امروز امیدوارم که لذت برده باشید، یادتون نره قسمت های بعدی این آموزش رو از دست ندید

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

 

 

اگر می‌خواهید از آخرین و محبوب‌ترین مقالات ما در ایمیل خود مطلع شوید، همین الان ایمیل و شماره موبایل خود را در کادر زیر وارد کنید:
تعداد علاقه مندانی که تاکنون عضو خبرنامه ما شده اند: 0 نفر
دیدگاه

دیدگاهتان را بنویسید

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