کار با تایمر کانتر صفر AVR در حالت ساده به زبان سی کدویژن CodeVision
29 مهر, 1389
کتاب زبان اصلی راهنمای شیرها Skousen Valve Handbook
20 آذر, 1389
کار با تایمر کانتر صفر AVR در حالت ساده به زبان سی کدویژن CodeVision
29 مهر, 1389
کتاب زبان اصلی راهنمای شیرها Skousen Valve Handbook
20 آذر, 1389

بازدیدها: 2

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

 مقدمات و نکات تایمر کانتر صفر از جمله مدها، رجیسترها و … را در مطلب قبلی گفتیم و امروز در مورد مد CTC (مقایسه) تایمر صفر صحبت خواهیم کرد.

در حالت مقایسه رجیستر TCNT0 به طور دائم با رجیستر OCR0 مقایسه، و در صورت تطابق (مساوی شدن) رجیستر TCNT0 برابر صفر می شود. از این نتیجه مقایسه می توان برای تولید شکل موج روی پایه خروجی OC0 استفاده نمود که خود چهار حالت دارد:

  1. در صورت تطابق هیچ عملی روی OC0 صورت نگیرد. Disconnected
  2. در صورت تطابق وضعیت پین OC0 معکوس شود. Toggle
  3. در صورت تطابق پین OC0 فقط صفر شود. Clear
  4. در صورت تطابق پین OC0 فقط یک شود. Set

در هنگام تطبیق مقایسه در صورت فعال بودن وقفه و تولید پرچم OCF0 می توان یک وقفه مقایسه را ایجاد نمود و از روال وقفه برای بروزرسانی مقدار رجیستر OCR0 استفاده نمود. به هر حال تغییر رجیسیتر OCR0 به یک مقدار جدید در زمانی که تایمر در حال شمارش است باید با احتیاط انجام شود، زیرا که حالت CTC دارای بافر مضاعف نمی باشد.

 مثال: برنامه ای بنویسید که هر 30 میلی ثانیه پایه OCR0 را مکمل (معکوس سازی) کند؟

هدف ما ساختن یک شکل موج می باشد که طول هر نیم سیکل آن 30ms است. یعنی 30ms پین در وضعیت یک و 30ms دیگر در وضعیت صفر. البته چون 30ms عدد نسبتا بالایی است و با توجه به اینکه فرکانس نوسان ساز ما 8MHz می باشد پس ما N=1024 قرار می دهیم تا فرکانس کاری تایمر برابر 7.813KHz شود تا بتوانیم این تاخیر بالا را ایجاد کنم. همانطور که می دانید با انتخاب N بالا فرکانس کاری تایمر پایین خواهد آمد و درنتیجه زمان پر شدن رجیستر ها بالا می رود.

#include <mega16.h> 
#define xtal 8000000 

void main(void){ 
PORTB=0x00; 
DDRB=0x08; //H1
TCNT0=0x00; //H2
OCR0=0xEA; //H3
TCCR0=0x1D;//H4
while (1); //H5
} 

توضیحات برنامه:

  1.  H1: پین OC0 که روی پورت B می باشد به عنوان خروجی تعریف شده.
  2. H2: مقدار اولیه این رجیستر را برابر صفر قرار می دهیم.
  3. H3: عددی که باید محتوای TCNT0 با آن مقایسه شود تا در صورت تساوی تطابق صورت گیرد.
  4. H4: کلاک تایمر با تقسیم بر 1024 برابر با 7.813KHz خواهد شد. و همچنین مد CTC با عملکرد مکمل سازی OC0 انتخاب می شود.
  5. H5: یک حلقه بی نهایت 

نحوی محاسبه زمان 30 میلی ثانیه ای:

Time= (1024*(1+234))/8000000


234 برابر با EA هگز می باشد که باید در رجیستر ORC0 قرار بگیرد.

نحوی محاسبه با Codewizard :

Clock Source: System Clock
Clock Salue: 7.813kHZ
Mode: CTC top=OCR0
Output: Toggle on compare match 
0 Overflow Intrrupt
0 Compare Match Interrupt
Timer Value: 0h
Compare: EAh

 نکته: شما می توانید که مقدار رجیستر TCNT0 را نیز با عدد دلخواه حساب شده پر کنید مثلا اگر عدد 8 را وارد کردید در هنگام شروع کار، تایمر دیگر از صفر شروع به بالا رفتن نمی کند بلکه از 8 شروع می کند بنابراین با تغییر این عدد می توانید زمان های دقیق را داشته باشید.

سوالات و پیشنهادات خودتان را در نظرات همین صفحه اعلام کنید.

 این مقاله به صورت کاملا اختصاصی و به صورت متن باز تنها در وب سایت www.picpars.ir منتشر می شود. کپی برداری از آن تنها با ذکر منبع به صورت کامل امکان پذیر می باشد.

  نویسنده: سید محسن قاسمیان