بعد از آشنایی با سخت افزار، دیگه نوبت میرسه به نرم افزار :
http://s4.picofile.com/file/7984697632/SHN_LCF_meter_44.zip.html
نکته ها :
من از یک برد با میکروی مگا 32 و LCD گرافیکی نوکیای 1100 و LCD کاراکتری 2 در 16 برای تست استفاده کردم.
پلتفرم برنامه نویسی با WinAVR و سازگار با کدویژن هستش و در AVRstudio هم قابل استفاده است.
پس از اکسترکت فایل پیوست، پنج پوشه ( پروژههای مجزا به جهت اینکه سردرگم نشید! ) خواهید داشت، یکی پوشه Proteus که فایل های تست در اون قرار داره و دو پوشه برای LCD گرافیکی و دو پوشه برای LCD کاراکتری ( هر کدوم دو پوشه با استفاده از Sprintf و بدون Sprintf )
توجه داشته باشید که استفاده از Sprintf و نمایش Float حجم کدها رو 4 الی 6 کیلو بزرگتر خواهد کرد. ضمن اینکه قبلش باید در کامپایلر مورد نظر تنظیمات Sprintf رو برای Float تنظیم کرده باشید.
جهت هرچه کمتر کردن حجم کد نهایی، بهتره که مواردی که نیاز ندارید رو با استفاده از فلگ های مربوطه غیر فعال کنید و همچنین میتونید که افکت های نوشتاری رو حذف کرده و مد نمایشگرتون رو روی مد عادی قرار بدید. در کمترین حالت، حجم کد نهایی حدود 6 کیلو و در بیشترین حالت حدود 15 کیلو خواهد بود ....
همراه این پروژه کتابخونه های زیر ارائه شده اند :
BTN برای مدیریت کلیدها با آرایش سخت افزاری معمولی تا 8 کلید.
N11 کتابخونه LCD گرافیکی نوکیای 1100
sFont کتابخونه فونت ساده برای LCD های گرافیکی
TLCD کتابخونه LCD های کاراکتری از یک خط تا 4 خط با کنترلر های HD44780 و KS0073
LCF کتابخونه جدید جهت امور فرکانس متر، خازن سنج و سلف سنج ( که میخوایم بهش بپردازیم! )
این کتابخونه ها آخرین نسخ تا امروز هستند!
----------------------
و اما ادامه بحث ما پیرامون کتابخونه LCF و توضیحات کاملی در مورد اون خواهد بود ( سایر کتابخونه ها موضوع بحث ما نیستند و در جاهای مختلف در مورد اونها و نحوه استفاده از اونها گفتگو شده )
همونطور که قبلا هم اشاره شد، این ماژول جدید ما از کتابخونه LCF استفاده میکنه و استفاده از سایر کتابخونه ها اجباری نیست و شما میتونید برای سایر موارد از هر کتابخونه ای که خواستید استفاده کنید. در ادامه توضیحات مختصری در این باره لازمه که ارائه خواهد شد.
کتابخونه LCF از سه بخش مجزا تشکیل شده، یکی فرکانس متر که پایه اصلی این کتابخونه محسوب میشه و بخش های سلف سنج و خازن سنج ....
کلیه تنظیمات مورد نظر کاربر برای این کتابخونه طبق معمول در هدر فایل کانفیگ مربوطه یا LCFconfig.h قرار داره! و تنظیمات اساسی کتابخونه که معمولا نیازی به تغییر ندارند هم در هدر فایل LCF.h هستند .....
با هدر فایل LCFconfig شروع میکنم.
در ابتدا سه تا فلگ داریم که مدهای فرکانس متر، خازن سنج و سلف سنج رو فعال و یا غیرفعال میکنند. توجه داشته باشید که در هر حالتی، بخش اعظمی از قسمت های فرکانس متر فعال باقی خواهد موند ( چون اصل ماجرا اندازه گیری فرکانسه! )
شما میتونید برای تست و بررسی عملکرد برنامه، یک پین میکرو رو بعنوان Activity Test تعریف کنید که با هر بار اندازه گیری فرکانس توسط میکرو تغییر وضعیت خواهد داشت. پس در صورت یک کردن فلگ ActivityTest لازمه که پین مربوطه نیز در همین هدر فایل تعریف بشه.
همچنین در صورت فعال بودن فلگ فرکانس متر و یکی از حالات سلف سنج و یا خازن سنج، لازمه که یک پین جهت رله انتخاب این وضعیت با وضعیت [های] دیگر هم تعریف بشه! و در صورت داشتن هر دو حالت سلف سنج و خازن سنج، تعریف یک پین برای رله مربوطه به جهت انتخاب بین این دو حالت هم الزامی است!
چونکه در مدهای خازن سنج و سلف سنج بحث کالیبراسیون هم مطرحه، در صورت فعال بودن فلگ یکی از این حالات، باید نوع نمایشگر مورد استفاده ( گرافیکی یا متنی ) و تعاریف مربوطه هم مشخص بشه، ضمن اینکه انجام تعاریف مد کالیبراسیون و نحوه نمایش و اینها هم الزامی میشه.
سه متغیر عمومی ( که در هر جایی در دسترس هستند ) برای برگردوندن مقادیر فرکانس، سلف و خازن در نظر گرفته شده اند که با توجه به تعاریف فلگ ها در دسترس هستند.
سایر موارد رو هم در جای خودش مفصلا توضیح خواهم داد .....
و اما در ادامه بررسی های کتابخونه LFC میخوایم وارد جزئیات سه بخش اصلی بشیم، پس موضوع رو با فرکانس متر دنبال میکنیم :
فرکانس متر :
روش کلی برای اندازه گیری فرکانس اینه که نوسانات مورد نظر رو برای مدت یک ثانیه ( یا کسری از یک ثانیه ) به کلاک یک شمارنده اعمال کنیم. در عمل، برای این منظور ورودی Hold کانتر رو در مدت زمان مورد نظر غیر فعال میکنند تا کانتر در اون مدت مشخص تعداد پالس ها رو شمارش بکنه. به این عمل اصطلاحا Gate کردن شمارنده گفته میشه. یعنی برای مدت مشخصی دروازه شمارش شمارنده باز و در این مدت زمان پالس ها شمارش شده و نمایش داده میشن!
در کتابخونه ما هم از همین روش برای اندازه گیری فرکانس استفاده میشه، به همین منظور، در هدر فایل LCFconfig تایمر یک میکرو رو بعنوان شمارنده اصلی، در مد نرمال و clock source خارجی تنظیم میکنیم. در این حالت پایه T1 میکرو میشه پین کلاک شمارنده اصلی ( تنها محدودیت سخت افزاری! ) که نوسانات مورد نظر رو به اون اعمال خواهیم کرد.
و سپس تایمر 2 میکرو رو بعنوان Gate شمارنده اصلی، طوری در مد CTC پیکره بندی میکنیم که وقفه compare match اون هر یک میلی ثانیه اتفاق بیافته.
پس از LCFmeter_Init ( یا پیکره بندی اولیه LCF )، ضمن پیکره بندی سخت افزار مورد نیاز این کتابخونه، این دو تایمر در حالت توقف به شکل اشاره شده پیکره بندی میشن .....
اندازه گیری فرکانس با دستور LCFmeter_Start که مقدار زمان Gate هم به میلی ثانیه به اون داده میشه آغاز خواهد شد. در این حال، متغیرها مقدار دهی اولیه شده و تایمر یک، با زمان گیری تایمر 2 به مدت مورد نظر Gate ( یا همون وقوع وقفه compare match ) شروع به شمارش تعداد پالس ها میکنه و پس از سپری شدن زمان Gate مقدار فرکانس پالس ورودی محاسبه و در متغیر عمومی فرکانس متر یا همون frqVal قرار میگیره.
فلگی به نام LCFstatus در همه احوال وضعیت این ماژول نرم افزاری رو به ما برمیگردونه!
وقتی که LCF آماده برای دستور LCFmeter_Start باشه، این فلگ LCFidel و در زمان انتظار برای وقوع وقفه Gate این فلگ LCFbusy و پس از محاسبه مقدار فرکانس و معتبر بودن مقدار متغیر frqVal این فلگ LCFready خواهد بود.
توجه داشته باشید که پس از خواندن مقدار متغیر frqVal توسط شما، باید فلگ LCFstatus توسط شما در وضعیت LCFidel قرار گیرد.
( جهت اطلاعات بیشتر به فایل main.c مراجعه کنید! )
توضیحات مفید! :
بر روی ماژول ما یک LED قرمز وجود داره که بعنوان جنرال ایندیکیتور مورد استفاده قرار میگیره و یک کلید هم بعنوان ورودی کاربر پیش بینی شده.
همونطور که در نقشه شماتیک در زیر کلید مزبور نوشته شده، با هر بار فشار دادن این کلید، تغییر وضعیت بین مد های سلف سنج و خازن سنج رخ خواهد داد و در صورتی که این کلید برای زمانی حدود 3 ثانیه فشرده نگه داشته بشه، به مد فرکانس متر خواهیم رفت و به همین ترتیب از این مد خارج خواهیم شد.
در هدر فایل HW_LCF.h تایمر صفر طوری در مد CTC تنظیم شده که وقفه compare match اون هر 10 میلی ثانیه اتفاق خواهد افتاد. با هر بار وقوع وقفه این تایمر یک متغیر عمومی به اسم SysCount یک واحد افزایش خواهد یافت. همچنین در صورتی که کلید موجود بر روی برد فشرده شده باشد، کانتر اندازه گیری مدت زمان فشرده شدن کلید نیز یک واحد افزایش می یابد. در اصل، این تایمر بعنوان شمارنده تیک سیستم مورد استفاده قرار گرفته!
در هدر فایل HW_LCF فلگی به اسم LCFdebug وجود داره که در صورتی که این فلگ یک باشه، در مد های سلف سنج و خازن سنج، مقدار فرکانس اسیلاتور مربوطه نیز در ذیل مقدار سلف و یا خازن نمایش داده خواهد شد. این حالت بیشتر جهت بررسی صحت عملکرد مدار پیش بینی شده و کاربرد خاصی نداره!