با عرض سلام و خسته نباشید خدمت شما.من میخوام که برای اولین بار کار با تایمر کانترها رو در AVR شروع کنم ولی اصلا نمیدونم که چی هست تنها چیزی که میدونم این هست که میکروهای AVR بخشی به نام تایمر کانترها دارند حالا اینکه این تایمر کانترها چی هستن و چیکار میکنند و چه جوری باید ازشون استفاده کرد هیچی نمیدونم.خواهش میکنم که کمکم کنید و یک آموزش کاملی در این رابطه به من بدهید.من از کامپایلر codevision استفاده میکنم.
اطلاعیه
Collapse
No announcement yet.
نحوه کار با کانتر و تایمر
Collapse
X
-
پاسخ : نحوه کار با کانتر و تایمر
البته اگه می گشتین اطلاعات زیادی توی همین انجمن پیدا می کردید . به هر حال !!!!
یکی از مهمترین امکانات میکروکنترلر ها همین تایمر / کانتر ها هستند . معمولا میکروهای AVR بین 1 تا 3 عدد تایمر دارند که ممکنه 8 بیتی یا 16 بیتی باشند . حالا این 8 بیت یعنی اینکه بعد از هر 256 = 8^2 پالس ساعت میکرو شما سرریز میشه و باز شروع میکنه از 0 . البته شاید مناسب نباشه اما فرض کن یه ظرف که با 256 قطره پر میشه و با قطره بعدی سرریز میشه . 16 بیت هم یعنی تایمر با 65536 = 16 ^ 2 پالس ساعت سرریز میشه .
شما باید تایمر رو با استفاده از رجیسترهای کنترلی برنامه ریزی کنی یعنی در واقع چند تا رجیستر 8 بیتی که مربوط به کنترل تایمر هست رو مقدار دهی کنی . بعد از برنامه ریزی ، با خوندن مقدار رجیستر TCNT (که برای تایمر های 8 بیتی ، یک رجیستر 8 بیتی هست و برای تایمر های 16 بیتی 2 تا رجیستر 8 بیتی ) می تونی هر کار میخوای بکنی .
یه مثال :
شما میخوای توی هر 100 میکروثانیه ای یه عملی انجام بدی و فرکانس میکرو 8 مگ هست .
شما رجیستر کنترل رو طوری مقداردهی می کنی که فرکانس میکرو رو برای تایمر تقسیم بر 8 کنه . با این کار فرکانس پالس ساعت تایمر میشه 1 مگ . این یعنی هر 1 میکرو ثانیه 1 عدد به مقدار رجیستر TCNT شما افزوده میشه . شما با چک کردن مقدار TCNT یه شرط میزاری که هر وقت به 100 رسید ( یعنی بعد از 100 تا 1 میکروثانیه ) ، به یک زیر برنامه پرش کنه و اون عملی رو که مدنظرت هست رو انجام بده .
این بود یه خلاصه . بازم سئوالی بود در خدمتم .
[glow=blue,2,300]آنقدر به تاریکی لعنت نفرستید ، یک شمع روشن کنید. [/glow]
-
پاسخ : نحوه کار با کانتر و تایمر
نوشته اصلی توسط ایمان 88البته اگه می گشتین اطلاعات زیادی توی همین انجمن پیدا می کردید . به هر حال !!!!
یکی از مهمترین امکانات میکروکنترلر ها همین تایمر / کانتر ها هستند . معمولا میکروهای AVR بین 1 تا 3 عدد تایمر دارند که ممکنه 8 بیتی یا 16 بیتی باشند . حالا این 8 بیت یعنی اینکه بعد از هر 256 = 8^2 پالس ساعت میکرو شما سرریز میشه و باز شروع میکنه از 0 . البته شاید مناسب نباشه اما فرض کن یه ظرف که با 256 قطره پر میشه و با قطره بعدی سرریز میشه . 16 بیت هم یعنی تایمر با 65536 = 16 ^ 2 پالس ساعت سرریز میشه .
شما باید تایمر رو با استفاده از رجیسترهای کنترلی برنامه ریزی کنی یعنی در واقع چند تا رجیستر 8 بیتی که مربوط به کنترل تایمر هست رو مقدار دهی کنی . بعد از برنامه ریزی ، با خوندن مقدار رجیستر TCNT (که برای تایمر های 8 بیتی ، یک رجیستر 8 بیتی هست و برای تایمر های 16 بیتی 2 تا رجیستر 8 بیتی ) می تونی هر کار میخوای بکنی .
یه مثال :
شما میخوای توی هر 100 میکروثانیه ای یه عملی انجام بدی و فرکانس میکرو 8 مگ هست .
شما رجیستر کنترل رو طوری مقداردهی می کنی که فرکانس میکرو رو برای تایمر تقسیم بر 8 کنه . با این کار فرکانس پالس ساعت تایمر میشه 1 مگ . این یعنی هر 1 میکرو ثانیه 1 عدد به مقدار رجیستر TCNT شما افزوده میشه . شما با چک کردن مقدار TCNT یه شرط میزاری که هر وقت به 100 رسید ( یعنی بعد از 100 تا 1 میکروثانیه ) ، به یک زیر برنامه پرش کنه و اون عملی رو که مدنظرت هست رو انجام بده .
این بود یه خلاصه . بازم سئوالی بود در خدمتم .
یک led رو با یک کلید فشاری A خاموش و روشن میکنم. (که خودش دو سه خط دستور داره و توی حلقه تکرار هست)
می خوام به موازات این کار، اگه کلید B فشرده شد یه led دیگه پنج ثانیه روشن باشه و پنج ثانیه خاموش.(در واقع میخوام این led چشمک زن، مستقل از اون کلید on-off کار کنه.)
پس دو تا led داریم که یکی با کلید خاموش و روشن میشه و اون یکی با یک کلید دیگه شروع به چشمک زدن میکنه)
اگر از delay استفاده کنم، در طول مدت delay پنج ثانیه ای، کلید A کار نمیکنه. شما همین رو برام جواب بدی، میتونم ازش جاهای دیگه استفاده کنم. استادمون برای پروژه خواسته که نور یه واحد مسکونی رو کنترل کنم (در حد روشن یا خاموش شدن چراغ ها). برای مکان های مختلف فرستنده گیرنده مادون قرمز و کلید فشاری و سنسور PIR و... گذاشتم ولی برای تعیین زمان روشن یا خاموش بودن نمیشه از delay استفاده کرد. چه کنم؟
دیدگاه
-
مشکل با تایمر
سلام. درباره ی تایمر ها به یه مشکل کوچیک برخوردم. ممنون میشم کمک کنید. قراره یه led مدت زمان مشخصی روشن باشه و بعد خاموش بشه. من برنامه اشو با تایمر نوشتم. مشکلی که دارم اینه که مثلا وقتی تنظیم میکنم که بعد از 2350 میلی ثانیه خاموش بشه ، بعد از 2358 میلی ثانیه خاموش میشه.
یعنی دقیقا تو زمانی که تنظیم میکنم خاموش نمیشه. یا کمی زودتر یا کمی دیرتر خاموش میشه.
کارکرد کلی مدار: یک پوش باتن داریم که وقتی فشار میدیم شمارش شروع میشه و led روشن میشه و وقتی به زمانی که تنظیم کردیم رسیدیم led خاموش میشه. هر لحظه ای که دستمون رو از روی پوش باتن برداریم led خاموش میشه.
مدت زمانش رو از طریق یک پتانسیومتر که به adc میکرو میتونیم تغییر بدیم.
http://s5.picofile.com/d/0cf33fe0-1573-49b8-b3e1-8b96dd6273cb/timer_11.rarنه تو میمانی و نه اندوه و نه هیچیک ازمردم این آبادی...
به حباب نگران لب یک رود قسم و به کوتاهی آن لحظه ی شادی که گذشت غصه هم میگذرد ...
آنچنانی که فقط خاطره ای میماند..
لحظه ها عریانند ... به تن لحظه ی خود جامه ی اندوه مپوشان هرگز...
دیدگاه
-
پاسخ : نحوه کار با کانتر و تایمر
سلام
من یه سوال کوچولو واسم پیش اومده، من دارم تعداد پالسهای وارد شده به سر کانتر یک atmega128 رو اندازه میگیرم، برای این کار اومدم از لحاظ سخت افزاری اون پالس رو به پایه T1 از اتمگا 128 دارم، کانتر یک رو با کد زیر فعال کردم
کد:// Timer/Counter 1 initialization // Clock source: T1 pin Rising Edge // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x07; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00;
و اینتراپت اون رو هم فعال کردم و توی اینتراپت از کد زیر استفاده کردم:
کد:interrupt [TIM1_OVF] void timer1_ovf_isr(void) { i++; TCNT1=0; if(i==65535) { Counter++; i=0; } }
dd = Counter* 65535 * 65535 + i* 65535 + TCNT1
دیدگاه
-
پاسخ : نحوه کار با کانتر و تایمر
نوشته اصلی توسط Soheilasسلام
من یه سوال کوچولو واسم پیش اومده، من دارم تعداد پالسهای وارد شده به سر کانتر یک atmega128 رو اندازه میگیرم، برای این کار اومدم از لحاظ سخت افزاری اون پالس رو به پایه T1 از اتمگا 128 دارم، کانتر یک رو با کد زیر فعال کردم
کد:// Timer/Counter 1 initialization // Clock source: T1 pin Rising Edge // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x07; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00;
و اینتراپت اون رو هم فعال کردم و توی اینتراپت از کد زیر استفاده کردم:
کد:interrupt [TIM1_OVF] void timer1_ovf_isr(void) { i++; TCNT1=0; if(i==65535) { Counter++; i=0; } }
dd = Counter* 65535 * 65535 + i* 65535 + TCNT1---------
.
.
...........
- تشکرها 1
دیدگاه
دیدگاه