# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > AVR >  AVR

## zohreh88

سلام 
من یک سوالی درمورد تایمر avrدارم. می خواهم برنامه ای بنویسم که سه پالس با دوره تناوب متفاوت را به صورت پیوسته تولید کند . اما فقط می توانم که این پالسها را جداگانه هر کدام را توسط یکی از تایمرها بسازم اما نمی دانم چگونه باید آنها را پشت سر هم روی یک پایه قرار دهم؟؟؟؟؟؟لطفا هر کسی که می داند راهنمایی کند :متفکر:

----------


## farzadsw

پالس ها  0و1 هستن دیگه ؟ در اونصورت اگه 3تاشون رو رو یه پایه بگذارید چیز جالبی نمیشه ها ! انگار اجتماع گرفتید!
در هر صورت ، شما ب.م.م این سه دوره رو بگیرید . 
*یدونه* تایمر با interval برابر اون ب.م.م تعریف کنید .  پالس ها رو متناسب با دوره شون( بعد از n تا interval) درست کنید . (با تعریف یه متغیر که تو هر interval یکی زیاد بشه و دستور if)

----------


## zohreh88

علت اینکه می خوام سه تاشو رو یه پایه بذارم اینه که در واقع اون شکل موجی که من میخوام به این صورته که ابتدا به اندازه 2 میکرو ثانیه high باشد 998 میکروثانیه low سپس 2میکروثانیه high و 498 میکروثانیه low وبعد 2میکرو ثانیه high و 98 میکروثانیه low وبه همین ترتیب پشت سر هم تکرار شوند ، در ضمن منظورتون رو از interval متوجه نشدم ،من باcodevision کار می کنم. :افسرده:

----------


## farzadsw

ابتدا اینو بگم که با توجه به فرکانس و سرعت میکرو ؛ زمان 2 میکرو ثانیه خیلی کوتاهه و شما باید حدود 50 میکرو ثانیه در نظر بگیرید
شما یه تایمر رو تنظیم کنید هر 50  میکرو ثانیه وقفش عمل کنه (این یعنی مفهوم interval ) . 
بعد یه متغیر تعریف کنید که تو هر بار اجرای وقفه یه واحد بهش اضافه بشه (برای جلوگیری از سرریز میتونید وقتی مثلا 20 شد ،صفرش کنید)
حالا یه دستور if بگذارید تا با مقایسه اون متغییر با یکسری ضرایب (پایین توضیح میدم) ، پایه رو 0 یا 1 کنه.

ضرایب :
اگه فرض کنیم پاسها به صورت 50-950 و 50-450 و 50-50 باشن . ضرایب به ترتیب میشن
1 (قبلا تعریف کردیم وقتی متغییر به 20 میرسه 0 بشه)
1 و 10 
1و3و5و7و9و11و13و15و17و19

----------


## zohreh88

چه جوری بنویسم که هر 50 میکروثانیه یک اینتراپت بده؟
اینو می دونم که تایمرها دو نوع اینتراپت دارند :یکی برای وقتی هستش که over flow میشن و یکی هم برای compare ، یعنی زمانی که رجیسترهای TCNT وOCR با هم برابر شوند. که با اولی مقدار top value یعنی 255 تعیین میکنه که چه وقت اینتراپت بده ...آها!...منظورتون اینه که هر 50 میکروثانیه overflow بشه؟ :متفکر:

----------


## zohreh88

اما باز هم نشد  :گریه: من برنامه رو اینطوری نوشتم که هر 50us یک اینتراپت over flow بده و داخل روتین اینتراپت یک متغیری که هر بار یکی اضافه بشه،و بعد تابع if به اینصورت:
int count=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xC2;
count++;
if (count==1)
{   
 PORTA.1=1;
} 
if (count==2)
{   
 PORTA.1=0;
}
if (count==3)
{   
 PORTA.1=1;
} 
if (count==4)
{   
 PORTA.1=0;
 count=0;
}
if (count==5)
{   
 PORTA.1=0;
 count=0;
}و انتظار داشتم دو پالس به صورت:50 - 50 و 50 - 300 بسازه اما چیزی که ساخت یک پالس 50- 50 که تازه پالس هم نیست تغییر بین 0و1 بصورت شیبداره و دامنه اش 1 ولت روی سطح dc چهار ولت هستش :عصبانی:

----------


## farzadsw

فکر کنم اشکال به دلیل فرکانس بالایی باشه که تعریف کردید ، جهت اطمینان اون 50 میکرو رو بکنید ، 1 میلی(!) (چون موج 1 KHz رو دیدم با میکرو درست کردن). البته تو دیتا شیت هم حداکثر فرکانس i/o میکرو رو مینویسه.
*این چند وقت سرم یکم شلوغه درست حسابی نمیتونم جواب بدم!

----------


## zohreh88

وقتی 1ms میذارم شکل بهتر میشه اما هنوزم شکل موج اون حالت خازنی رو داره یعنی وقتی میخواد صفربشه شیب داره.اما به هر حال من فرکانس بالا میخوام و میدونم که میکرو میتونه بده چون روی پایه OC که خروجی تایمر هستش من حتی دوره تناوب ns هم میتونم بسازم اما روی پورت دیگه که دستی میخوام صفر و یک کنم این مشکل پیش میاد!  :ناراحت:  :افسرده: 
به هر حال ممنونم که وقت گذاشتید.

----------


## aynehband

بگرد یک opampخوب پیدا کن که بتونه برات حالت خازنی رو کاهش بده، اگر op-amp خوبی پیدا کنی که با فرکانست سازگار باشه به محض گدشتن از ولتاژ مقایسه ، خیلی سریع به صفر میل میکنه

----------


## zohreh88

باشه این تست رو انجام میدم. مرسی

----------


## zohreh88

با این راه هم حل نشد .آخه مشکل اینجاست که میکرو دوره تناوب کمتر از 1ms را نمیتونه بسازه یعنی همش high میشه و مقایسه کننده نمیتونه تشخیص بده.اون حالت خازنی که گفتم برای زمانی هستش که دوره تناوب رو زیاد میکنم که این چیزی نیست که من میخوام.

----------


## hh_amiri2004

آقای farzadsw
ممنون از پاسختون به سوالم در مورد پروژه ی finger print.
ولی من فعلا فقط می خوام کد بزنم و در proteus شبیه سازی کنم.
مشکلم عدم آشنایی با کد زدنه، یعنی نمی دونم چی باید بنویسم تا میکروکنترلر با سنسور ارتباط برقرار کنه!

----------


## farzadsw

البته منظورم از تاپیک avr این یکی بود:
https://barnamenevis.org/showth...130#post777130
اونجا توضیح دادم.

----------


## farzadsw

> با این راه هم حل نشد .آخه مشکل اینجاست که میکرو دوره تناوب کمتر از 1ms را نمیتونه بسازه یعنی همش high میشه و مقایسه کننده نمیتونه تشخیص بده.اون حالت خازنی که گفتم برای زمانی هستش که دوره تناوب رو زیاد میکنم که این چیزی نیست که من میخوام.


راستی ، شما با دیود امتحان کردید ؟ یعنی مثلا 2تا موج روی 2تا پایه های timer (مثلا OC0 , OC2 تو atmega16 ) بسازید و هر کدوم رو به یه دیود بدید و طرف دیگه دیود ها رو به هم وصل کنید. البته تو این حالت 0.7 ولت به خاطر دیود ها ولتاژ کم میشه.

----------


## zohreh88

اگر این دیودها رو بذارم اونوقت انتظار داریم که در خروجی چی ببینیم؟یعنی پالسهای دو تا پایه رو یکی در میون می بینیم؟

----------


## farzadsw

> اگر این دیودها رو بذارم اونوقت انتظار داریم که در خروجی چی ببینیم؟یعنی پالسهای دو تا پایه رو یکی در میون می بینیم؟


اگه اون پایه هارو مستقیم وصل کنید ، اگه یه پایه 0 بشه و اون یکی 1 ، خروجی (محل اتصال 2پایه) 0 میشه و در اصل and گرفته میشه که مورد نظر شما نیست (ممکنه که میکرو هم آسیب ببینه)
ولی اگه با دیود وصل کنید or مشن و اشکالی پیش نمیاد.
محل اتصال رو هم pullDown کنید ، یعنی یه مقاومت نسبتا زیاد مثلا 10 کیلو رو از یه طرف به زمین و از یه طرف به محل اتصال وصل کنید.

----------


## zohreh88

اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!

----------


## farzadsw

> اگر خروجی دو تایمررا به این صورت فرض کنیم که دوره تناوب یکی نصف دوره تناوب دیگری باشه در این صورت که اگر با هم or بشن خب همیشه اون پالسی رو که دوره تناوب کمتر داره می بینیم که!


معلومه دیگه ، قبلا هم به شما گفتم شما با اینکار اجتماع (OR) میگرید و چیز جالبی نمیشه .



> پالس ها 0و1 هستن دیگه ؟ در اونصورت اگه 3تاشون رو رو یه پایه بگذارید چیز جالبی نمیشه ها ! انگار اجتماع گرفتید!


اگه بد متوجه سوالتون شدم بگید.

----------


## zohreh88

منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟ :متفکر:

----------


## farzadsw

> منظورم از اینکه میخوام سه تا پالس رو یه پایه بذارم این نیست که همزمان رو یه پایه سه تا پالس داشته باشم در واقع منظورم اینه که بعد از پایان پالس اولی ، پالس دومی باشه و بعد از پایان دومی، پالس سوم. من فکر می کنم با یه تایمر بشه هر بار دوره تناوب رو تغییر داد اما نمیدونم چه طوری؟


دوره تناوب رو میشه به وسیله ctc top   و یا clock value  تغییر داد ،  اگه  (من امتحان نکردم ولی فکر کنم بشه) این مقادیر رو وسط برنامتون تغییر بدید ، یه دوره تناوب دیگه بدست میارید.

----------


## zohreh88

> دوره تناوب رو میشه به وسیله ctc top و یا clock value تغییر داد ، اگه (من امتحان نکردم ولی فکر کنم بشه) این مقادیر رو وسط برنامتون تغییر بدید ، یه دوره تناوب دیگه بدست میارید.


بله همینطوره در واقع من تونستم برنامش رو بنویسم که سه تا پالس با دوره تناوبهای مختلف درست کنه.حالا مشکل اینجاست که زمان high بودن سیگنال، محدودیت داره یعنی از 40us که کمتر می کنم(من 2us میخوام باشه)،شکل به هم میخوره (یعنی جای high و lowبرعکس میشه)و زیر 10us که دیگه اصلا همش high میشه!

----------


## farzadsw

فکر کنم دیگه از اینجا به بعد محدودیت خود میکرو باشه. مثلا LPC23xx که یه میکروی ARM هست هم محدودیت داره . با اینکه خود میکرو فرکانس 50 مگاهرتز داره حداکثر میتونه 1/8 این مقدار رو پالس تولید کنه (اونم توی پایه های مخصوص و FAST) . یعنی حدود 6 مگ . البته سری AT91sam که باز یه میکروی ARM هست همین 6مگ رو هم نمیتونه تولید کنه.
من دیتاشیت atmega 32 رو یه نگاه اجمالی کردم چیزی در مورد محدودیت فرکانس خروجیش ندیدم ولی احتمالا تو همون دیتاشیتش (اگه با حوصله بخونید) نوشته .

----------


## farzadsw

راستی ، یه سری ic مخصوص اینکار هستن که موج سینوسی ، مثلثی و مربعی رو با فرکانس بالا مثلا تا 50 مگ درست میکنن. به وسیله میکرو کنترلر هم برنامه ریزی میشن . مثل AD9835 یا AD9833
برای اطلاع بیشتر برید اینجا:
http://kavirelectronic.ir/fa/modules...rder=0&thold=0
فقط قیمتشون یکم زیاده ، البته آگهی های اینترنتی معمولا گرون تر از قیمت بازار میدن.

----------


## zohreh88

اگه اطمینان پیدا کردم که از محدودیت میکرو هستش میرم سراغ آی سی AD9833.
خیلی ممنون

----------

