با سلام خدمت اساتيد محترم .من ميخوام دو پايه رو بصورت مداوم چک کنم مثلا با کانتر يا مثلا روش افزايش و کاهش مقدار متغيرر(incr,decr) يعني مثلا اگر پايه اول 10 بار صفر ميشه اين مقدار توي يک متغيير ريخته بشه و پايه ديگر هم همينطور چک بشه و اگر تعداد صفر شدن اين دو پايه برابر شد حالا يک کاري انجام بده. فقط ميخوام اين کار به صورت مداوم انجام بشه .ممنون ميشم در برنامه نويسيش با بسکام کمکم کنيد .
سلام دوسته من به ایران ویج خوش اومدی.
این کارو میتونی با کانتر انجام بدی.
که من هم برنامه رو واست نوشتم و هم فایل شبیه سازشو واست قرار دادم.
هر دو شونم واست پیوست کردم که دانلود کنی.
میکرو استفاده شده در این پروژه Atmega128 هستش و برنامه هم به زبان بیسیک نوشته شده.
این از برنامه:
کد:
$regfile = "m128def.dat" : $crystal = 8000000
Config Lcdpin = Pin , Db7 = Portd.0 , Db6 = Portd.1 , Db5 = Portd.5 , Db4 = Portd.4 , E = Portd.3 , Rs = Portd.2 : Config Lcd = 16 * 2
Config Timer1 = Counter , Edge = Falling : Config Timer2 = Counter , Edge = Falling
Cursor Off : Cls : Lcd "Www.IranLED.Com" : Locate 2 , 1 : Lcd "h.unique" : Wait 1 : Cls
Counter1 = 1 : Counter2 = 3
S:
Cls
Do : Locate 1 , 1 : Lcd "Counter1:" ; Counter1 ; " " : Locate 2 , 1 : Lcd "Counter2:" ; Counter2 ; " "
If Counter1 = Counter2 Then : Goto P : End If : Loop
P:
Cls
Lcd "2ta paye barabar shodan"
Do : If Counter1 > Counter2 Or Counter1 < Counter2 Then : Goto S : End If : Loop
End 'end program
این از شبیه ساز:
اگه سوالی بود میتونی مطرح کنی من در خدمتت هستم.
موفق باشی...
با سلام و تشکر بسیار زیاد از شما بخاطر کمک بسیار بزرگتون . فقط چند سوال
یکی اینکه چرا مقدار اولیه هر دو تایمر رو صفر قرار ندادید یا مثلا برار با هم ؟
دوم اینکه چرا اون چند پایه رو به هم وصل کردید ؟ دلیلش اینکه پایه سوئیچ ها با به پایه t0 و t1 وصل بشه ؟یعنی حتما باید به این دو پایه وصل بشه تا شمرده بشه؟ داخلی نمیشه تعریف کرد ؟
سوم اینکه راستش من میخوام مدار 24 ساعته کار کنه جای شنیدم که مثلا بعد از هر 20 یا 100 بار شمردن یک بار watch dog کنیم که البته برنامه ریست میشه و باید قبلش مقدار متغییر ها رو توی eeeprom بریزیم و بعد دوباره بخونیمش .نظر شما برای حل کردن مشکل هنگ کردن چیه ؟ خیلی ممنون
نقل قول: چرا مقدار اولیه هر دو تایمر رو صفر قرار ندادید یا مثلا برار با هم ؟
خب بنظر شما اگه هر دوتا کانتر 0 باشد باهم برابر نیستن؟البته میشه درستش کرد و مقدار جفتشونو 0 هم قرار داد.اگه خواستی تا این کارو انجام بدم؟
نقل قول: چرا اون چند پایه رو به هم وصل کردید ؟ دلیلش اینکه پایه سوئیچ ها با به پایه t0 و t1 وصل بشه ؟یعنی حتما باید به این دو پایه وصل بشه تا شمرده بشه؟ داخلی نمیشه تعریف کرد ؟
کدوم پایه هارو بهم وصل کردم؟وقتی تایمر/کانتر رو در مود کانتر تعریف کنیم پایه های T1,T2,T3 و... رو باید به کلید ها وصل کنیم.مثلا ما کانتر1 رو تعریف کردیم باید کلید رو به پایه T1 وصل کنیم.
نقل قول: سوم اینکه راستش من میخوام مدار 24 ساعته کار کنه جای شنیدم که مثلا بعد از هر 20 یا 100 بار شمردن یک بار watch dog کنیم که البته برنامه ریست میشه و باید قبلش مقدار متغییر ها رو توی eeeprom بریزیم و بعد دوباره بخونیمش .نظر شما برای حل کردن مشکل هنگ کردن چیه ؟ خیلی ممنون
شما اگه مدارت رو درست ببندی هیچ مشکلی پیش نمیاد.به Watch Dog هم نیازی نیس.بعدشم تنها راه واسه نگهداری اطلاعات بعده ریست شدن یا خاموش شدن میکرو استفاده از حافظه EEPROM هستش.به این صورت که هر یک مدت یکبار اطلاعات ذخیره شه و بعده اینکه ریست شد اون اطلاعات رو برگردونیم.
موفق باشید.....
با تشکر بسیار از شما .در مورد مساوی بودن مقدار تایمرها حرفتون کاملا درسته. راستش دلیل من برای اینکه هر دو تایمر مقدار اولیشون برار باشه بخاطر این هست که میخوام برای هوشمند سازی پارکینگ که در تاپیک زیر توضیح دادم ایم برنامه رو استفاده کنم .
http://www.iranled.com/forum/thread-24198-page-2.html
.ببینید من میخوام یک تونل یا رمپ که جای یک ماشین داره در دو طرف چراغ راهنما بزارم ولی در تونل ها روش زمانی استفاده میشه که راحته ولی واسه یک پارکینگ چند طبقه نمیشه این کارو کرد .در هر حال میخوام در دو طرف رمپ (یا تونل) سنسور باشه که هر کدوم زودتر حس شد اجازه عبور بده و طرف مقابل قرمز بشه تا زمانی که ااین ماشین اول از رمپ یا تونل رد بشه ,خوب اینم خیلی مشکل نیست ولی سوال اینجاست که این ماشین اول که عبور کرد ممکنه هنوز تونل رو تموم نکره یک یا چند ماشین دیگه پشتش بیان خوب اینجا بنظرم باید شمورد چنتا ماشین رد شدن از سنسور اول (یا ورودی) تا بگیم سنسور دوم (یا خروجی) منتظر تحریک شدن به اندازه تعداد اون چنتا ماشین باشه و وقتی همه رد شدند چراغ راهنما طرف دوم رو از قرمز به سبز تغییر بده.
دوستمون یک فایل پروتئوس و برنامه برام قرار دادند که البته فقط با زدن هر کلید چراغ طرف مقابل رو قرمز میکنه و بلعکس اگر ممکنه هست شما در این برنامه کانتر رو جای بدید طوری که این هدف برآورده بشه البته میدونم باز باگهای زیادی داره ولی خوب فکر کنم بهتره اول یک بیس باشه بعد باگهارو برطرف کنیم .بسیار ممنون
(۲۶-مرداد-۱۳۹۱, ۱۴:۰۰:۴۱)parham144 نوشته است: [ -> ]با سلام خدمت اساتيد محترم .من ميخوام دو پايه رو بصورت مداوم چک کنم مثلا با کانتر يا مثلا روش افزايش و کاهش مقدار متغيرر(incr,decr) يعني مثلا اگر پايه اول 10 بار صفر ميشه اين مقدار توي يک متغيير ريخته بشه و پايه ديگر هم همينطور چک بشه و اگر تعداد صفر شدن اين دو پايه برابر شد حالا يک کاري انجام بده. فقط ميخوام اين کار به صورت مداوم انجام بشه .ممنون ميشم در برنامه نويسيش با بسکام کمکم کنيد .
اگر فقط دو پایه رو می خوای چک کنی می تونی از INT0و INT1 استفاده کنی در غیر اینصورت با ید ترفند خاصی بزنی. یه متغیر از نوع بایت تعریف کن (مثلا X ) و بیت های x را مساوی پایه مورد نظر قرار بده.
x.0=pinb0
x.1=pind.0
x.2=pinc.0
...
حالا کافی هر چند میلی ثانیه x را بررسی کنی و به ازای هر مقدار یه عددی را افزایش دهی...
سلام.
دوسته من این همون چیزی که شما میخوای.
با این برنامه میشه در روز تعداد 4294901760 ماشین رو شمرد.
اگه بازم مشکلی بود یا سوالی بود و یا ... میتونی مطرح کنی.
راستی الان دیگه وقت نداشتم که واست تابعی بونویسم که وقتی میکرو ریست میشه یا خاموش میشه اطلاعات از دست نره.ایشالله اونو دیگه خودت انجام بده یا اگه عجله ندار یه مدتی باید صبر کنی...
(هر دوشونو پیوست کردم)
این برنامه:
کد:
$regfile = "m128def.dat" : $crystal = 8000000
Config Lcdpin = Pin , Db7 = Portd.5 , Db6 = Portd.4 , Db5 = Portd.3 , Db4 = Portd.2 , E = Portd.1 , Rs = Portd.0 : Config Lcd = 20 * 4
Config Timer1 = Counter , Edge = Falling : Config Timer3 = Counter , Edge = Falling
Config Pinc.7 = Input : Config Porte.0 = Output : Config Porte.1 = Output : Config Ping.4 = Input : Config Portb.0 = Output : Config Portb.1 = Output
K1 Alias Ping.4 : Sabz1 Alias Porte.0 : Ghermez1 Alias Porte.1 : K2 Alias Pinc.7 : Ghermez2 Alias Portb.0 : Sabz2 Alias Portb.1
Dim K As Bit
Dim A As Word , B As Word
Dim Aa As Single , Bb As Single
Dim S As String * 5
S = Space(5)
Cursor Off : Cls : Lcd "Www.IranLED.Com" : Locate 2 , 1 : Lcd "h.unique"
Enable Interrupts : Enable Ovf1 : Enable Ovf3
On Counter1 C1 : On Counter3 C2
Set Sabz1 : Reset Ghermez1 : Set Sabz2 : Reset Ghermez2 : Waitms 200
Do
If K1 = 0 Then : Set Sabz1 : Reset Ghermez1 : Set Sabz2 : Reset Ghermez2 : K = 0 : End If
If K2 = 0 Then : Reset Sabz1 : Set Ghermez1 : Reset Sabz2 : Set Ghermez2 : K = 1 : End If
Aa = A * 65535 : Aa = Aa + Counter1
Bb = B * 65535 : Bb = Bb + Counter3
If Counter1 = Counter3 And Counter1 > 0 And Counter3 > 0 Then : Locate 3 , 1 : Lcd Counter1 ; "Mashin" : End If
If Counter1 > Counter3 Then : Locate 4 , 1 : Lcd "1mashin dakhel shod" ; S : End If
If Counter1 = Counter3 And K = 0 Then : : Locate 4 , 1 : Lcd "1mashin kharej shod" ; S : End If
Loop
End 'end program
C1:
Incr A : Return
C2:
Incr B : Return
این از سیمولیشن:
موفق باشی....
h.unique عزیز خیلی خیلی ازتون ممنونم واقعا لطف کردید.
.
فقط یک نکته اونم اینکه اینطوری که من دیدم وقتی یک سوئیچ رو میزنیم ماشین ها رو نمشموره یعنی مثلا هر بار که یک سوئیچ رو میزنیم باید بنویسه 1 ماشین وارد شد بعد اگر یک بار دیگه همون سوئیچ رو زدیم بنویسه 2 ماشین وارد شد و بهمین ترتیب و در خروجی هم مثلا با زدن دو بار سوئیچ بگه 2 ماشین خارج شد و اگر تعداد ورود و خروج برار باشه میفهمه ماشین ها به طور کامل خارج شدند و چراغ هر دو طرف رو سبز میکنه و در مورد چراغ ها هم وقتی یک ورودی تحریک شد باید چراغ مربوط به خودش سبز و چراغ روبرو قرمز بشه. واون تابع رو هم خودم سعس میکنم بنویسم اگرم شما هر وقت تونستید بنویسید ممنون میشم.
این دیگه فک کنم کارتو راه بندازه.
من الان خونه نیستم رفتم بیرون تفریح.اگه برنامه مشکلی داشت بگو تادرستش کنم.
ین برنامه همه ی قابلیت های برنامه قبلی رو داره ولی یکویژگی جدید رو هم داره اونم اینه که اگه تعدادماشین های خارج شده بیشتر از مقداروارد شده باشه اخطار میده.
برنامه + فایل شبیه ساز روهر دورو پیوست کردم.
این برنامه:
کد:
$regfile = "m128def.dat" : $crystal = 8000000
Config Lcdpin = Pin , Db7 = Portd.5 , Db6 = Portd.4 , Db5 = Portd.3 , Db4 = Portd.2 , E = Portd.1 , Rs = Portd.0 : Config Lcd = 20 * 4
Config Timer1 = Counter , Edge = Falling : Config Timer3 = Counter , Edge = Falling
Config Pinc.7 = Input : Config Porte.0 = Output : Config Porte.1 = Output : Config Ping.4 = Input : Config Portb.0 = Output : Config Portb.1 = Output
K1 Alias Ping.4 : Sabz1 Alias Porte.0 : Ghermez1 Alias Porte.1 : K2 Alias Pinc.7 : Ghermez2 Alias Portb.0 : Sabz2 Alias Portb.1
Dim A As Word , B As Word
Dim Aa As Single , Bb As Single
Dim S As String * 5
S = Space(5)
Cursor Off : Cls : Lcd "Www.IranLED.Com" : Locate 2 , 1 : Lcd "h.unique"
Enable Interrupts : Enable Ovf1 : Enable Ovf3
On Counter1 C1 : On Counter3 C2
Set Sabz1 : Reset Ghermez1 : Set Sabz2 : Reset Ghermez2
Do
Locate 3 , 1 : Lcd Counter1 ; "mashin dakhel shod" ; S
Locate 4 , 1 : Lcd Counter3 ; "mashin kharej shod" ; S
If K1 = 0 Then : Reset Sabz1 : Set Ghermez1 : Set Sabz2 : Reset Ghermez2 : End If : If K2 = 0 Then : Set Sabz1 : Reset Ghermez1 : _
Reset Sabz2 : Set Ghermez2 : End If
If Counter1 = Counter3 And Counter1 > 0 And Counter3 > 0 Then : Locate 1 , 1 : Lcd "Hameye Mashin Ha " : Locate 2 , 1 : Lcd "kharej SHodan" : _
Set Sabz1 : Reset Ghermez1 : Set Sabz2 : Reset Ghermez2 : End If
If Counter1 < Counter3 Then : Locate 1 , 1 : Lcd "Danger!!!!" ; S ; S : Locate 2 , 1 : Lcd "taghlob" ; S ; S : End If
Aa = A * 65535 : Aa = Aa + Counter1
Bb = B * 65535 : Bb = Bb + Counter3
Loop
End 'end program
C1:
Incr A : Return
C2:
Incr B : Return
اینم شبیه ساز:
موفق باشی عزیز...
واقعا ممنون خیلی خیلی خوب بود .فقط یه چیزی به نظرم رسید فکر کنم بهتره مثلا 5 تا ماشین که رد شد نوبت رو اتومات بده به طرف مقابل البته اگر طرف مقابل ماشین باشه یعنی هر 5 بار که ماشین میره اونطرف رو چک کنه اگر 1 بود یعنی کسی منتظر بود نوبت رو بده به اون ولی تا چه زمانی ؟فکر کنم مثلا باید بگم تل 3 بار هم اینور میتونه رد بشه ولی خوب اگر فقط یک ماشین رد شد چی؟ فکر کنم باید یه تایمر هم گذاشت که اون 3 تا اجازه داشته باش ولی یه زمانم تعیین بشه مثلا اگر در 10 ثانیه بیشتر طول کشید و به 3 تا ماشین نرسید دوباره اتومات نوبت رو بده به طرف مقابل .
دوسته عزیزم این دیگه کمک نیست انجام دادن پروژه هستش.
از همون اول میگفتین که این پروژه رو واسم انجام بدین.
خودتون این کارو انجام بدین اگه به مشکلی بر خوردین تشریف بیارین اینجا و مشکلتونو مطرح کنید تا به کمک دوستان صاحب نظر اونو حل کنیم.
موفق باشید....