من می خام فرکانس 40K بسازم ولی وقتی از کریستال خود میکرو استفاده می کنم فرکانس 35K تولید می کنه و وقتی هم از کریستال خارجی استفاده می کنم فرکانس 34K تولید می کنه.مشکل از کجاست؟چرا اینقدر اختلاف؟آیا مشکل از دقیق نبود کریستاله؟چکار باید بکنم تا بتونم فرکانس 40K یا حداقل 39K تولید کنم؟
توضیح:
میکرومن Atmega16 هست.
از تایمر 0 استفاده می کنم.
کریستال خارجی من 8.000000 است.مقدار Prescale رو هم 1 می ذارم.
این مشکل رو هم با بسکام و هم با کدویژن دارم.
TCNT0 رو با 0x100-100 مقدار دهی می کنم.
TCNT0=0x100-100
روش محاسبه من:
8MHz/4KHz=200/2=100
برای تولید یه فرکانس روی یه پین اگه مکان پین مهم نباشه باید از مد CTC استفاده کرد. تو این مد هرگاه مقدار ثبات تایمر با مقدار ثبات OCR0 برسه ، حالت پین OC0 رو عوض می کنه، (صفر ،یک یا معکوس می کنه که این حالت آخری مد نظر ماست). برای پیدا کردن مقدار صحیح ثبات OCR0 از فرمول زیر استفاده می کنیم:
OCR0=( (CRYSTAL/fer)/2 ) - 1
یعنی برای داشتن فرکانس 40 کیلو باید مقدارOCR0 برابر99 در مبنای دهدهی باشه
اون روشی که شما رفتی احتمالا استفاده از روتین وقفه سرریز تایمر بوده که تو همون روتین هم TCNT0 رو هم مقدار دهی می کردی هم پین رو بر عکس. ولی اون روش اشتباهه و مال 8051 هستش.
با نوشتن تنها همین دو تا خط و البته خروجی تعریف کردن PINB.3 فرکانس 40 کیلو تو خروجی میاد. احتیاج به هیچ چیز دیگه ای هم نیست.
TCCR0=0x19
OCR0=99
تفاوت فرکانس نوسانساز داخلی با کریستال خارجی می تونه به خاطر دما یا ولتاژ تغذیه باشه که 5ولت نبوده.
با تشکر از شما.
من موج معمولی نمی خام.می خام یه موج بسازم که 20تا پالس 40کیلوهرتز داشته باشه بعد به مدت 10 میلی ثانیه صفر بشه و دوباره 20تا پالس 40کیلوهرتز و...
آیا با استفاده از روش شما می شه همچین کاری کرد؟چگونه؟
آیا روش شما فرکانس رو دقیق می ده؟مثلا اگر بخام فرکانس 40کیلو تولید کنم همون 40 کیلو می ده یا مثل روش خودم یه موج با فرکانس مثلا 35کیلو تولید می کنه؟
این روش یه روش معمول برای تولید فرکانس در avr هاست. چون وقفه نداره باعث اختلال در برنامه هم نمی شه.این اشکال در 8051 به وضوح دیده میشد، که وقتی می خواستیم یه فرکانس بسازیم کل برنامه به هم میریخت.
من قبلا تست کردم دقیق هست.
ولی اگه بخوای مثلا 20 تا پالس بدی بعد یه مدت تاخیر بندازی الان فقط یه راه به ذهنم میرسه اگه بخوای از روش من استفاده کنی که شاید جالب نباشه. اونم استفاده از تایمر2 به عنوان کانتر هست،که وقتی 20 تا پالس زد با مقدار دهی TCCR0=0 تایمر صفر متوقف میشه.بعد از مدت DELAY باز با مقدار دهی TCCR0=0X19 تایمر راه می افته البته قبلش TCNT0 رو صفر کن. خوبی این کار نداشتن وقفه است.
اگه میبینی تو روش خودت جواب نگرفتی دلیلش اینه که تا به reload یا همون دوباره بارگذاری tcnt یه زمانی صرف میشه که تو باید اونو هم در نظر بگیری،یعنی اون0x100-100 یه ذره زیاده میتونی با پروتئوس مقدار درست رو بدست بیاری. واگر نه روش وقفه ای که خودت به کار بردی هم دارای دقت هست .
با سلام وتشکر از راهنمایی شما
میشه لطفا درباره ی مد ctc بیشتر توضیح بدهید.
ایا تایمر صفر هم این مد را دارد؟
من درباره این مد تقریبا هیچ اطلاعاتی ندارم
خیلی برام جالب بود که این گونه به سادگی پالس و فرکانس ساختید
میشه توضیح بدید چرا TCCR0 را این گونه مقدار دهی کردید؟
و کلا این روش به چه صورت کار میکنه و من اطلاعات بیشتر را از کجا میتونم بگیرم
باز هم از لطف شما متشکرم
البته اگر پاسخ را به e-mail من بفرستید بسیار ممنون میشم.
mitra2640@yahoo.com
نقل قول: میشه لطفا درباره ی مد ctc بیشتر توضیح بدهید.
مد ctc همون مد مقایسه هست. در این حالت ریجستر TCNT0 به طور دائم با رجیستر OCR0 مقایسه میشه و اگه با هم تطابق داشت مقدار TCNT0 صفر میشه.
نقل قول: ایا تایمر صفر هم این مد را دارد؟
بله.
نقل قول: میشه توضیح بدید چرا TCCR0 را این گونه مقدار دهی کردید؟
این مقدار (TCCR0=0X19 ) تقریباً همون 10 میلی ثانیه تاخیره.
نقل قول: البته اگر پاسخ را به e-mail من بفرستید بسیار ممنون میشم.
کاربرد این سایت نشر همین اطلاعاته. اگه قرار شه همه جواب ها به میل شخص ارسال بشه که .....
تشکر لازم نیست.