درودی دوباره به دوستداران AVR. با دهمین قسمت از آموزش مقدماتی AVR که دومین قسمت از بخش تایمر کانتر ها میباشد، همراه شما هستیم. در قسمت نهم بحث رجیسترها، مدها و نحوه عملکرد تایمر کانتر 0 به طور کامل گفته شد و اینکه سعی کردیم تمام رجیسترهای آن را بیت به بیت شرح دهیم. به عنوان یک توضیح مختصر در مورد تایمر کانتر 0 باید بگوییم که یک تایمر 8 بیتی است و دارای 4 مد Fast PWM، CTC، Normal و Correct PWM میباشد. با قرار دادن تایمر کانتر 0 در هر کدام از این مدها میتوان شکل موجهایی با فرکانس متفاوت یا پهنای پالس متفاوت ایجاد کرد و یا این که از آن برای زمانگیری دقیق استفاده کرد. همانند قسمت قبل که کمی طولانی بود، این مطلب هم طولانی است. پس با صبر و حوصلۀ کافی با آموزش تایمر کانتر 1 همراه ما باشید.
تذکر: توصیه میکنیم که ابتدا حتما قسمت نهم آموزش را مطالعه نموده و سپس این مطلب را بخوانید.
بررسی اجمالی تایمر کانتر 1
تایمر کانتر 1 بر خلاف تایمر کانتر 0 و 2 که 8 بیتی هستند، یک تایمر 16 بیتی است و نسبت به دو تایمر دیگر امکانات بیشتری در اختیار برنامهنویس قرار میدهد. خلاصۀ این امکانات را میتوان به صورت زیر بیان کرد.
- یک تایمر کاملا 16 بیتی (در ادامه بیشتر آشنا میشیم).
- دو پایۀ خروجی جهت تولید شکل موجهای گوناگون.
- یک واحد نمونهبرداری که در تایمر کانتر 0 و 2 وجود ندارد.
- دارای 4 نوع وقفه متفاوت که هر کدام کاربرد خاص خود را دارند.
- دارای 15 مد کاری متفاوت با امکانات زیاد.
همانطور که در قسمت قبل گفتیم، هر تایمر کانتر دارای رجیسترهای اختصاصی و همچنین رجیسترهای مشترک است. رجیسترهای مشترک که عبارت اند از: TIMSK و TIFR. اما تایمر کانتر 1 دارای پنج رجیستر منحصر به فرد است که عبارت اند از: OCR1B ،OCR1A ،TCCR1 ،TCNT1 و ICR1. از لحاظ سختافزاری پایههای مربوط به تایمر کانتر 1 در شکل زیر نشان داده شده است.
اصطلاحات پرکاربرد
قبل از این که به مباحث تخصصی بپردازیم، شاید بهتر باشد تعدادی از اصطلاحاتی که در متن به کار برده میشوند را بیان کنیم تا در ادامه راحتتر در مورد آن صحبت شود.
- overflow یا سرریز: 0 شدن مقدار TCNT1 با اعمال یک پالس دیگر را سرریز گویند.
- تطبیق: برابر شدن مقدار TCNT1 با OCR1A یا OCR1B را تطبیق گویند.
- کپچر: عمل کپی شدن مقدار TCNT1 درون ICR1 توسط پین ICP (که در تصویر قبل مشخص شده) را کپچر شدن خواهند گفت.
نیازی به حفظ کردن مفاهیم بالا نیست؛ تنها هرجا در متن به این کلمات اشاره شد، میتوانید بار دیگر مفهوم آن را بررسی نمائید.
مدهای تایمر کانتر 1
قبل از پرداختن به رجیسترها بهتر است با مدهای عملکردی تایمر کانتر 1 آشنا بشیم و سپس به توضیح رجیسترها بپردازیم. تایمر کانتر 1 دارای 15 مد مختلف است که از لحاظ عملکرد شبیه تایمر 0 بوده و تنها چند تفاوت کوچک دارد. این 15 مد عبارت اند از:
- مد Normal
- مدهای CTC (دو نوع مد CTC)
- مدهای Fast PWM (پنج نوع مختلف Fast PWM)
- مدهای Correct PWM (پنج نوع مختلف Correct PWM)
- مدهای Correct And Frequency PWM که جهت تولید پالس PWM با فرکانس متغیر کاربرد دارند (دو نوع مختلف).
در مجموع تایمر کانتر 1 دارای 15 مد میباشد ( 15 = 1 + 2 + 5 + 5 + 2).
نکته: چون در توضیح مد ها باید اطلاعاتی راجع به رجیسترها هم داشته باشیم، هرجا که اسمی از هر رجیستر برده شد، در حد این که تنها نام آن را به خاطر بسپارید کافی است. در انتهای این مطلب، به طور مفصل راجع به هر کدام توضیح میدهیم.
مد Normal
تایمر کانتر 1 همانطور که در اول مطلب اشاره کردیم 16 بیتی است. یعنی چی؟ یعنی رجیستر شمارشی آن (منظور TCNT1) از 16 بیت تشکیل شده و در اصل یک شمارنده است که با اعمال هر کلاک به آن، مقدارش به اندازه 1 واحد افزایش پیدا میکند. در حالت عادی تمام تایمرها اعم از تایمر 1 غیرفعال هستند. در صورتی که تایمر را فعال کنیم (منظور از فعال شدن یعنی اعمال پالس به TCNT1) چون مقدار اولیه آن 0 است، شمارش به ازای هر پالس آغاز شده و در صورت تداوم پالسها به مقدار ماکزیمم خود یعنی 65535 میرسد. چون تایمر 16 بیتی است، مقدار ماکزیمم آن بصورت 1 – 16^2 محاسبه میشود. پس از اعمال 65535 پالس که باعث رسیدن TCNT1 به عدد 65535 میشود، با اعمال 1 پالس دیگر مقدار TCNT1 صفر شده و شمارش از اول آغاز میشود. 0 شدن TCNT1 را اصطلاحا overflow میگویند.
شکل بالا عملکرد تایمر در مد Normal را به خوبی نشان میدهد. تنها نکتۀ این مد، همان پرش از 65535 به 0 است که به آن سرریز یا overflow گفته میشود.
کاربرد این مد: از این مد بیشتر برای زمانگیری استفاده میشود.
مد CTC
اگر بخواهیم تایمر ما تا حد مشخصی شمارش کند و سپس 0 شود، باید از مد CTC استفاده کنیم. مد CTC دو مورد است؛ شمارش تا رجیستر OCR1A و یا شمارش تا رجیستر ICR1. به عنوان مثال اگر تایمر در حالت اول قرار گیرد و مقدار OCR1A را 800 قرار دهیم، با روشن شدن تایمر و اعمال پالس به TCNT1 و رسیدن آن به 800، با اعمال یک پالس دیگر مقدار TCNT1 صفر شده و overflow اتفاق میافتد. شکل زیر به خوبی این مفهوم را نشان میدهد.
در شکل بالا شمارش از صفر شروع و تا مقدار Max که با علامت « — » مشخص شده است ادامه مییابد؛ سپس با اعمال یک پالس دیگر 0 میشود. مقدار Max یکی از مقادیر رجیستر OCR1A یا ICR1 است.
کاربرد این مد: اگر به شکل بالا نگاه کنید، در صورتی که مقدار رجیستر OCR1A به عنوان Max انتخاب شود، با هر بار رسیدن TCNT1 به مقدار OCR1A میتوان یک سیگنال 0 و 1 از پایه OC1A گرفت که در صورت تغییر مقدار OCR1A فرکانس آن سیگنال تغییر میکند. این فرکانس (FOCnA) طبق رابطه زیر محاسبه میشود.
در فرمول بالا Fclk_I/O فرکانس کاری میکروکنترلر، N ضریب مقسم فرکانس تایمر در رجیستر TCCR1B (در موردش به موقع توضیح میدیم) و OCRnA همان رجیستر OCR1A است. به این خاطر n را مینویسیم که در میکروهایی که چند تایمر شبیه هم وجود دارد، با نوشتن n آن فرمول یا … برای تمام تایمرها صادق است.
مد Fast PWM
عملکرد این مد مشخص است: تولید موج PWM بر روی هر کدام از پایههای OC1A یا OC1B. این دو پایه به ترتیب پایههای 19 و 18 میکروکنترلر هستند. در این مد شمارش TCNT1 از 0 شروع و تا مقدار Max ادامه پیدا میکند. اما به صورت سختافزاری دائما مقدار رجیستر TCNT1 با OCR1A و OCR1B مقایسه شده و در صورت برابری با هر کدام، میتواند باعث ایجاد سیگنالی روی دو پایه OC1A یا OC1B شود. به شکل زیر دقت کنید.
شمارش از 0 شروع شده و تا علامت – سبز رنگ که همان مقدار Max است ادامه مییابد و با یک پالس دیگر مقدار TCNT1 صفر شده و overflow رخ میدهد. اما علامت – قرمز رنگ محلی است که مقدار رجیستر TCNT1 با یکی از رجیسترهای OCR1A یا OCR1B یکسان میشود. مقدار Max میتواند یکی از رجیسترهای OCR1A یا ICR1 و یا یکی از اعداد ثابت 255، 511 و 1023 باشد.
کاربرد این مد: در صورت قرار دادن تایمر در این مد و تنظیم تایمر به گونهای که خروجی آن فعال باشد، میتوان سیگنال PWM ایجاد نمود. فرکانس ایجاد شده بر روی پایههای OC1A یا OC1B طبق رابطه زیر به دست میآید.
Fclk_I/O فرکانس میکروکنترلر، N ضریب مقسم فرکانس و مقدار TOP همان مقدار Max است.
مد Phase Correct PWM
در این مد شمارش از 0 آغاز و به مقدار Max میرسد. سپس جهت شمارش نزولی شده و از Max به سمت 0 حرکت میکند. با رسیدن دوباره به 0 سرریز یا overflow اتفاق میافتد. در این مد هم میتوان بر روی پایههای OC1A و OC1B سیگنال PWM ایجاد نمود.
اصلیترین تفاوت این مد با مد Fast PWM شمارش به صورت صعودی و سپس به صورت نزولی است. بنابراین عمل مقایسه یک بار در حالت صعودی و یک بار در حالت نزولی اتفاق میافتد. خطوط – قرمز رنگ مکانهایی هستند که مقدار TCNT1 با OCR1A یا OCR1B برابر شده است. علامتهای – سبز رنگ مقدار Max شمارش هستند و محلی است که جهت شمارش برعکس میشود. همانند مد قبل، مقدار Max یکی از مقادیر OCR1A یا ICR1 و یا یکی از اعداد ثابت 255، 511 یا 1023 میباشد.
کاربرد این مد: تولید سیگنال PWM که فرکانس آن طبق رابطه زیر به دست میآید:
Fclk_I/O فرکانس میکروکنترلر، N ضریب تقسیم فرکانس تایمر، و TOP هم همان مقدار Max است.
سؤال: فرق این فرمول با فرمول مد Fast PWM در وجود عدد 2 در مخرج است. چرا؟
جواب: چون در Fast PWM تنها شمارش صعودی داشتیم اما در Correct PWM شمارش ابتدا صعودی و سپس نزولی میشود. به همین دلیل مدت زمان ایجاد یک پالس 2 برابر شده و باعث نصف شدن فرکانس خواهد شد.
مد Phase And Frequency PWM
عملکرد این مد شبیه مد Correct PWM است. اما یک تفاوت خیلی جزئی دارد که در بحث رجیسترها به آن میپردازیم.
نمودار بالا تشابه عملکرد این مد و مد Correct PWM را نشان میدهد. توضیح علامتهای – سبز رنگ و – قرمز رنگ هم مشابه مد Correct PWM است.
کاربرد این مد: تولید موج PWM همراه با قابلیت تغییر فرکانس. در صورتی که بخواهیم سیگنالی داشته باشیم که همفرکانس و همعرض پالس آن کنترل شود، از این مد استفاده میکنیم. فرکانس سیگنال به صورت زیر محاسبه میشود:
فرمول فوق هیچ تفاوتی با فرمول مد Correct PWM ندارد.
رجیسترهای اختصاصی تایمر کانتر 1
به سراغ بحث اصلی میرویم. گفتیم که تایمر کانتر 1 دارای 5 رجیستر اختصاصی است. اول این را بگوییم که تمام این رجیسترهای 16 بیتی هستند. لذا هر کدام از دو رجیستر 8 بیتی تشکیل شدهاند که رجیستر با ارزش بیشتر با پسوند H و رجیستر با ارزش کمتر با پسوند L مشخص میشود.
نکته: شایان ذکر است که اگر بخواهیم اطلاعاتی را روی هر کدام از این رجیسترها بنویسم، اول باید بایت باارزش و سپس بایت کم ارزش مقداردهی شود. اما برای خواندن مقدار آنها، ابتدا باید بایت کم ارزش و سپس بایت باارزش خوانده شود.
رجیستر Timer Counter Register 1) TCNT1)
این رجیستر عمل شمارش را انجام میدهد و با هر پالس مقدار آن 1 واحد افزایش مییابد. در واقع رجیستر اصلی شمارش TCNT1 است.
کمترین مقدار این رجیستر 0 و بیشترین مقدار آن نهایتا میتواند 65535 (0xFFFF) باشد.
رجیستر Output Compare Register 1A) OCR1A)
رجیستر مقایسه A است که به صورت سختافزاری به طور دائم با TCNT1 مقایسه میشود و در صورت برابر شدن میتواند باعث ایجاد پالس روی پایه OC1A شود.
کمترین مقداری که میتوانیم به این رجیستر بدهیم 0 و بیشترین آن 65535 است.
رجیستر Output Compare Register 1B) OCR1B)
رجیستر مقایسه B است. از لحاظ عملکردی کاملا شبیه OCR1A بوده و هیچ تفاوتی ندارد. درصورت برابری آن با TCNT1، میتواند باعث ایجاد پالس روی پایه OC1B شود.
0 میتواند کمترین مقدار و 65535 میتواند بیشترین مقدار این رجیستر باشد.
رجیستر Input Capture Register 1) ICR1)
یکی از تفاوتهای تایمر کانتر 1 با تایمر کانتر 0 وجود واحد کپچر است. وظیفهی این واحد کپی کردن مقدار TCNT1 درون ICR1 میباشد. این عمل زمانی اتفاق میافتد که یک پالس روی پایه ICP ( پایه شماره 20 میکرو) ایجاد شود. البته راهاندازی آن دارای تنظیماتی است که در رجیستر TCCR1 در مورد آن توضیح میدهیم.
در صورت وقوع کپچر (ایجاد یک پالس روی پایه ICP) مقدار TCNT1 در این رجیستر قرار میگیرد؛ اما در برنامه هم میتوان مقداری را روی این رجیستر نوشت یا مقدار آن را خواند.
رجیسترهای TCCR1A و Timer Counter Control Register 1A , 1B) TCCR1B)
این دو رجیستر اصلیترین رجیسترهای تایمر کانتر 1 هستند. انتخاب تمام مدها، فعال سازی پایههای OC1A و OC1B، تنظیم ضریب مقسم فرکانس که با N آن را نشان میدهیم و … توسط این دو رجیستر انجام میشود. به طور کلی عمل کردن نهایی تایمر کانتر 1 بیشتر به این دو رجیستر وابسته است.
بیتهای Clock Source) CS)
این 3 بیت در رجیستر TCCR1B قرار دارند و فعالسازی تایمر کانتر 1 توسط این 3 بیت انجام میشود. در حالت پیشفرض این 3 بیت 0 هستند و هیچ کلاکی به TCNT1 اعمال نشده و تایمر غیرفعال است.
جدول فوق ضرایب N را بخوبی نشان میدهد.
- “000” وضعیت غیرفعال
- “001” مقسم فرکانس با ضریب 1 (N = 1)
- “010” مقسم فرکانس با ضریب 8 (N = 8)
- “011” مقسم فرکانس با ضریب 64 (N = 64)
- “100” مقسم فرکانس با ضریب 256 (N = 256)
- “101” مقسم فرکانس با ضریب 1024 (N = 1024)
- کلاک از پین T1 تامین میشود (لبه پایین رونده)
- کلاک از پین T1 تامین میشود (لبه بالارونده)
مثال: اگر فرکانس میکرو 8 مگاهرتز باشد، بیتهای CS را طوری تنظیم کنید که فرکانس اعمالی به TCNT1 برابر 125KHz شود؟
جواب: با یک تقسیم ساده (64 = 8000000/125000) باید ضریب N برابر 64 شود. پس بیتهای CS باید “011” مقداردهی شوند.
اطلاعات بیشتر
سختافزاری که تقسیم کلاک را انجام میدهد در شکل زیر نشان داده شده است.
در شکل فوق مالتیپلکسر سمت راست برای تایمر کانتر 0 و مالتیپلکسر سمت چپ برای تایمر کانتر 1 است. خطوط آدرس این مالتیپلکسرها دقیقا بیتهای CS بود و ورودیهای آنها همان کلاک با ضرایب گفته شده است (جدول CS بالا)
بیتهای Waveform Generation Mode) WGM)
این بیتها مد کاری تایمر کانتر که در مورد آنها مفصل صحبت کردیم را مشخص میکنند. در تایمر کانتر 1 تعداد بیتهای WGM چهار بیت است. 2 بیت کم ارزش آن در رجیستر TCCR1A و 2 بیت با ارزش آن در TCCR1B است. چگونگی مقداردهی این بیتها مطابق جدول زیر انجام میشود.
در جدول بالا ستون Mode شمارهی آن مد است و چهار بیت WGM12 , WGM11 , WGM10 و WGM13 در مجموع 16 حالت مختلف دارند که این حالات به صورت زیر است.
- “0000” مد Normal
- —————————————————————————————–
- “0100” مد CTC با مقدار Max = OCR1A
- “1100” مد CTC با مقدار Max = ICR1
- —————————————————————————————–
- “0101” مد Fast PWM با مقدار Max ثابت 255 (0x00FF)
- “0110” مد Fast PWM با مقدار Max ثابت 511 (0x01FF)
- “0111” مد Fast PWM با مقدار Max ثابت 1023 (0x03FF)
- “1110” مد Fast PWM با مقدار Max = ICR1
- “1111” مد Fast PWM با مقدار Max = OCR1A
- —————————————————————————————–
- “0001” مد Correct PWM با مقدار Max ثابت 255 (0x00FF)
- “0010” مد Correct PWM با مقدار Max ثابت 511 (0x01FF)
- “0011” مد Correct PWM با مقدار Max ثابت 1023 (0x03FF)
- “1010” مد Correct PWM با مقدار Max = ICR1
- “1011” مد Correct PWM با مقدار Max = OCR1A
- —————————————————————————————–
- “1000” مد Phase And Frequency PWM با مقدار Max = ICR1
- “1001” مد Phase And Frequency PWM با مقدار Max = OCR1A
- —————————————————————————————–
- “1101” حالت غیر مجاز
پس از این که مشخص شد میخواهیم چه سیگنالی تولید کنیم، مد کاری را انتخاب کرده و وضعیت WGM را هم مشخص میکنیم. در نهایت هم باید وضعیت بیتهای COM معلوم گردد.
بیتهای Compare Output Mode) COM)
وظیفه این بیتها مشخص کردن چگونگی عملکرد پایههای خروجی OC1A و OC1B است. تعداد 4 بیت COM وجود دارد که در رجیستر TCCR1A قرار گرفتهاند. 2 بیت COM1A0 و COM1A1 برای تعیین وضعیت پایه OC1A و 2 بیت COM1B0 و COM1B1 برای تعیین وضعیت پایه OC1B میباشند.
نکته: مقداردهی بیتهای COM به مد کاری بستگی دارد.
نکته: در تمام مدها اگر مقدار COM برابر 00 باشد، خروجی نداریم و پایههای OC1A یا OC1B غیرفعال است.
وضعیت بیتهای COM در مد غیر PWM (مد Normal و مد CTC)
- “00” غیر فعال.
- “01” هر بار برابری TCNT1 با رجیسترهای OCR1A یا OCR1B باعث معکوس شدن منطق پایه میشود.
- “10” در صورت برابری رجیسترهای مذکور وضعیت پایه 0 مطلق میشود.
- “11” در صورت برابری رجیسترهای مذکور وضعیت پایه 1 مطلق میشود.
وضعیت بیتهای COM در مد Fast PWM
- “00” غیر فعال
- “01” در این حالت اگر مد کاری “1111” باشد، با هربار تطبیق وضعیت پایه OC1A معکوس میشود.
- “10” در این حالت در زمان تطبیق پایه OC1A یا OC1B در وضعیت 0 منطقی و در زمان رسیدن TCNT1 به مقدار Max (همان TOP) برابر 1 منطقی میشود.
- “11” برعکس حالت قبل است. در زمان تطبیق 1 و با تساوی TCNT1 با Max برابر 0 خواهد شد.
وضعیت بیتهای COM در مد Correct PWM و مد Phase And Frequency PWM
- “00” غیر فعال
- “01” در این حالت اگر مد کاری “1001” یا “1110” باشد، با هر بار تطبیق، منطق پایه OC1A برعکس میشود. در بقیه حالات غیرفعال است.
- “10” با تطبیق در حالت صعودی پایه OC1A یا OC1B برابر 0 شده و با تطبیق در حالت نزولی برابر 1 میشود.
- “11” برعکس حالت قبل است. در تطبیق صعودی برابر 1 و در تطبیق نزولی برابر 0 خواهد شد.
بیت Input Capture Edge Select 1) ICES1)
این بیت مشخص میکند که در کدام لبه عمل کپچر اتفاق بیفتد.
- اگر 0 باشد، لبه پایین رونده باعث کپچر شدن میشود.
- اگر 1 باشد، لبه بالارونده باعث کپچر شدن خواهد شد.
بیت Input Capture Noise Canceler 1) ICNC1)
با 1 شدن این بیت، فیلتری بر روی پایه ICP1 قرار میگیرد که نویزهای فرکانس بالا را حذف میکند. با اینکار جهشهای ناگهانی بر روی این پایه حذف شده و مانع از وقوع کپچر میشود.
رجیسترهای مشترک تایمر کانتر 1
در قسمت نهم گفتیم که تمام تایمر کانترها دو رجیستر مشترک به نامهای TIMSK و TIFR دارند که مربوط به وقفهها میشوند.
رجیستر Timer Interrupt Mask) TIMSK)
وظیفه اصلی این رجیستر فعال کردن وقفههای تایمر کانتر است. برای تایمر کانتر 1 چهار نوع وقفه متفاوت تعریف شده که برای فعال کردن هرکدام بیتهای زیر تعبیه شدهاند.
عملکرد این بیتها به شرح زیر است:
- TOIE1: با 1 کردن این بیت در صورت وقوع سرریز وقفه رخ میدهد. شماره Vector این وقفه 9 است.
- OCEI1B: با 1 شدن این بیت در صورت برابری TCNT1 و OCR1B (تطبیق B) وقفه رخ میدهد. شماره Vector این وقفه 8 است.
- OCIE1A: با 1 شدن این بیت در صورت برابری TCNT1 و OCR1A (تطبیق A) وقفه رخ میدهد. شماره Vector این وقفه 7 است.
- TICIE1: اگر این بیت 1 شود، در صورت وقوع کپچر وقفه رخ میدهد. شماره Vector این وقفه هم 6 است.
رجیستر Timer Interrupt Flag Register) TIFR)
در این رجیستر بیتهای Flag وقفهها قرار دارند. در صورتی که هرگونه وقفهای رخ دهد، بیت متناظر آن در این رجیستر 1 شده و CPU از طریق این رجیستر متوجه وقوع وقفه میشود. پس از اینکه دستورات آن وقفه در سرویس روتین وقفه به طور کامل انجام شد، بیت متناظر به صورت اتوماتیک توسط CPU برابر 0 میشود.
نکته: ما با این رجیستر کاری نداریم (به غیر از موارد خیلی خاص) چون 1 و 0 شدن بیتهای آن، بصورت اتوماتیک انجام میشود و توضیح عملکرد آن صرفا جهت آشنایی بود.
مثالهای کاربردی
در آخرین بخش این قسمت چند مثال از عملکرد تایمر کانتر 1 در هر 5 نوع مد خواهیم گفت. (تحلیل برنامه بر عهده خودتان)
تذکر: در تمام مثالهای زیر فرکانس کاری میکرو 1MHz است.
مثال اول : زمانگیری در مد Normal
برنامهای بنویسید که مدت زمان 1 بودن یک پالس را بر حسب میلیثانیه به دست آورده و بر روی lcd کاراکتری بنویسد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <mega16.h> #include <delay.h> #include <alcd.h> #include <stdio.h> unsigned int time; unsigned char overflow; unsigned char buff[17]; void main(void){ lcd_init(16); lcd_clear(); DDRD.0 = 0; TCNT1 = 0; TCCR1A = 0b00000000; TIMSK = 0x04; #asm ("sei") while(1){ ////////////////////////////////////////block 1 while(PIND.0==0); TCCR1B = 0b00000001; while(PIND.0==1); TCCR1B = 0b00000000; ////////////////////////////////////////block 2 time = (overflow*65536 + TCNT1)/1000; overflow = 0; TCNT1 = 0; ////////////////////////////////////////block 3 sprintf(buff,"time: %dms",time); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(buff); } } interrupt[9]void ovf0(void){ overflow++; } |
مثال دوم : تولید فرکانس در مد CTC
برنامهای بنویسید که بر روی پایه OC1A به مدت 2 ثانیه یک فرکانس 1 کیلوهرتز و سپس به مدت 2 ثانیه یک فرکانس 5 کیلوهرتز تولید کند و این چرخه ادامه داشته باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <mega16.h> #include <delay.h> void main(void){ DDRD.5 = 1; TCNT1 = 0; ICR1H = 0x01; ICR1L = 0xF3; TCCR1A = 0b01000000; TCCR1B = 0b00011001; while(1){ delay_ms(2000); ICR1H = 0x00; ICR1L = 0x63; delay_ms(2000); ICR1H = 0x01; ICR1L = 0xF3; } } |
مثال سوم : تولید موج PWM در مد Fast PWM
برنامهای بنویسید که یک سیگنال PWM با فرکانس 100 هرتز و زمان وظیفه 75 درصد بر روی پایه OC1A و یک سیگنال دیگر با زمان وظیفه 25 درصد بر روی پایه OC1B تولید کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <mega16.h> #include <delay.h> void main(void){ DDRD.5 = 1; DDRD.4 = 1; TCNT1 = 0; OCR1A = 937; OCR1B = 312; //ICR1 = 1250// ICR1H = 0x04; ICR1L = 0xE1; TCCR1A = 0b10100010; TCCR1B = 0b00011010; while(1); } |
مثال چهارم : تولید PWM در مد Correct PWM
برنامهای بنویسید که یک سیگنال PWM با زمان وظیفه 90 درصد بر روی پایه OC1A و یک سیگنال PWM با زمان وظیفه 10 درصد بر روی پایه OC1B ایجاد کند. فرکانس هر دو سیگنال هم 500 هرتز باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <mega16.h> #include <delay.h> void main(void){ DDRD.5 = 1; DDRD.4 = 1; TCNT1 = 0; OCR1A = 900; OCR1B = 100; ICR1H = 0x03; ICR1L = 0xE7; TCCR1A = 0b10100010; TCCR1B = 0b00010001; while(1); } |
مثال پنجم : تولید PWM با فرکانس متغیر در مد Phase And Frequency
برنامهای بنویسید که یک سیگنال با فرکانس 1KHz و زمان وظیفه 20 درصد به مدت 2 ثانیه بر روی پایه OC1A ایجاد کند. سپس به مدت 2 ثاینه یک فرکانس 5KHz و زمان وظیفه 40 درصد تولید کند. این چرخه ادامه داشته باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <mega16.h> #include <delay.h> void main(void){ DDRD.5 = 1; TCNT1 = 0; OCR1A = 100; ICR1H = 0x01; ICR1L = 0xF3; TCCR1A = 0b10000000; TCCR1B = 0b00010001; while(1){ delay_ms(2000); OCR1A = 40; ICR1H = 0x00; ICR1L = 0x63; delay_ms(2000); OCR1A = 100; ICR1H = 0x01; ICR1L = 0xF3; } } |
نتیجهگیری و حرف آخر
تایمر کانتر 1 بر خلاف تایمرهای 0 و 2 از انعطاف پذیری بیشتری برخوردار است. دلیل این امر هم 16 بیتی بودن آن بوده که محدوده وسیعی از اعداد را پوشش میدهد. تایمر کانتر 1 دارای 2 خروجی است و بیشتر برای تولید موجهای PWM با دقت زیاد از آن استفاده میشود.
توصیه میگردد برای کارهایی نظیر تولید PWM از تایمر کانتر 1 و کارهایی مثل تولید فرکانس با پهنای پالس ثابت از تایمر 0 و 2 (که در جلسه آینده در مورد آن صحبت میکنیم) استفاده کنید.
این قسمت از آموزش هم به آخر رسید. توصیه بنده این است که تمامی 5 مثال را نوشته و مطابق آموزشها آنها را تحلیل کرده تا تصوری از عملکرد آن در ذهنتان بوجود آید. اگر هرگونه سئوال یا پیشنهادی دارید در آخر همین پست کامنت بگذارید👋
11 پاسخ
با سلام
توی مثال یک متغیر time نبایستی در عدد ۱۰۰۰ ضرب بشه
با سلام
توی مثال یک متغیر time نبایستی ضرب در ۱۰۰۰ بشه
عالی.واقعا مرسی.من این دوران قرنطینه رو با مطالب سایت شما سپری کردم .واقعا کامل ترین و بهترین اموزش avrهستش .مرسی از زحماتتون.
با عرض سلام و احترام
رجیستر icr رو کامل توضیح ندادید.
سلام. ممنون فیدبک میدید
سعی میکنم در آینده کامل کنم.
سلام
میشه مثال اولتتون ( زمانگیری در مد Normal)رو یک توضیح درباره کدهایش بدید که چه کار میکنند
سلام. ببینید میکرو منتظر میمونه که پایه D0 برابر 1 بشه. بعد تایمر رو روشن میکنه. بعد منتظر میمونه که پایه D0 برابر 0 بشه. بعد تایمر رو خاموش میکنه. چون تایمر 16 بیتیه؛ پس نهایت عدد ما میشه 65535 که اگه یک سیکل کامل انجام بشه میشه 65536. تعداد سرریزها باید در عدد 65536 ضرب بشه و در نهایت با مقدار حال حاضر تایمر جمع بشه که تعداد کلاک شمارش شده رو حاصل میده. در نتیجه باید تقسیم به 1000 بشه که عدد به دست آمده در واحد میلی ثانیه به دست بیاد.
سلام
آقای نصر سپاس از زحمات و مطالب خوبتون
بزرگوار میشه توضیح بدین علت مقدار دهی رجیستر ICR تو دو بخش ICR1H, ICR1L چیه. چرا یکدفعه مقدار دهی نکردین؟
سلام. دلیل خاصی نداره. میشه به صورت یکجا هم مقدار دهی کرد.
سلام
آقای مهندس نصر
چرا توی مثال اول هر عددی کوچکتر از 65536 رو در overflow ضرب میکنیم پاسخ اشتباه میشه
سلام. چون تایمر 16 بیتی هست و ماکزمیم عدد یک شمارنده 16 بیتی عدد 65535 هست. لذا برای سر ریز شدن به 1 کلاک دیگر یعنی در مجموع 65535 + 1 که میشه 65536 کلاک، احتیاج هستش.