ايران ويج

نسخه‌ی کامل: سوال در مورد تایمرها در میکرو atmega16 و زبان code vision
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
همگی خسته نباشید
داشتم دنبال اطلاعاتی درباره تایمر میگشتم که با سایت شما آشنا شدم.
چند تا سوال دارم...من میخوام با میکرو ATMEGA16 و با استفاده از زبان Code vision اینکارا رو انجام بدم
یکی اینکه باید با استفاده از تایمر1 برنامه ای بنویسم که یک LED متصل به پایه PC0 هر ثانیه یکبار چشمک بزنه راستش خیلی تایمر بلد نیستم اما تا اونجایی که میدونم تایمر 1 فقط روی پین های D4 و D5 عمل میکنه و این محدودیت پین رو نمیدونم چکار کنم؟ آیا میشه همه کارو روی یه میکرو روی همون پایه D4 یا D5 انجام بدم بعدش این میکرومو با استفاده از ارتباط سریال USART متصل کنم به یه میکرو دیگه و اینو بفرستم روی پایه PC0 اون یکی میکرو؟اصلا چنین کاری درسته؟ یا روی همون یک میکرو روی پایه PC0 میشه این کارو انجام داد؟

یه سوال دیگه هم اینکه میخوام هم زمان یه موج مربعی 1khz روی PA0 و یه موج مربعی 3khz روی PA1 تولید کنم با فرکانس کریستال داخلی 8mhz ؟
راستش اینو تا حدودی فکرکردم و به این نتیجه رسیدم که باید با تایمر 0 و 2 نوشته بشه اما بازم محدودیت پین دارم یعنی روی پین A هیچ تایمری نیست! و یه چیز دیگه که نمیتونم بفهمم اینکه چطور میشه از روی فرکانس مثلا 1khz دوره تناوب را بدست آورد؟
اگرممکنه یکم در مورد مدهای کاری تایمرها بگید من اصلا نمیدونم از کدام مد باید استفاده کنم!
لطفا کمک کنید وقت زیادی هم ندارم
ممنون
سلام.

شما بهتره اول يه سري مطالب آموزشي در اين باره بخوني ... ، كتاب يا هر چيزي ...
چون اين مباحث خيلي گسترده هست ... ( اينجا نمي شه كتاب نوشت ... )
بعد روي مفهوم وقفه هم كار كنيد . تايمر هم وقفه داره و براي درست كردن زمان هاي زياد مجبور مي شي ازش استفاده كني ... .
تايمر زمان رو مي سازه و وقتي زمان ساخته شد با دستور هاي شرطي به هر پايه اي مي تونيد دستور بديد .
موج مربعي 1khz و 3khz هم با يك تايمر مي شه ساخت .
لازمه كه برنامه نويسي رو درك كنيد .

مود هاي مختلف تايمر رو فعلا ول كن ( مخصوصا اگر وقت كم داري و كاري باهاشون نداري ... ) ، فقط قسمت خود تايمر رو بخون .

هميشه زود دير مي شه ... ، بهتره همين الان از روي كتابي چيزي ... ، با دقت شروع به خوندن كنيد ( شايد چند بار )
بعد اگر مشكلتون حل نشد ، سوالات جزئي بپرسيد تا اگر بلد بوديم كمك كنيم .

موفق باشي.
يا علي.
انقدر جزه خوندم که دیگه قاطی کردم هرکدوم یه جور توضیح دادن!
تنها فرمول درستی که بهش رسیدم این بود
Δt = (65536 – X0 )*( Prescale/Fosc)
خب من اینکارو کردم دلتای زمان رو 1 درنظر گرفتم و پریسکیلمو 1024 و فرکانس اسیلاتورم 8مگاهرتز
حالا این عدد بدست اومده میشه x0 یعنی همون عددی که باید بریزم توی تایمر
حالا چه جوری ؟؟؟؟
منظورم اینه که من باید اینو چه طوری تقسیم کنم که بتونمش بریزمش توی رجیسترهای تایمر1 (یعنی همون OCR1AH , OCR1AL , OCR1BH , OCR1BL .... ؟؟؟ اصلا تایمرم باید توی مد normal کارکنه یا CTC .... ????
خوب شما يه جزوه رو درست بخون . مطالبي رو كه مي گم از كتاب مرجع كامل ميكرو هاي AVR هست ( خودم بسكام كار مي كنم )

ctc براي حات مقايسه ايه كه شما كاري با اين نداري و مي خواهيد با تايمر زمان بسازيد ...
مگر از codewizard استفاده نمي كني ؟!
براي ساختن زمان فقط با TCCR و TCNT كار داري كه از اولي براي فعال كردن مود تايمر و ... استفاده مي شه و از دومي براي مقدار اوليه دادن و خوندن ...
اگر از codewizard استفاده كني ، لازم نيست با ريجستر ها در گير بشي ...
از همونجا فعال مي كني ، وقفه مي ذاري و ...

پس مقدار اوليه رو توي TCNT بايد بنويسي ، تو codewizard هم فكر كنم همون val باشه كه تو آخرين خط هست ...

رابطه ي خاصي هم نداره ... ، معمولي حساب كن ...

کد:
مثال : براي تايمر 0 هست كه 8 بيتيه ... (0-255)
فركانس = 1MHz   ،   مقسم فركانس = 32   ،   TCNT0=0AH=00001010B

31.25KHz  1MHz/32 = = فركانس پالس ساعت تايمر
32us = 1/31.25KHz = مدت زمان يك شمارش
تعداد پالس براي سر ريز شدن تايمر : 256 - TCNT0 = 256 - 10 = 246
246 * 32us = 7.872ms = مدت زمان شمارش تايمر

حالا شما براي تايمر 1 بنويس و از codewizard استفاده كن ...
ممكنه نياز بشه از وقفه هم استفاده كني ...

موفق باشي.
يا علي.

يه بار ديگه رابطه ها رو مي ذارم به ترتيب ، بالا قاطي شد !

کد:
1MHz/32= 31.25KHz
32us = 1/31.25KHz
256 - TCNT0 = 256 - 10 = 246
246 * 32us = 7.872ms