PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ### تولید فرکانس با میکرو AVR ###



REZA_KLNTR
19-02-2009, 01:27
اساتید عزیز

نیاز به برنامه تولید یک فرکانس مربعی 50 هرتز با میکرو دارم که بتوان سیکل مثبت را از 1 تا 2 میلی ثانیه تغییر داد ( هر سیکل 20 میلی ثانیه است )

میکرو مگا 8 کریستال 8 مگ و بیسکام

با تشکر

kavir
20-02-2009, 01:40
سلام
خوب به کمک دستورwaitms اینکار انجام بدید.و خیلی می خواین دقیق باشه با تایمر
خوب تاخیر ها رو بر منبای پالسی که می خواهید حساب کنید
برای تغییر مقدار ان می توانید یک شسی به عنوان ورودی در نظر بگیرید و موقعی که فشار دادید به زیر برنامه ای بره که می خواین زمان تاخیر رو تنظیم کنید و بعدش زمان تاخیر رو در یک متغییر ذخیره کنید و برگشت به برنامه اصلی.ورودی و خروجی ها تعریف کنید یادتون نره
لطفا استارت کار رو بزنید در حین برنامه اگه مشکل داشتید مطرح سازید aa)
به زبان ساده:

[align=left:2ebe38a3df] $regfile = "m8def.dat"

$crystal = 8000000

Const Sw = Pind.0
Const Press = 1
Main:

Do
If Sw = Press Then Goto Change_time
Portd.1 = 1
Waitms 10 'waitms value_time
Portd.1 = 0
Waitms 10 ''waitms value_time
Loop

Change_time:
'code


End[/align:2ebe38a3df]

REZA_KLNTR
20-02-2009, 09:45
خیلی ممنون از توضیحاتتون

به جای اون کلیدهایی که گفتین از یک پتانسیومتر سر یک ADC میکرو میخوام استفاده کنم
که وسط پتانسیومتر ،نیم سیکل مثبت 1.5 میلی ثانیه باشه و حداکثر و حداقل پتانسیومتر 1 تا 2 میلی ثانیه تغییر کنه :roll:

بله دقت بالا لازمه و شنیدم باید حتما از تایمر استفاده کنم

You can see links before reply (You can see links before reply)

مشکل من اینجای که هنوز برنامه نویسی یاد نگرفتم ازم کارای سخت میخوان :?or:(

ممنون میشم بیشتر کمک کنید چون کار با تایمرهارو بلد نیستم! :?or:(


$regfile = "M8DEF.dat"
$crystal = 4000000

Dim A As Word , B As Word ,V2 As Single
Config Adc = Single , Prescaler = Auto , Reference = Internal

Start Adc
Do
A = Getadc(1)
V2 = A
V2 = V2 / 1024
B = 1 + V2

خوب الان با تغییر پتانسیومتر از حداقل تا حداکثر B ما از 1 تا 2 تغییر میکنه و به عنوان ضریب تایمر(1 تا 2 میلی ثانیه) آمادس ، حالا باید تایم 1 میلی ثانیه داشته باشیم که در این ضریب ضرب کنیم و 1 تا 2 میلی رو بدست بیاریم
شما برنامه تایمرشو میچینی!

kavir
20-02-2009, 12:44
سلام
این راهنما رو بخونید برای کار با تایمر هست
You can see links before reply

REZA_KLNTR
20-02-2009, 17:49
من همشو خوندم ولی بعضی جاهاش کلمه جا افتاده بود متوجه نشدم ممکنه توضیح بدین یا تو برنامه توضیح بدین دارم سعی میکنم یاد بگیرم

فرکانس 50 میخوام با طول نیم موج متغیر! چجوری میشه؟!

kavir
21-02-2009, 01:08
به نظر بهتره شما از یک جایی شروع کنید در لینک زیر دوکتاب هست به همراه مثال
You can see links before reply
بهتره دانلود کنید و خودتون حلش کنید اگه به مشکل برخورید در انجمن مطرح سازید
این رو برای خودتون می گم

REZA_KLNTR
21-02-2009, 04:11
سلام

من گرفتمش بعد دیم هر سه ویرایششو دارم و دارم میخونم ولی نمیدونم چجوری این فرکانس رو بسازم

من اگه مشکل نداشتم که الان اینجا نبودم !

مثالها هم وسیله ای برای یادگیری هستند و من در این باره (ساخت فرکانس مثال ندیدم هنوز)

ما به امید شما اینجاییم

kavir
21-02-2009, 12:05
برای راه اندازی تایمر یک نمونه مثال از کتاب علی کاه می ذارم تا آشنا بشید
برای تولید پالس هم بالا مثال زده بودم که به جای تاخیرهایی که با دستور waitms هست به کمک تایمر تولید کنید.اگه خیلی دقت بالا نیاز ندارید می تونید از دستور pulseout خود بسکام نیز استفاده کنید
برای محسابه تاخیر اینکه تایمر چه مدت طول می کشه تا سرریز بشه:
256*1024 /8000000
256*1024 تقسیم بر کریستال
256 چون تایمر صفر8 بیتی هست اگه تایمر یک بود تا $ffff
1024 هم برای تقسیم کلاک تایمر هست
حالا شما اگه در زیر برنامه وقفه ای که برای تایمر هست یک متغییر در نظر بگیرید که با هر بار سرریز شدن تایمر یکی بهش اضافه کنید و بعد از تاخیر مورد نظر برنامه مورد نظر رو اجرا کنید یا تغییر وضعیت پین مورد نظر بدید
برای مثال اگه تا 30 بار تایمر سرریز بشه تاخیری حدود یک ثانیه داریم که محاسباتش بالا گفتم
چطور هست
در کل اینطوری می شه:
256*1024*30
/
8000000
در ضمن تایمر رو به صورت وقفه ای استفاده می کنیم بنابراین وقفه ها رو فعال می کنیم و برای تعیین اینکه وقتی وقفه تایمر رخ داد به کجا بره با On Ovf0 Led تعیین می کنیم.
---------------------------------
موفق باشید

[align=left:c8d6818338] $regfile = "m8def.dat"

$crystal = 8000000
Config Timer0 = Timer , Prescale = 1024

On Ovf0 Led
Enable Interrupts

Enable Timer0

Do
Loop
Led:

Incr C

If C => 30 Then





End If
Return[/align:c8d6818338]

REZA_KLNTR
21-02-2009, 17:56
رییس جان اتفاقا کتاب آقای کاهه رو هم تازه خریدم ویرایش دو ماه پیشه ولی هنوز به اینجاها نرسیدم یکم پریدم تا زودتر یاد بگیرم ولی متوجه نمیشم سرعتم تو یاد گیری خیلی پایینه

اگه ممکنه برنامه ایکه من شروع کردم رو ادامه بدین منم رو همین برنامه و مدار سعی میکنم تایمرهارو یاد بگیرم

بازم ممنون و منتظرم :D

kavir
21-02-2009, 18:24
خوب دوست عزیز شما از اول باید شروع کنی و قدم به قدم
برنامه رو گفتم بالا چیکار کنید
ببینید هر برنامه وقت گیره و نمی تونم هر برنامه رو کامل بنویسم و کار درستی هم نیست
در کل راهنمایی هایی که می شه خودتون باید برنامه رو تموم کنید
لطفا به سراغ پروتئوس برید و خودتون شبیه سازی کنید و کم کم راه می یفتید

REZA_KLNTR
22-02-2009, 15:19
خوب دوست عزیز من نیاز به یک برنامه نمونه یا مثال درست دارم تا مطالبو عملی هم بفهمم فکر نکنم چیزاییکه میگین چند خط بیشتر بشه اگه شما ادامه بدین ممنون میشم وگرنه بدون نمونه من اصلا نمیفهمم گفتم که یادگیریم کند پیش میره و الان هم به این برنامه سریعتر از یاد گیریم نیاز دارم
منم دارم تلاش خودمو میکنم

حالا ادامه میدین تا من یاد بگیرم یا نه؟ :?or:(

codev
22-02-2009, 19:10
سلام
شما می تونید با استفاده از رجیستر مقایسه ای تایمر کانتر 1 خیلی راحت این کار رو انجام دهید .اول تایمر کانتر رو در حالت مقایسه ای پیکره بندی کنید و حالت خروجی را در حالت toggle قرار دهید و پرچم صفر شدن تایمر هنگام رسیدن به مقدار مقایسه رو هم یک کنید . حالا شروع کنید مقدار رجیستر مقاسه ای رو از اول زیاد کنید و با هر بار زیاد شدن ، فرکانس خروجی پایه ی OC1A/B را اندازه بگیرید . بالاخره به اون فرکانس می رسید.
حالا برای راحت شدن ، این فرکانس خروجی یه رابطه ای داشت که الان درست یادم نیست اگه تونستم برات پیداش می کنم و یا این برنامه رو برات می ذارم (چون یادمه این مشکل رو هم منم داشتم )

codev
23-02-2009, 01:22
یافتم :o :o
استاد محترم این هم سورس برنامه
You can see links before reply
تو ضیحات اضافه تر : این برنامه با استفاده از timer1 یه فرکانس دقیق 50 هرتز تولید می کنه و باید تایمر 1 در حالت تایمر و در حالت مقایسه با رجیستر OCR1 پیکره بندی بشه . هنگام رسیدن به مقدار مقایسه هم وضعیت منطقی پایه ی OCR1A/B هم toggle بشه .در اینصورت باید مقدار رجیستر OCR1A/B با توجه به مقدار فرکانس مورد نظر از رابطه ی زیر تعیین بشه :

You can see links before reply (You can see links before reply)


که در آن :
F osc : فرکانس اسیلاتور AVR بر حسب هرتز
prescaler : مقدار prescaler تایمر
F out : مقدار فرکانس مورد نظر خروجی بر حسب هرتز

مقدار بدست آمده باید در رجیستر ocr قرار بگیرد و اگر عدد بدست آمده اعشاری بود فرکانس خروجی دقیق بدست نمی آید.
برای مثال برای فرکانس 50 هرتز در شرایطی که فرکانس avr چهار مگاهرتز هست و prescaler طوری تنظیم شده باشه که فرکانس سورس timer1 برابر 500000 هرتز باشه (prescaler=2( مقدار 4999 بدست می آید .
در برنامه این فعالیتها مشخص است .
متاسفانه این برنامه به زبان c هست و با برنامه ی codevision کامپایل می شه . من خیلی وقت هست که زبون بیسیک رو بوسیدم و کنار گذاشتم و به شما هم پیشنهاد می کنم که avr رو با زبون c یاد بگیرید .به هر حال اگه هم این زبون رو هم بلد نیستید مشکلی نیست شما فقط فرکانسی که می خواید درست کنید رو توی فرمول بذارید و مقدار OCR را در خط 108 برنامه به رجیستر انتساب بدید .(اون قسمت رو هم مشخص کردم با علامت ***) و بعد اون رو build کنید و .... .
سوالی داشتید در خدمتم . aa)

REZA_KLNTR
23-02-2009, 03:50
خیلی ممنون دوست عزیز چون رشته اصلیم الکترونیک نیست همین بیسکامم دارم به زور یاد میگیرم

ممنون از برنامت ولی اگر در پستهای بالا دقت کرده باشی من میخوام طول موج در این فرکانس 50 هرتز قابل کنترل باشه یعنی میخوام 1 تا 2 میلی ثانیه مثبت یا همون 1 باشه و 18 میلی ثانیه صفر

خوب فکر نکنم اونقدر پیچیده باشه که از بیسکام یادت نیاد من این برنامه رو با کمک یک کتاب برا 1 ثانیه نوشتم که ابتدا رو یک ثانیه کار کنم :

[align=left:cbd2aed45b]$regfile = "M8DEF.DAT"
$crystal = 16000000


Config Portc = Output
Ddrc.0 = 1 : Portc.0 = 0
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer1
Enable Ovf1
On Timer1 Lable

Timer1 = 57722
Start Timer1

Do
Loop

End


Lable:
Toggle Portc.0
Timer1 = 57722
Start Timer1
Return [/align:cbd2aed45b]


خوب این برنامه وقتی میره تو LABLE هر نیمثانیه پورت C رو معکوس میکنه که یک فرکانس با طول موجهای ثابت و یکنواخت بدست میاد

حالا من میخوام طول موج مثبت که سپری شد یک پورت یک بشه و بعد از طول موج دیگه ای که با اولی فرق داره همون پورت صفر بشه اصلا بزار راحتتر بگم میخوام مثلا 1 ثانیه پورت یک باشه و دو ثانیه صفر یعنی دوبار شمارش داشته باشم و از دستور SET PORT و RESET PORT هم میخوام استفاده کنم حالا راهنماییم کنید :k01:

codev
23-02-2009, 14:41
به نظر من بهترین کار استفاده از pwm تایمر است . شما این قسمت رو توی کتابتون بخونید متوجه می شید که تولید این پالسی که شما تعریف می کنید چقدر ساده می شه .
به طور ساده بگم که با استفاده از pwm تایمر می تونید عرض پالس ، زمانی که در سطح منطقی صفر یا یک هست رو تنظیم کنید . اما اینکه فرکانسش 50 هرتز باشه ، یه کم سخته . چون فرکانس pwm معمولا زیاد هست .
ولی همیشه یه سری راه و روش هایی برای افراد کنجکاو هست.
علت اینکه می گم با استفاده از نرم افزار این پالس رو تولید نکن اینه که کارتون دقیق نمی شه ولی اگه نشد چاره چیه :?or:( :?or:(

REZA_KLNTR
25-02-2009, 00:36
ممکنه درباره کار با PWM برا منظور من یکم توضیح بدین

ممنون

1nafar
26-02-2009, 09:35
نیاز به برنامه تولید یک فرکانس مربعی 50 هرتز با میکرو دارم که بتوان سیکل مثبت را از 1 تا 2 میلی ثانیه تغییر داد ( هر سیکل 20 میلی ثانیه است )

میکرو مگا 8 کریستال 8 مگ و بیسکام

به جای اون کلیدهایی که گفتین از یک پتانسیومتر سر یک ADC میکرو میخوام استفاده کنم
که وسط پتانسیومتر ،نیم سیکل مثبت 1.5 میلی ثانیه باشه و حداکثر و حداقل پتانسیومتر 1 تا 2 میلی ثانیه تغییر کنه

بله دقت بالا لازمه و شنیدم باید حتما از تایمر استفاده کنم
سلام
دوست عزیز برای این کار راه های مختفی هست که دوستان توضیح دادن و من یه بار دیگه همه رو اینجا میگم:
اولین راه استفاده از دستور waitms هست ، در صورتی که میکرو روی کریستال خارجی تنظیم باشه ( موقعی که کریستال رو برمیداری ، میکرو از کاربیفته ) این دستور دقیق است :
$regfile = "m8def.DAT"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portd.1 , Rs = Portd.0 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Adc = Single , Prescaler = Auto
Config Portb.0 = Output
Dim A As Word
Start Adc
Do
A = Getadc(0)
Waitms A
Set Portb.0
Waitms A
Reset Portb.0
Locate 1 , 1 : Lcd "Waitms" ; A ; " "
Loop
End
در برنامه بالا مقدار دیجتال گرفته شده از adc میکرو برابر با مقدار زمان تاخیر در صفر و یک شدن پایه b.0 شده است ، باز هم تاکید میکنم در صورتی که مقدار کریستال برنامه با کریستال متصل شده یکی باشد و میکرو نیز روی کریستال خارجی تنظیم شده باشد دستور به خوبی جواب می دهد برنامه بالا مقدار زمان تناوب را بین 0 تا 2 ثانیه تغییر میدهد ، در صورتی که مقدار a را به 500 تقسیم کنی و مقدار تاخیر بین 0 تا 2 میلی ثانیه بوجود میاید ، در صورتی که در بین do -loop به جای کد موجود کد زیر را قرار دهی برنامه به برنامه مورد نظر تبدیل میشود :
A = Getadc(0)
A = A / 500
Waitms 10
Set Portb.0
Waitms 10
Waitms A
Reset Portb.0
Locate 1 , 1 : Lcd "Waitms" ; A ; " "

راه دوم استفاده از تایمر میباشد ، بهترین گزینه تایمر 8 بیتی 0 است:
بر نامه پیش نهادی من این است که توسط تایمر یک زمان 10 میکرو ثانیه ای بسازیم :
$regfile = "m8def.DAT"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portd.1 , Rs = Portd.0 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Adc = Single , Prescaler = Auto
Config Timer0 = Timer , Prescale = 64
Dim A As Word , B As Word ,
Config Pinb.0 = Output
Enable Interrupts
Enable Timer0
On Timer0 Q
Start Adc
Start Timer0
Do
A = Getadc(0)
A = A / 500
Locate 1 , 1 : Lcd "Waitms" ; A ; " "
Locate 2 , 1 : Lcd "Waitms" ; B ; " "
Loop
End
Q:
Incr B
B = B + A
If B = 6 Then
Toggle Portb.0
B = 0
End If
Return
و سپس در هر 10 میلی ثانیه یک بار وظیعت پایه را معکوس کنیم ، در برنامه بالا با توجه به مقدار کریستا 8 مگا هرتز و پریسکلیر 64 و بیت تایمر 256 زمان 0.002048 ثانیه بدست میاید ، در زیر برنامه ض که وقتی تایمر سرریز شد به ان پرش میشود ، یک واحد به b افزوده میشود ، مقدار b با a جمع میشود (a مقدار است که توسط ولوم وارد میشود ) و هنگامی که مقدار b شش شد وضعیت پایه تغییر میکند .
برنامه بالا زمان تناوب پالس را در قسمت صفر و یک تغییر میدهد ، در صورتی که برنامه زیر را به جای قسمت q بنویسید ، برنامه فقط در قسمت مثبت تغییر خواهد کرد:
قسمت q رو حذف کن و قسمت زی رو بجاش بنویس:
Q:
Incr B
If B <5> 5 And B <10> 10 Then
B = 0
End If
Return
سومین راه استفاده از pwm هست (ساده ترین راه همینه )
خب فرکانس pwm از رابطه ی زیر بدیت میاید:
(پریسکلیر * 2 * بیت pwm )/ فرکانس کریستال
میدونی که توی بسکام میشه pwm 8 و 9 و 10 بیتی تولید کرد ، ما میتونییم از هر کدومشون استفاده کنیم که من 10 بیتی رو پیشنهاد میکنم ، خب با توجه به مقدار فرکانسی که داریم ( فرکانس خروجی باسد 50 هرتز باشه ) بهترین پریسکلیر وفرکانس کریستال رو انتخاب میکنیم
با چند و ضرب و تقسیم میشه فهمید که بهترین کریستال 6 مگا هرتز و پریسکلیر 64 و بیت تایمر 10 هست ، بنابراین برنامه به شکل زیر میشه :
$regfile = "m8def.DAT"
$crystal = 6000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , E = Portd.1 , Rs = Portd.0 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Adc = Single , Prescaler = Auto
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 64
Dim A As Word , B As Word ,
Config Pinb.1 = Output
Start Adc
Do
A = Getadc(0)
Pwm1a = A
Locate 1 , 1 : Lcd "Waitms" ; A ; " "
Loop
End

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

REZA_KLNTR
26-02-2009, 21:02
ممنون دوست عزیز من ابتدا برنامه اول شما با دستور WAITMS به خاطرم رسیده بود و انجام دادم ولی دستور WAITMS کار نکرد یعنی ابتدا WAITMS A استفاده کردم و چون عدد A اعشاری بود(A/1024 و A=A+1 ) این دستور WAITMS درست عمل نمیکرد (از 1 تا 2 بود) بعد تصمیم گرفتم تا عدد B را ابتدا در 1000 ضرب کنم و از دستور WAITUS B استفاده کنم که اعشاری دیگه در میان نباشه ولی این دستور درست عمل نکرد یعنی دستور WAITUS اصلا متغیر نپذیرفت!! اینم برنامش:
[align=left:36c9af7cf8]
$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Pinb.3 , Db5 = Pinb.2 , Db6 = Pinb.1 , Db7 = Pinb.0 , E = Pinb.4 , Rs = Pinb.5
Config Lcd = 16 * 2 : Cursor Off : Cls

Config Portd = Output
Dim A As Word
Dim V2 As Single
Dim V3 As Single
Dim C As Single
Dim B As Single
Config Adc = Single , Prescaler = Auto , Reference = Avcc



Start Adc
Do

A = Getadc(1)
A=A/1024
B = A+1
B = B * 1000

Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000


C = A
V3 = A / 2
V3 = V3 / 1024
V3 = V3 * 5


Cls
Lcd "V=" ; Fusing(v3 , "#.##") ; " VOLT"
Home Lower
Lcd "T=" ; Fusing(b , "#.##") ; " U.SEC"


Loop

End[/align:36c9af7cf8]

نمیدونم چرا WAITUS متغیر اصلا نمیگیره لا اقل WAITMS میگرفت ولی LCD عدد A رو درست از 1000 تا 2000 نشون میده که یعنی دستورات درسته !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

اینم نقشه مدار


You can see links before reply

برنامه دوم و شوم شما رو هم تست کردم فکر کنم ایرادی داره چون کار نکرد و من هم هنوز راه انداختن تایمر و PWM رو یاد نگرفتم تا رفع ایراد کنم لطفا بیشتر راهنمایی بفرمایید
یک دنیا ممنون

codev
27-02-2009, 01:06
عجیبه شما می گید هر عددی رو که از adc میگیرم رو در 1000 ضرب می کنم ولی بالا شما با 1000 جمع کردید ، می شه یه کم توضیح بدید ii998)

REZA_KLNTR
27-02-2009, 03:24
ببخشید دوست من ، چون چند تا برنامه نوشتم اشتباه تایپی شده بود که درست شد








کسی نیست توضیح بده که چرا در برنامه من WAITUS مانند WAITMS متغیر نمیگیره؟

اصلا WAITUS متغیر قبول میکنه که من بهش دادم ؟؟؟

مثلا:
[align=left:5d1031594a]
B = 100
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000[/align:5d1031594a]

وقتی مثلا B رو براش متغیر قرار میدم کار نمیکنه ولی اگر مستقیم مثل خط آخر عدد 18000 بهش بدم درست کار میکنه!!!

ایراد از دستوره یا از نرم افزار ؟

kavir
03-03-2009, 13:56
ربطی به متغیر نداره .قبول می کنه چه عدد بدین چه متغییر باشه یکی هست
$regfile = "m8def.dat"
Dim B As Word
B = 100
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000
End

REZA_KLNTR
03-03-2009, 18:45
درسته ولی کار نمیکنه ، همین دستور شما هم کار نمیکنه!!!!!!!!!!

این متن کامل برنامه:

[align=left:493f1f153b]$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output

Dim B As Word



Do
B = 200
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000

Loop
End[/align:493f1f153b]


شما ایرادی میبینید؟
ممکنه شما تست بفرمایید؟ (تو پروتئوس با اسکوپ باید دیده میشه)

codev
03-03-2009, 19:02
اما این برنامه که بدرستی کار می کنه ، فقط مسءله اینجا هست که تاخیر 200 میکروثانیه ای شما نسبت به تاخیر 18 میلی ثانیه ای شما خیلی کم هست و به همین دلیل عرض مثبت پالس شما خیلی باریک میشه .
شما بیاید و تاخیر 20 میکروثانیه ای رو به 5 میلی ثانیه تغییر بدید و بعد نتیجه رو ببینید یا اینکه علاوه بر این کار اون تاخیر 18 میلی ثانیه ای رو کم تر کنید .

REZA_KLNTR
03-03-2009, 21:51
خوب من نمیخوام میلی ثانیه باشه من باید به دلایلی از دستور waitus استفاده کنم موردی نیست به این متغیر B=1500 میدم:

$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output

Dim B As Word

Do
B = 1500
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000

Loop
End

بازم کار نمیکنه
مشکل اینه که waitus متغیر قبول نمیکنه (یعنی B رو به عنوان متغیر قبول نمیکنه ولی دستور WAITMS متغیر قبول میکنه)!!

به نظر شما ایراد از دستور است یا از نرم افزار برنامه نویسی من؟

ممکنه است شما هم تست بفرمایید تا مطمئن شیم؟؟!

codev
03-03-2009, 22:25
آره درست می گید توی help بسکام هم نگاه کردم به همین نکته هم اشاره کرده بود
ولی مشکلی نیست شما بیاید یه متغیر دیگه مثل a تعریف کنید و مقدار b را برابر a تقسیم بر 1000 کنید (یعنی میکرو ثانیه رو به میلی ثانیه تبدیل کنید ) و بعد با دستور waitms این تاخیر رو ایجاد کرد :


$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output

Dim B As Word
Dim A As Word

Do
B = 9500
Set Portd.0
A = B / 1000
Waitms A
Reset Portd.0
Waitus 18000

Loop
End

این برنامه رو نوشتم و کار میکنه

REZA_KLNTR
03-03-2009, 23:27
خوب متغیر من در همون ابتدا خودش از 1 تا 2 هست و من برای دستور WAITUS ضرب در 1000 کردم و حالا نمیکنم!


ولی مشکل WAITMS اینه که اعداد اعشاری نمیگره باز!

یعنی 1 تا 1.5 رو همون 1 میگیره و 1.5 تا 2 رو 2 میگیره

موندم چکار کنم دلیل روی آوردن به WAITUS هم به خاطر همین اعشاری نگرفتن WAITMS بود که گفتم در 1000 ضرب میکنم و از دستور WAITUS استفاده میکنم که نشد!!!!!!!!!



حالا چکار کنم؟ متغیر من از 1 تا 2 تغییر داره

codev
04-03-2009, 11:46
دیگه به نظر من باید از for next استفاده کنیم ولی این کار دقت رو پایین میاره ولی دیگه مثل اینکه راه دیگه ای نیست
اگه می تونستی با c بنویسی این مشکل الان حل بود :k08:
این هم کد :
[align=left]$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output

Dim Count As Word
Dim Dela As Word

Do

Dela = 500
Set Portd.0

For Count = 0 To Dela
Waitus 1
Next

Reset Portd.0
Waitus 18000

Loop

End

REZA_KLNTR
05-03-2009, 00:20
ممکنه توضیح بدی با این دستور که استفاده کردین زمان طول موج چجوری محاسبه میشه؟؟؟

فکر کنم این با زیاد و کم شدن تعداد خطهای برنامه تایمش تغییر کنه نه؟

یک توضیحی بدهید لطفا






و همچنان منتظرم که یک نفر پیدا شه تولید و کنترل PWM رو با بیسکام توضیح بده! :k01:

codev
05-03-2009, 01:17
خب شما باید متغیر DELA رو به هر مقداری که خواستید (برحست میکروثانیه) تغییر بدید ، البته بازم یاداور بشم که این روش یه کم نا میزون یا همون نادقیق هست :cry:

REZA_KLNTR
05-03-2009, 02:03
خوب من به روش سعی و خطا و هر بدبختی که شده تغییر 1 تا 2 میلی ثانیه ای رو با ADC و دستور شما ساختم ولی اصلا این دستور دقیق عمل نمیکنه ببین چه اعداد عجیبی بکار بردم تا درست جواب بگیرم:

[align=left:6f924bf995]$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Output
Dim A As Word
Dim B As Single
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim Count As Word
Dim Dela As Word
Start Adc
Do
A = Getadc(1)
B = A
B = B / 890
B = B + 1
B = B * 161
Dela = B
Set Portd.0

For Count = 0 To Dela
Waitus 1
Next

Reset Portd.0
Waitus 18000

Loop

End[/align:6f924bf995]

هنوز منتظرم تا یک نفر کار با PWM و تایمر برا این برنامه با بیسکام رو توضیح بده!

ii998)

1nafar
06-03-2009, 12:29
سلام
اقا ببخشيد دير شد .
در مورد متغيير عيب از برنامه شماست ُ وبرنامه كامل كار ميكنه
در ضمن :
ظاهرا اين اخرين ورژن بسكام درست كار نميكنه ُ من برنامه با ورژن1.7.4 فول كامپايل كردم و بعد روي پروتوس ريختمش كامل جواب داد.
اگه مدار رو توي عمل تست ميكني از كريستال خارجي استفاده كن
در ضمن دستورات ناخير كاملا دقيق كار ميكنه اگه ميكرو روي كريستال خارجي تنظيم شده باشه .
كار هاي بالارو انجام بده اگه نشد بگو تا برنامه رو با تايمر و ... كنيم
بازم ببخشيد كه دير شد و منتظر موندين

REZA_KLNTR
06-03-2009, 13:17
پس یعنی دستور WAITUS متغیر پذیر است و نرم افزار بیسکام من ایراد دارد!

مدت زیادیه که دنبال ورژن سالم و کرک شده بیسکام میگردم ولی متاسفانه کسی لینک نمیده

حتی یک تاپیک هم برا این موضوع باز کردم دریغ از کمک

لطفا اگر ممکن است خواهشا یک لینک از نرم افزار سالم خودتون بزارید اینجا تا ببینیم چی میشه بالاخره

متشکر و ممنون

codev
06-03-2009, 14:30
آقای 1nafar شما یه بار لطف کنید توی help بسکامتون نگاه کنید ببینید توی قسمت remarks به صورت زیر هست یا نه :

You can see links before reply

بالا نوشته که مقدار ارسالی دستور باید یه ثابت باشه نه یه متغیر

REZA_KLNTR
06-03-2009, 16:51
codev آقا خوب اینو زودتر میگفتی تا ما هم تو help بیسکام ببینیمش!

حالا یک موضوعی : برا دستور waitms وقتی اون خط پایین رو ننوشته(This must be a constant. Not a variable!) یعنیکه دستور waitms متغیر میگیره درسته؟

codev
06-03-2009, 17:53
خب حتما اگه ننوشته یعنی متغیر می گیره .
من توی برنامه هام هم بهش متغیر دادم و کار می کنه و نوع متغیر هم نباید اعشاری باشه باید عدد صحیح باشه

REZA_KLNTR
06-03-2009, 19:20
خیلی ممنون دوست عزیز واقعا کمک بزرگی کردید

پس برای دقیق شدن برنامه باید از PWM یا تایمرها استفاده کنم چون این دستورها که بدرد نخوردند!

میتونید کمکم کنید؟


[align=left:997623e27e]
مثال برنامه نمونه برای تولید پالس یک هرتز متقارن
(نیم ثانیه صفر و نیم ثانیه پایه خروجی 1میشود ) :
فرکانس یک هرتز است پس طول موج: T=1/F = 1/1 = 1
و طول موج مثبت نصف کل موج است: T(+) = T/2 = 1/2 = 0.5

16000000 * 0.5
N = -------------------------- = 7812.5 =7813
1024

TIMER1= 65535 – 7812 = 57722
و برنامه:

regfile = "M8DEF.DAT $
crystal = 16000000 $
Config Portc = Output
Ddrc.0 = 1 : Portc.0 = 0
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer1
Enable Ovf1
On Timer1 Lable
Timer1 = 57722 : شمارش ابتدای برنامه Start Timer1
Do
Loop
End
وقتی برنامه به اینجا رسید دیگر تو همین LABLE میچرخد با این شمارش(57722) که میتواند با شمارش بالا متفاوت باشد :
Lable:
خروجی پورت0 معکوس میشود: Toggle Portc.0
Timer1 = 57722
Start Timer1
Return[/align:997623e27e]


خوب این محاسبات تولید یک هرتز هست حالا میخوام بشه 50 هرتز که کاری نداره ولی نمیخوام متقارن باشه و میخوام نیم سیکل 1 منطقی رو از 1 تا 2 میلی ثانیه کنترل کنم

چکار باید انجام داد؟؟؟؟؟!! :k01:

1nafar
08-03-2009, 17:58
سلام
درسته اقای codev دستور waitus مقدار نمیگیره ، منظور من دستور Waitms بود که اقای bozonghare گفته بودند کار نمیکرد . aa) aa) aa)

با pwm نمیشه این کار رو انجام داد .
شما گفتید یه برنامه میخواید که فرکانسش ثابت باشه (50 هرتز ) و بشه طول نیم سیکل مثبت

اون رو مقداری تغییر داد .

pwm رو میشه روی یه فرکانس ثابت تنظیم کرد ، ولی اگه شما بخوایید طول قسمت مثبت رو زیاد کنید از طول قسمت منفی کم میشه (فقط میشه دیتونی سایکل رو تغییر داد )
همین دستور waitus رو میشه با برنامه زیر راش انداخت ( با استفاده از حلقه )
$regfile = "m8def.dat"
$crystal = 16000000

Config Lcdpin = Pin , Db4 = Pinb.3 , Db5 = Pinb.2 , Db6 = Pinb.1 , Db7 = Pinb.0 , E = Pinb.4 , Rs = Pinb.5
Config Lcd = 16 * 2 : Cursor Off : Cls
Config Single = Scientific , Digits = 2
Config Portd = Output
Dim A As Word
Dim V2 As Single
Dim V3 As Single
Dim C As Single
Dim B As Single
Config Adc = Single , Prescaler = Auto , Reference = Avcc



Start Adc
Do
A = Getadc(1)
B = A
B = B * 10
Set Portd.0
For C = 1 To B Step 1
Waitus 2
Next
Reset Portd.0
Waitus 18000
Locate 1 , 1
Lcd "T=" ; B ; " U.SEC"
Loop
End
این توی پروتوس برای من جواب میده
خود دستورات هم یه مقداری اتلاف وقت دارن ، توی avr هر دستور توی یه سیکل انجام میشه (البته یه تعداد معدود توی دو تا سیکل ) هر سیکل با کریستال 16 مگا هرتز تقریبا 65.5 نانو ثانیه طول میکشه ، این رو هم توجه کن که دستورات زیاد باعث میشه همه چیز به هم بریزه

REZA_KLNTR
08-03-2009, 20:00
خوب مسئله ای نیست مدیر جان باید وقتی که به مقدار نیم سیکل مثبت اضافه میشه ، از نیم سیکل منفی کم بشه تا فرکانس ثابت بمونه!

خوب نیم سیکل مثبت از 1 تا 2 میلی ثانیه تغییر میکنه و نیم سیکل منفی از 18 تا 19 میلی ثانیه دقیقا بر عکس هم و طوریکه جمعشون تو هر زمان میشند 20 میلی ثانیه منم همینطوری میخوام دیگه و با استفاده از pwm و یا تایمر!

در ضمن برنامه در هنگام کامپایل از خط : Config Single = Scientific , Digits = 2

دو تا ایراد میگیره و کامپایل نمیشه!

1nafar
08-03-2009, 20:11
سلام
شما مگه از کدوم ورژن از بسکام استفاده میکنید ، برنامه رو با 1,11,9, کامپایل کنید ، من توی پروتوس چک کردم کامل جواب داد ، برنامه ای رو که میخوایی توی چند پست قبل گذاشتم

REZA_KLNTR
09-03-2009, 03:12
من با بیسکام 1.11.8.1 تست کردم ممکنه لینک دانلود ورژن خودتونو بدید البته با کرکش؟

1nafar
09-03-2009, 07:04
سلام
اینم لینک دانلود بسکام فول
You can see links before reply-495
این نرم افزار بدون نیاز به کرک و ... هست و کاملا درست کار میکنه (من که چیزی ازش ندیدم)

REZA_KLNTR
09-03-2009, 13:50
لینک دانلود سایت مورد نظر خرابه !

لینک دیگری ندارید؟

ممنون

1nafar
09-03-2009, 14:08
سلام
You can see links before reply

REZA_KLNTR
09-03-2009, 18:08
ممنون 1NAFAR جان ولی من میخوام با تایمر و PWM یاد بگیرم این موج و فرکانس رو بسازم!!!!!

ممکنه تو همین مثال من استفاده از تایمر رو نشون بدی؟؟


ممنون