-
فرکانس متر با avr
دوستان سلام :hi:
میخوام با AVR یه فرکانس متر بسازم اونم به زبان C، اومدم با تایمر 2 یک ثانیه رو درست کردم بعد قراره توی روتین وقفه تایمر 2 با تایمر 1 تعداد پالس ها رو از پایه T1 بخونم و نمایش بدم. اما...
اما اینکه نمیدونم تایمر 1 رو چطوری بخونم و نمایش بدم و اینکه اگه بشه اون یک ثانیه رو با تایمر صفر درست کنم و کریستال 32.768 حذف بشه خیلی بهتر میشه.
لطفا راهنمایی کنین.
مرسی :hi:
-
به این هم فکر کن اگر تایمر/کانتر یک سرریز شد باید برای آن هم زیر برنامه ای بگذاری تا به یک متغیر مثلا x یک واحد اضافه کند و در نهایت بعد از اتمام یک ثانیه فرکانس شما خواهد شد
f=x*65536
+ مقدار موجود در رجیستر 16 بیتی کانتر/تایمر 1
(رجیستر تایمر یک یک رجیستر 16 بیتی است متشکل از دو رجیستر 8 بیتی A و B است)
من به شما توصیه می کنم به جای این کار تقریبا زیاد کاری، بیا یک تایمر برای یک ثانیه ست کن مثلا همین تایمر دو که برای یک ثانیه تنظیم کرده اید یا هر تایمر دیگری در این مورد دستت باز است
و یک اینترانت خارجی مثلا int0 یا int1 را برای شمارش ست کن! حالا در زیربرنامه اینتراپت خارجی یک متغیر گردن کلفت بگذار!
در نهایت یک ثانیه که تمام شد فرکانس می شود همان متغیر
-
سلام
روش های زیادی برای ساختن فرکانس متر وجود داره. در این روشی که شما داری استفاده می کنی پیشنهاد 12qwaszx خیلی خیلی بهتر جواب میده!
برای ساختن فرکانس 1 ثانیه ی دقیق بهترین گزینه همون تایمر 2 بهمراه کریستال ساعت هست که شما استفاده کردی. برای ساختن زمان یک ثانیه ، اونم با تایمر صفر محدودیت وجود داره و زمان بدست اومده معمولا به هیچ عنوان دقت تایمر 2 بهمراه کریستال ساعت رو نداره!
-
دوستان ممنون :hi:
بجه ها من این کارا رو انجام دادم اما دقیقا نمیدونم توی روتین وقفه خارجی و همینطور وقفه تایمر دو چیکار کنم، یه کارایی کردم اما یا متغیرم همینطور زیاد میشه یا فقط صفر و یک میشه.
بازم راهنمایی، کچلم کرده :unh:
مرسی بچه ها :hi:
-
در اول کار باید مقدار متغیرها را 0 بگذاری
فرض کن در اینتراپت خارجی گذاشتی یک واحد به متغیر x اضافه کن
باید عملیات اصلی را در زیر برنامه تایمر 2 بنویسی:
f=x
x=0
سپس روی ال سی دی باید f را نشان بدهی
یعنی در هر یک ثانیه متغیر x را در f میریزی و سریعا متغیر x ریست می شود تا برای خواندن مقدار فرکانس در یک ثانیه بعد سریعا آماده شود و سپس روی lcd نشان داده میشود
-
در ضمن با تایمر 0 و یا هر تایمر دیگری می توانی زمان تقریبا یک ثانیه را بسازی اما اینکه تایمر دو با کریستال 32768 استفاده می کنند چون تایمر دو را می توان در مد async راه اندازی کرد یعنی از کریستال 32768 می تواند استفاده کند و با prescale=128 براحتی زمان دقیق یک ثانیه میسازی. اما برای تایمر 0 که مانند تایمر دو 8 بیتی است نمی توان از کریستال 32768 استفاده کرد و باید مثلا از کریستال 1Mhz اسفاده کرد:
=1MHz/1Hz
1Mhz
1Mhz/1024=
977
میبینی حتی با کلاک یک مگاهرتز نمی توانی عدد 977 را در 256 جای دهی! بنابراین در زیر برنامه مربوطه باید یک کانتر دستی بسازی که هر وقت 3.8 بار (تقریبا 4 بار) شد یعنی زمان مثلا یک ثانیه!
ولی با تایمر یک:
عدد 977 در رنج 65535 است بنابراین با یک پرش می توانی زمان تقریبا یک ثانیه را ایجاد کرد:
در زیر برنامه تایمر یک میگذاری:
تایمر یک را استاپ کن
65535-977 را در تایمر یک بگذار (حواست باشد رجیستر تایمر 1 دو رجیستر 8 بیتی است لذا باید عدد مربوطه را تبدیل کنی و در هر رجیسترهای A و B مربوطه بگذاری)
تایمر را استارت کن
البته یادت باشد برای اینکه تایمر یک در اینجا بتواند چنین کاری کند باید یکبار چنین کانفیگی درونش بگذاری
مثلا یک دکمه استارت روی فرکانس مترت گذاشته ای که در تابع main کلید را اسکن می کند.
اگر کلید زدی باید بگویی:
تایمر یک را استاپ کن
65535-977 را در تایمر یک بگذار
تایمر را استارت کن
سپس با شروع کار تایمر یک خودکار خودش هر یک ثانیه به زیربرنامه مربوطه می پرد.