برنامه 480 خط بیشتر نیست ولی فایل هگز 16 کیلوبایت شده . تو میکرو مگا8 جا میشه؟
بفرما اینم برنامه بدون LCD و خیلی کوتاه بازم کار نمیکنه(نه سروو میچرخه و نه تو اسکوپ نشون میده): چرا؟؟
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd = Output
Dim A As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Do
A = Getadc(1)
A = A + 1000
Set Portd.0
Waitus A
Reset Portd.0
Waitus 18000
Loop
End
این خط خودش به اندازه کل حلقه طول می کشه .
منظورت چیه اگه ایرادی میبینی خوب رفعش کن تا درست کار کنه!!!؟؟
مشکل اینه که دستور WAIT درست کار نمیکنه!
دستور Wait درست کار می کنه در صورتی که فرکانس کریستال رو درست وارد کرده باشی . ( فیوز بیت ها فراموش نشه )
من پیشنهاد می کنم اول برنامه یه بار مقدار AGC رو بخون و تو برنامه دیگه نخون و اینطوری امتحان کن .
کد php:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd = Output
Dim A As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
A = Getadc(1)
A = A + 1000
Do
Set Portd.0
Waitus A
Reset Portd.0
Waitus 18000
Loop
End
اینم امتحان کردم کار نمیکنه یعنی هم سروو رو 90- باقی میمونه مثل قبل و هم تو اسکوپ تاخیر 1000 میکرو رو نمیبینی!
خوب شما هم یبار امتحان کن شاید پروتئوس من مشکل داره این تصویر مدار(همونطور که تو تصویر میبینی نیم سیکل مثبت بصورت یک خط عموده و بازه ای نداره
http://www.dehcadeh.com/upload/images/88...hvg6lf.jpg
مهندس من نفهمیدم چرا از توابع آماده بسکام استفاده نمی کنی ؟؟
تایم دیویژنت هم زیاده .
و بهتر نیست برای زمان بندیت از تایمر استفاده کنی حالا که می گی waitus مشکل داره .
البته شاید دستور waitus از نوع 8 بیتی باشه و حداکثر بشه 255 رو بهش داد. ( البته بعید می دونم اینطوری باشه ) .
این برنامه رو هم یه تست کن :
کد php:
$regfile = "m8def.dat" : $crystal = 8000000
Config Timer1 = Timer , Prescale = 64
Enable Interrupts : Enable Timer1 : On Timer1 Ant : Stop Timer1
Dim A As Word , B As Word
Config Adc = Single , Prescaler = Auto
Ddrd = 255
Gosub Ant : Start Timer1
Do
Set Portd.0
Waitms A
Reset Portd.0
Waitms B
Loop
Ant:
Start Adc : A = Getadc(1) : Stop Adc
A = A / 20 : B = 50 - A
Return
بله خوب شد گفتین میکروثانیش از نوع 8 بیتیه ولی میلی ثانیش از نوع 16 بیتی.
ولی اگه از تایمر استفاده بشه باز همون تأخیر وسط برنامه پیش میاد اینبار دیگه سرعت غر یکنواخت میشه چون تایمر هر جا که دلش خواست اجرای برنامه رو قطع میکنه.
اگه بخواین دائم سرعتو عوضش کنین چاره ای نیست و باید دائماً مقدار گیری کنید و این وقت میبره ولی اگه بخواین سرعت قابل تنظیم باشه ولی در طول برنامه یک روند ثابتیو طی کنه همون ADC بهترین پیشنهاده.
ببینم نمیشه زمانهای بزرگتری به موتورتون بدین (در حد چند ده میلی ثانیه) ؟
آقا تریب
ممکنه درباره برنامت توضیح بدی من که هرچی تفکر کردم متوجه نشدم Ddrd = 255 ؟؟؟
Start Adc : A = Getadc(1) : Stop Adc
A = A / 20 : B = 50 - A
اینا برا چیند
و این برنامه رو هم تست کردم جواب نداد
یعنی اون تغییر 1 تا 2 میلی ثانیه رو نداشت و اصلا سیکل قسمت مثبت کلا نداشت چه برسه به 1 میلی ثانیه!!!
آقا ILGAR چرا دستور WAITMS اعداد اعشاریرو قبول نمیکنه اگه 1 تا 2 رو قبول میکرد همه چی حل بود مثلا در برنامه زیر تا 1.5 رو همون 1 میگیره و از 1.6 تا 2 رو میپره به 2 و 2 قبول میکنه !!!:حتی A رو تو متغیر دیگری که SINGLE باشه ریختم که اعشاری بپذیره ولی مشکل از دستور WAITMS بود (پایین توضیح دادم چطور معلوم شد)
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd = Output
Dim A As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Do
A = Getadc(1)
A = A / 1024
A = A + 1
Set Portd.0
Waitms A
Reset Portd.0
Waitms 18
Loop
End
اصلا نیازی هم به برنامه نیست میتوان با دادن عدد 1.5 یه دستور WAITMS تو خروجی با اسکوپ دید که تغییری نمیکنه! راستی چرا؟
اون Ddrd = 255 یعنی پورت د خروجی .
و برنامه قبلی یه فرکانس 50 هرتز درست می کرد با ضریب مدلاسیونی که توسط پتانسیومتر تنظیم می شد .
اون ضرب و تقسیم هم واسه همینه .
برنامه قبلی درسته و فقط سیکل کاریش 50 هرتز هستش .
-------------------------------------------------------------------
و مهندس تو این برنامه من هیچ ایرادی نمی بینم و مدت زمان یک بودن خروجی بین 1 تا 2 میلی ثانیه توسط پتانسیومرتری که به پایه 28 میکرو وصله قابل تنظیمه . کریستال میکرو هم فراموش نشه رو یک مگ بذاری .
کل سیکل هر پالس نیز 20 میلی ثانیه هست . یعنی زمان صفر بودن خروجی بسته به پتانسیومتر بین 18 تا 19 میلی ثانیه هستش . ( پایه های رفرنس آنالوگ میکرو هم فراموش نشه - پایه های 20 و 21 به 5 ولت و 22 به زمین )
تقریبا هر 4 ثانیه هم موقیعت پتانسیومتر خونده می شه . ( پایه 28 میکرو . ADC5 )
از هر پایه پورت d هم می توان به عنوان خروجی استفاده کرد .
کد php:
$regfile = "m8def.dat" : $crystal = 1000000
Dim A As Byte , B As Byte , C As Word
Config Adc = Single , Prescaler = Auto
Config Timer1 = Timer , Prescale = 64
Enable Interrupts : Enable Timer1 : On Timer1 Ant : Start Timer1
Ddrd = 255 : Gosub Ant
Do
Set Portd : Waitms 1
Waitus A : Waitus A : Waitus A : Waitus A
Reset Portd : Waitms 18
Waitus B : Waitus B : Waitus B : Waitus B
Loop
Ant:
Start Adc : C = Getadc(5) : Stop Adc
C = C / 4 : A = C : B = 255 - A
Return
تریپ جان برنامه شما اینطوریکه دیده میشه کاملا درسته و باید کار کنه ولی مسئله اینکه دستور WAITUS اصلا متغیر نمیپذیره! نمیدونم تو پروتئوس من این مشکل هست یا کلیه! برنامه شما به کنار برنامه پایین ریختن مقدار متغیر B که مقدارشم از 255 کوچکتر هست ، ثابت و بدون ADC ، کار نمیکنه!! ولی اگر مستقیم به WAITUS عدد بدیم اونوقت کار میکنه! حتی اگر 1000 هم مستقیم بدیم میپذیره و کار میکنه ولی متغیر نمیگیره چرا؟؟
$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 B As Single
Do
B = 100
Set Portd.0
Waitus B
Reset Portd.0
Waitus 18000
Loop
End
نمی دونم
فکر نمی کنید عیب از کامپایلر باشه .
بسکامتون ورژن چنده .