ايران ويج

نسخه‌ی کامل: سوال در مورد نوشتن برنامه
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام خدمت همه دوستان و سروران
من همونطوریکه قبلا گفتم تازه با ای وی آر آشنا شدم و توی این مدت تقریبا یک هفته ای شروع کردم به آموختن برنامه نویسی که چند تا برنامه ساده چشمک زن و این جور چیز ها هم نوشتم که توی پروتئوس وقتی شبیه سازی کردم خوب کار کرد.
سوالی که دارم اینه:
من میخوام اتمگا 8 یکی از پین های خودش رو زیر نظر بگیره و وقتی اون پایه set یا 1 شد، یکی از پایه های دیگر خود رو set یا 1 بکنه و بر عکس، برنامش هم نوشتم که اینطوری میشه:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portb.0 = Input
Config Portd.0 = Output
Bitwait Pinb.0 , Set
Set Portd.0
Bitwait Pinb.0 , Reset
Reset Portd.0
End
و همینطوری که اون پایه رو تحت نظر داره میخوام این برنامه رو که در زمانهای مختلف هی بعضی از پایه ها رو 1 و 0 میکنه رو انجام بده. یعنی دو برنامه رو بطور همزمان و جدا از هم!
سوال اینه که آیا میتونم این کار رو بکنم و اگر میتونم لطفا بگید چطوری؟
برنامه ای که گفتم اینه:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Do
Waitms 5
Set Portd.0
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 300
Reset Portd.0
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 300
Loop
End
و سوال آخر اینکه من چطوری زمان تاخیر رو بدم؟ یعنی وقتی مینویسم wait 60 یعنی 60 ثانیه تاخیر انجام بده، ولی فکر میکنم بستگی به فرکانس میکرو هم داره ، درسته؟ یعنی من اگه بخوام تاخیر 60 ثانیه ای انجام بشه در این فرکانس و این برنامه باید چی بنویسم؟
ببخشید سوال هام زیاد شدند. امیدوارم کمکم کنید.
با تشکر
سلام.
اون برنامه اولت رو ببر تو وقفه بزار برنامه دوم هم که توی main برنامه کار میکنه.
یعنی توی برنامه اصلی اون برنامه دوم داره هی پورتها رو 0 و 1 میکنه و هر موقع وقفه ای یعنی همون 0و1 به پایه وقفه اعمال بشه برنامه اولت هم کار میکنه.
/-------------------------------------------
با کریستال 1 داخلی تقریبا 60 ثانیه با کمی اشتباه صبر میکنه.
اولا تاخیر تو کجای برنامه؟
سلام ممنون
اصلا نفهمیدم چی گفتی!! من تازه شروع کردم به آموختن برنامه نویسی و خیلی وارد نیستم.
میشه خودت زحمتش رو بکشی؟
در مورد تاخیر هم هر جا که دستور تاخیر رو دادم دیگه، یعنی هرجا که نوشتم wait که البته برای تست با پروتئوس مجبور شدم زمانها رو میلی ثانیه کنم ! ولی بعد از اطمینان از عملکردش ms ها رو پاک خواهم کرد.
با تشکر
اوکی.
ببین برنامه اول میره تو وقفه
مثلا وقفه 0 رو فعال کن حالا از هر نوع لبه بالا رونده یا پایین رونده با لو لول low lwvel بعد توی روتین وقفه 0 بنویس که هر کاری خواستی انجام بدی.
تو مین اصلی هم برنامه ئوم رو بزار.
اگه اینها رو تا حالا نشنیدی تو هلپه بیسکام همشو میبینی و همون طوری عمل کن سوال داشتی بگو.
نه ، اصلا متوجه نشدم، یعنی این اصطلاحات رو اصلا نشنیدم!!
یعنی چی بنویسم؟ یه نمونه ای چیزی اگه باشه زیاد کمک میکنه، اگر هم که خودت برام درستش کنی که ممنونت میشم البته اگه زحمتی نباشه. هم یاد میگیرم و هم کارم راه میافته.
ممنون
در ضمن برنامه اصلی دوم از شروع تا وقتی به end برسه تقریبا 24 ساعت طول میکشه، مشکلی که پیش نمیاد؟
به جان جفتمون درگیر یه پروژه خودم هستم.
نگاه:
اول برنامه
Config Int0 = Low Level
Enable Interrupts
Config Pind.2 = Input
Enable Int0
On Int0 Int0_r
تا وقفه 0 فعال بشه این یعنی هر موقع یه حالت لو پیش بیاد عملکرد برنامه اصلی متوقف و به زیر برنامه وقفه میره و دستورات اجرا میشه سپس return بازگشت میکنه به برنامه اصلی(همون برنامه دومت9)
اینم زیر برنامه وقفه
int0_r:
Set Portd.0
return
تو شروع کن کدتو بنویش بعد تست کن اگه مشکل داشتی بگو.
نه کاملا هنگ کردم!
به نظرم بهتره یکم بیشتر مطالعه کنم چون چیز هایی هم که بلد بود از یادم رفتند!!
مشکل اینه که اصلا نمی دونم چی داری میگی!! کار با کپی پیست کردن این عبارت حله؟ یا این تنها یک نمونست؟
از بقیه دوستان اگر کسی وقت داره لطف کنه کار منو راه بندازه ممنونش میشم. اینقدر این موضوع ذهنم رو درگیر خودش کرده که از درس و زندگی موندم هی دارم کتاب های آموزش avr میخونم به جایی هم نمیرسم!!
داداش دوباره ازت خواهش میکنم تو که میتونی کمکم کن!( پر رویی رو حال میکنی!!! )
دوباره ممنون
دوباره سلام
من برنامه رو اینطوری نوشتم که در این حالت میکرو تا زمانی که پین ورودیش 1 نشه کل برنامه رو شروع نمیکنه!!!!
بعد هم که 1 شد بلافاصله خروجی رو 1 میکنه و برنامه دوم هم شروع میشه، ولی دوباره که پین ورودی 1 میشه خروجی مربوطه 1 نمیشه!!!
لطفا کمک کن

$regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Config Int0 = Low Level
Enable Interrupts
Config Pinb.0 = Input
Bitwait Pinb.0 , Set
Set Portd.4
Bitwait Pinb.0 , Reset
Reset Portd.4
Enable Int0
On Int0 Int0_r
'********************main******************
Do
Waitms 5
Set Portd.0
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 300
Reset Portd.0
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2
Waitms 300
Reset Portd.2
Waitms 300
Loop
Int0_r:
return
End
ببین
:
کد:
regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Config Int0 = change
Enable Interrupts
Enable Int0
On Int0 Int0_r
Config Pind.2 = Input

Do
Waitms 5
Set Portd.0
Waitms 3600
Set Portd.3
Waitms 1800
Reset Portd.3
Set Portd.1
Waitms 600
Reset Portd.1
Set Portd.2

loop
int0_r:
if pind.2=1 then Set Portd.4
if Pin2.0=0 then Reset Portd.4
return
انقدر این برنامه بلند رو نزار تو پست داریم 1 کیلومتر اسکرول میکنیم
ببین دیگه باید اون پایه pinb.0 رو عوض کنی به پایه وقفه0 یعنی pind.2 وصل کنی.
با سلام
دوست عزیز دستور bitwait که نوشتی میکرو را تو همون خط نگه می داره پس تا وقتی که وضعیت پایه عوض نشه از اون خط خارج نمی شه
برای ایجاد دو کار همزمان طبق گفته دوستمون یا باید از وقفه استفاده کنی و یا با تکنیک های برنامه نویسی این کار رو بکنی که( البته فکر نکنم نوع دومش کار شما باشه)
و اینکه شما چرا از دستور شرطی استفاده نمی کنی و برای کم کردن مقدار تاخیر چرا از یک متغیر استفاده نمی کنی ؟ حافظه میکرو را شما با دستور ست و ریست خیلی اشغال می کنید و من سوالی که داشتم اینکه آیا شما دارید مدار فلاشر درست می کنید ؟ اگه فلاشر طراحی می کنید پیشنهاد من کمی مطالعه بیشتر در مورد برنامه نویسی هستش شما با دستوراتی مثل for و if و shift خیلی کارا می تونید بکنید تا فقط set و reset
موفق باشید






داداش دمت گرم، یعنی با این برنامه دیگه حله؟
بخاطر گذاشتن اون برنامه طویل!!! هم عذر میخوام.
خدمت آقا رضا هم عارض باشم که نه، فلاشر نیست، دستگاهیه مثل تایمر که توی سالن پرورش قارچ کاربرد داره که هی دستگاهی رو روشن یا خاموش میکنه.
ممنون بابت کمک هاتون.
نمیگم حله باید تستش کنی داداش.
راستی این برنامه دقیقا چه میکند؟
بگو تا ببینیم چه جوری بهتر میشه نوشتش.
صفحه‌ها: 1 2