سلام
اصل مطلب:
من نمیخوام ساعت بسازم.
میخواهیم با BASCOM و MEGA32 یه زمان دقیق بسازیم در حد میلی ثانیه (ترجیحا میکرو ثانیه).
من یه کریستال ساعت (32768 Hz ) به پایه های TOSC1 و TOSC2 بستم و از تایمر 2 در حالت اسنکرون استفاده کردم با Prescale = 128 که دقیقا در هر 1 ثانیه سرریز میشه. مسلما وقتی Prescale رو کمتر کنیم تایمر زودتر سرریز میشه و میتونیم به زمانهای کوچکتر برسیم. مثلا اگه Prescale رو 1 انتخاب کنیم تایمرباید در هر 7.8125 میلی ثانیه سرریز بشه ولی اینطور نمیشه ، چه در Proteus و چه روی برد برد.(من هر دو راه رو هزار دفعه به هزار شکل متفاوت تست کردم جواب نداد)
1- ایا در کریستال اتصالی به پایه های TOSC1 و TOSC2 محدودیت داریم یا نه؟ مثلا میشه یه کریستال 8 یا 12 مگا یا بالاتر بست؟
2- کسی میدونه چجوری میتونیم یه زمان دقیق بسازیم؟ اصلا میشه با AVR این کار رو کرد؟
3- یه راهم اینه که از ای سی 555 استفاده کنیم و کلاک های خروجی اونو توسط کانتر بشماریم . مثلا کلاک 1 مگا تولید کنیم ، که یعنی هر لبه 1 میکرو ثانیه است.( که البته این در صورتیه که نتونیم با خود تایمرهای میکرو این زمان دقیق رو ایجاد کنیم)
جون هر کی دوست دارین سریعتر راهنمایی کنید ، کارم گیره اسیدی.
مهندس با کریستال ساعت میشه حداقل زمان 1/128 ثانیه رو دقیق داشت !!! ( یعنی 0.0078125 ثانیه )
البته با Prescale یک
و این قضیه تست شده و تو مدار زیر هم من از همین روش واسه کرنومتر استفاده کردم :
http://www.iranled.com/forum/showthread....#pid134110
1-
آره
حتی کریستال 40 کیلو گذاشتم کار نکرد !!
2-
اره میشه !
مثلا تایمر رو ببر مد تایمر با پرسکالر یک ! ( کریستال میکرو رو یه مگ در نظر میگیریم )
اینطوری وقفه اش هر 0.000256 ثانیه رخ می ده ( فرکانس 3906.25 )
حالا کریستال ساعت رو بذار 8 مگ که زود تر رخ بده !!
3-
اونکه اصلا دقیق نیست !
اگه قراره کریستال بذاریم واسه دقت که خوب کریستال خارجی واسه خود میکرو می ذاریم !
میشه تایمر رو برد مد مقایسه ای !!
یا اینکه یه عددی داخل تایمر بریز که کمتر شمارش کنه !
مثلا واسه همون 32768 هر زمان وقفه اش رخ داد تو تایمر عدد 127 رو بریز تا فقط تایمر نصف مقدار عمول بشمره و اینجوریه که زمان هر وقفه نصف میشه !
سلام
من از تایمر دو در مد اسنکرون با Prescale = 1 استفاده کردم.کریستال ساعت رو هم بستم.به تایمر مقدار اولیه 223 رو دادم پس طبق فرمول تایمر تقریبا در هر 1 میلی ثانیه سرریز میکنه (32768/33) و به زیر برنامه K میره و به متغیر A 0.001 ثانیه اضافه میشه.
اینجوری ما یه زمان با دقت تقریبی 1 میلی ثانیه ساختیم.اما به درستی کار نمیکنه ، چه در proteuss و چه روی برد برد.خیلی تاخیر داره.
لینکشو میذارم یه نگاهی بهش بندازین ببینین مشکلش چیه.
یه سوال:
اگه یه کریستال خارجی به پایه های XTAL 1و2 ببندیم ، ایا دقت دستوراتی مثل WAIT یا DELAY درست میشه یا میشه برای ساخت این زمان دقیق تایمر ازش استفاده کرد؟مثلا 12 یا 16 مگا؟
با تشکر
در ضمن برنامه ای که گذاشته بودین رو دانلود کردم ولی باز نشد ، Unknown بود.مگه پسوندش چیه؟
مهندس الان دقیقا زمان هر پالس 0.0078125 ثانیه هستش و فقط پالس اول یه میلی ثانیه هستش !!!!
تو برنامه دقت کنی علتشو میفهمی چرا اینجوریه!!!!!!!
برنامه رو دوباره نگاه و تک تک دستورات رو تحلیل و ببین چی اتفاقی می افته !!
احتمالا باید بفهمی ایراد کارت کجاست !!!!
نشد بگو که بگم ایراد برنامه کجاست !!
مهندس moustafa یه تغییراتی دادم و فایل پیوست رو بگیر !!
سرعت نمایش رو lcd خیلی پایینه و نمیشه هر ثانیه هزار بار رو ال سی دی چیزی نوشته !!!!
باید مقدار تایمر هر بار دوباره عوض بشه !
در ضمن متغیر Single دقتی نداره !!
در ضمن هنگ کردن ال سی دی عادیه !
چون در ضمن ارسال دستور به ال سی دی چندین بار وقفه تایمر رخ می ده و خوب زمان بندی ارسال دیتا به ال سی دی رو میریزه بهم !!!
می خوای کرنومتر مگه درست کنی !
خوب سون سگمنت بذار !!!
دقت کنی من واسه همون تو کورنومتری که لینکشو قبلا داده بودم از سون سگمنت استفاده کرده بودم !!!
http://www.iranled.com/forum/showthread....#pid134110
یه اسیلوسکپ هم گذاشتم که ببینی زمان دقیقا یه میلی ثانیه هستش !
( البته زمان یه میلی ثانیه رو بدون کریستال ساعت هم راحت میشد درستش کرد )
سلام
متشکرم ، برنامه کار میکنه اما خطا داره.ببیینید چیزیه که میخوام اینه که این زمان کاملا دقیق با یه متغیر اعشاری دیگه مقایسه بشه( به جز Single و Double حق انتخاب دیگه ای نداریم، داریم؟) و به محض اینکه به اون رسید متوقف بشه. مثلا A=4.483 میلی ثانیه است ، خوب حالا تایمر باید شروع به شمارش کنه و وقتی دقیقا به 4 ثانیه و 483 میلی ثانیه رسید وایسه.نمایش پیوسته اون روی LCD مهم نیست ، فقط موقعی که متوقف شد عددی رو که بهش رسیده نمایش بده در حالت STOP تایمر. سون سگمنت به کارم نمی یاد. فقط دقت برای ما مهمه تا 3 رقم اعشار ( هر چی بیشتر بهتر=the more , the merrier ) حالا با کریستال ساعت یا با هر چیز دیگه(منتها توی Mega32) برنامه رو دوباره با تغییرات پیوست میکنم ، بگیریدش منظورمو متوجه میشین.
سوال1:
دستور Return دقیقا به کدوم خط برنامه بر میگرده که دستور Timer2=223 رو فقط یه بار میدید؟ و بعد مجبور شدیم که همین دستور رو در زیربرنامه K دوباره تکرار کنیم؟
سوال2:
اگه یه کریستال خارجی به پایه های XTAL 1و2 ببندیم ، ایا دقت دستوراتی مثل WAIT یا DELAY درست میشه یا میشه برای ساخت این زمان دقیق تایمر ازش استفاده کرد؟ ببینید منظورم اینه که محدود نشیم به 32768 هرتز. اگه فقط از $Crystal=xxxxxxx (کریستال داخلی) استفاده کنیم و تایمرمونو با اون تنظیم کنیم ، میشه به زمان حاصله اعتماد کرد؟(امتحان کردم نشد )
اگه از کریستال خارجی استفاده کنیم (XTAL 1 _ 2 ) چی؟
از دوستان (مخصوصا جناب t3r!p3000) خواهشمندم کمک کنن این قضیه رو یه جوری درستش کنیم بعد یه تاپیک دیگه میخوام بزارم که خیلی از این یکی مشکلتره.
انتخاب دیگه ای نداریم !
Double هم یه جوریه !!!
خوب با یه عدد معمولی مثلا 4883 مقایسه بشه و بعد تقسیم بر هزار بشه و اون نمایش داده بشه !!!
ببین میکرو کار خودشه انجا می ده و وقفه اتفاق بیافته کار خودشو ول می کنه و میره سراغ برچسب اون وقفه و اون کارها رو انجام می ده و بعد با دستور Return بر میگرده اونجایی که بود و ادامه کارهاش !!!
تایمر از 223 تا 255 می شمره و بعد دوباره صفر میشه و اونو نوشتم که دوباره عدد تایمر رو 223 بکنه !!!
دستورات تاخیری اگه وقفه استفاده نکنین تا حدی قابل قبوله ولی بازم واسه دقت بالا اصلا پیشنهاد نمیشه !!
مهندس شما زمان 4.883 ثانیه واست مهمه یا 1 میلی ثانیه !!
من هنوز نفهمیدم قراره چی کار بشه !!
یکم توضیح بدین جریان چیه !!
سلام
4.483 یه مثال بود.عددی که تایمر با اون مقایسه میشه ممکنه هر چی باشه ولی همیشه اعشاری در میاد.به عبارت دیگه وقتی زمان محاسبه شده توسط تایمر به اون عدد رسید(نه کمتر ، نه بیشتر)مثلا Portd.7 رو toggle کنه و تایمر متوقف شه و زمان شمرده شده توسط تایمر روی LCD نمایش بدیم. این عددی که گفتم فقط یه عدده (نه زمان)که از حاصل چند تا فرمول به دست میاد. حالا وقتی زمان تایمر دقیقا مساوی با این عدد شد portd.7 رو Toggle کنه.توی برنامه ای که در ارسال قبل گذاشتم این عدد رو دستی وارد میکنیم.شما برنامه رو یه نیگاهی بکن و عدد A>5.219 رو تغییر بده و خطاشو ببین.بعضیها میگن از مد مقایسه ای تایمر استفاده کنیم.
کلا اعداد اعشاری دنگ و فنگشون بالاست !!
پیشنهاد می کنم یه جوری فرمول رو محاسبه کنید که اعشاری نشه !!
بعد به جای اینکه بعلاوه 0.001 کنی بعلاوه 1 کن !!!!
سلام
به خاطر راهنمایی های قبلیتون خیلی ممنونم خیلی موثر بود.
فعلا دور متغیرهای اعشاری رو خط کشیدم و از WORD یا INT استفاده میکنم ، اینجوری بهتر کار میکنه چه در عمل و چه در Proteus.
اما چند تا مسئله هست:
1- در عمل (روی برد برد) خطای تکرار پذیری داریم ، یعنی با هر بار اجرای برنامه عدد حاصله با دفعه قبل فرق میکنه اما در Proteus این خطا را نداریم و هر چند بار که برنامه را اجرا کنیم به یک عدد میرسیم(که خیلی خوبه)، حالا نمیدونم این ذات خود میکرو هست یا میکرو من مشکل داره؟
2- من این ازمایش رو بیشتر از 50 بار در هر دو جا تست کردم و بعد از میانگین گیری به نتیجه زیر رسیدم:
کریستال ساعت در Proteus :****************میانگین خطا : 15 میلی ثانیه
کریستال ساعت در عمل: ********************میانگین خطا : 113 میلی ثانیه (که فکر کنم بیشتره)
کریستال داخلی در Proteus (Async = Off) :*********میانگین خطا : 7 میلی ثانیه
کریستال داخلی در عمل (Async = Off) : ************میانگین خطا : اصلا فکرشم نکنین ، زمانو گذاشتم برای 3 ثانیه ، بیشتر از 20 ثانیه طول میداد ( هر دفعه )
*** با این تفاسیر دوستان ایده ای دارن برای کمتر کردن این خطای 100 میلی ثانیه ای و از اون بدتر خطای تکرار پذیری ؟
بازم از همتون ( مخصوصا جناب t3r!p3000 ) که وقت میذارن و این تاپیک رو میخونن.
سلام
من از کریستال خارجی 4 مگ استفاده کردم ، حالا خیلی بهتر شده در عمل میانگین خطا به 18 میلی ثانیه رسیده و در ضمن تکرار پذیر هم شده.
راهی هست که بشه همین 18 میلی ثانیه رو هم حذف کرد؟
با تشکر