تایمر مقدار ثابتی داره؟ یعنی چی؟
ببین هر یک میلی ثانیه وقفه تایمر اتفاق می افته و هر بار یکی به مقدار count اضافه میشه . اگه ایم مقداربه 1000 رسید یعنی یک ثانیه رد شده و مقدار متغیرsecond یکی زیاد میشه . اگه این مقدار با مقدار عدد وارد شده (B) یکی شد استپر موتور متوقف میشه .
تایمر مقدار ثابتی داره؟ یعنی چی؟
ببین هر یک میلی ثانیه وقفه تایمر اتفاق می افته و هر بار یکی به مقدار count اضافه میشه . اگه ایم مقداربه 1000 رسید یعنی یک ثانیه رد شده و مقدار متغیرsecond یکی زیاد میشه . اگه این مقدار با مقدار عدد وارد شده (B) یکی شد استپر موتور متوقف میشه .
اقا حامد هر مقداری می دی 135 درجه می چرخه و تقوقف می کنه .
این برنامه رو امتحان کن ببین رو LCD زمانی که موتور شروع به کار می کنه چه زمانی نشون میده :
$regfile = "m32def.dat"
$crystal = 8000000
Enable Interrupts
On Timer1 Timer_int
Stop Timer1
Config Timer1 = Timer , Prescale = 8
Config Kbd = Portb , Delay = 200 , Debounce = 100
Config Portd = Output
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6
Dim A As Byte
Dim B As Byte
Dim I As Byte
Dim R As Byte
Dim Check As Bit
Dim Count As Word
Dim Second As Byte
Dim Rev As Byte
Main:
Cls
Locate 1 , 6
Lcd "Time :"
Do
A = Getkbd()
A = Lookup(a , Key)
Select Case A
Case Is < 10:
B = B * 10
B = B + A
Locate 2 , 7 : Lcd B ; " "
Case 15:
Goto Motor
Case 13:
B = B / 10
Locate 2 , 7 : Lcd B ; " "
End Select
Loop
Motor:
Cls
Enable Timer1
Timer1 = 64536
Start Timer1
Do
R = 128
For I = 1 To 4
Rotate R , Left
If R = 16 Then R = 1
Portd = R
Waitms 10
Next
Loop Until Check = 0
End
Timer_int:
Incr Count
Timer1 = 64536
If Count >= 1000 Then
Disable Timer1
Count = 0
Incr Second Rev = B - second
Locate 2 , 7 : Lcd Rev ; " "
If Second >= B Then Check = 1
Enable Timer1
End If
Return
این برنامه رو امتحان کن ببین رو LCD زمانی که موتور شروع به کار می کنه چه زمانی نشون میده :
$regfile = "m32def.dat"
$crystal = 8000000
Enable Interrupts
On Timer1 Timer_int
Stop Timer1
Config Timer1 = Timer , Prescale = 8
Config Kbd = Portb , Delay = 200 , Debounce = 100
Config Portd = Output
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6
Dim A As Byte
Dim B As Byte
Dim I As Byte
Dim R As Byte
Dim Check As Bit
Dim Count As Word
Dim Second As Byte
Dim Rev As Byte
Main:
Cls
Locate 1 , 6
Lcd "Time :"
Do
A = Getkbd()
A = Lookup(a , Key)
Select Case A
Case Is < 10:
B = B * 10
B = B + A
Locate 2 , 7 : Lcd B ; " "
Case 15:
Goto Motor
Case 13:
B = B / 10
Locate 2 , 7 : Lcd B ; " "
End Select
Loop
Motor:
Cls
Enable Timer1
Timer1 = 64536
Start Timer1
Do
R = 128
For I = 1 To 4
Rotate R , Left
If R = 16 Then R = 1
Portd = R
Waitms 10
Next
Loop Until Check = 0
End
Timer_int:
Incr Count
Timer1 = 64536
If Count >= 1000 Then
Disable Timer1
Count = 0
Incr Second Rev = B - second
Locate 2 , 7 : Lcd Rev ; " "
If Second >= B Then Check = 1
Enable Timer1
End If
Return
من هیچ وقت به پروتئوس اعتقاد نداشتم . خودم فکر می کنم برنامه درست باشه .
دققا چه مشکلی پیش میاد؟ اگه رو LCD هیچی نشون نمی ده یعنی تو زیر برنامه وقفه نمیره . در حالی که تو گفتی 135 درجه می چرخه .
راستی نگفتی موتورت چند پله است؟
حامد جان اگه برات امکان داره یه مقدار در مورد روند برنامه توضیحاتی بده
A = Getkbd()
A = Lookup(a , Key)
Select Case A
Case Is < 10:
B = B * 10
B = B + A
Locate 2 , 7 : Lcd B ; " "
Case 15:
Goto Motor
Case 13:
B = B / 10
Locate 2 , 7 : Lcd B ; " "
End Select
در اینجا عددی رو که از کی پد گرفته شده رو تو متغیر a ریختی بع دوباره همین متغیر رو از جدول لوکاپ دوباره مقدار دهی کردی ، در این مورد توضیح بده
R = 128
For I = 1 To 4
Rotate R , Left
If R = 16 Then R = 1
Portd = R
Waitms 10
Next
Loop Until Check = 0
حامد جان اگه برات امکان داره یه مقدار در مورد روند برنامه توضیحاتی بده
A = Getkbd()
A = Lookup(a , Key)
Select Case A
Case Is < 10:
B = B * 10
B = B + A
در اینجا عددی رو که از کی پد گرفته شده رو تو متغیر a ریختی بع دوباره همین متغیر رو از جدول لوکاپ دوباره مقدار دهی کردی ، در این مورد توضیح بده
R = 128
For I = 1 To 4
Rotate R , Left
If R = 16 Then R = 1
Portd = R
Waitms 10
Next
Loop Until Check = 0
اینجا هم یه توضیح کلی بده
رقم اولی که گرفته میشه دهگانه و رقم دوم یکان.درست!
و رقم دوم یکانه. برای اینکه مثلاً 25 رو وارد کنید شما اول 2 رو میزنید بعد 5 رو.نمیشه که 2 رو همین جوری با 5 جمع کرد(میشه 7) :mrgreen:.باید 2 رو در 10 ضرب کرد بعد با 5 (یکان)جمعش کرد.
2 در اینجا B هست و 5 در اینجا A.
خب من جدول لوک پ رو برای تغییرات کدهای کیپد در نظر گرفتم :
10 3 2 1
11 6 5 4
12 9 8 7
15 14 0 13
و در صورتی که کلیدی فشرده نشه کد 16 رو بر می گردونه . با این ترکیب پس اگه بعد از دستور A=Lookup(a,key) به مقدار A توجه کنیم می بینیم که ارقام کدی کمتر از 10 دارند. پس اگه یه عدد رو فشار بدیم چون B مقدار اولیه صفر داره ( اگه برای یه متغیر مقدار اولیه تعریف نکنیم مقدارش صفر در نظر گرفته میشه) پس B در 10 ضرب میشه و با A جمع میشه . اگه فرض کنیم 2 رو زده باشیم ، B میشه 2 . در مرحله بعد کلید 5 رو می زنیم . این بار B در 10 ضرب میشه ( 20 ) و با A جمع میشه . در این صورت مقدار B=25 میشه .
حالا اگه کلید اینترو بزنیم ( تو برنامه کد 15 دادم ) وارد قسمت Motor میشه و ادامه ماجرا .
در مورد چرخش موتور هم باید بگم که فرض بر این بوده که موتور یک سیم مشترک و چهار سیم برای فرمان داره. این سیم ها ( سر سیم پیچ ها ) باید به ترتیب و در یک جهت شروع به چرخش کنند ( چرخش یک منطقی یا 5 ولت بین سیم ها ) . پس این برنامه رو نوشتم.
مقدار اولیه R=128 هست . یعنی 10000000 باینری . به محض وارد شدن تو حلقه For به ازای مقادیر مختلف I روی پورت خروجی داریم :
I=1 ===> 00000001
I=2 ===> 00000010
I=3 ===> 00000100
I=4 ===> 00001000
و این حلقه اونقدر ادامه پیدا می کنه تا تایمر به زمان B ثانیه برسه و مقدار check=1 بشه . بعد از این رویداد برنامه از حلقه خارج میشه و End برنامه.
خب من جدول لوک پ رو برای تغییرات کدهای کیپد در نظر گرفتم :
10 3 2 1
11 6 5 4
12 9 8 7
15 14 0 13
و در صورتی که کلیدی فشرده نشه کد 16 رو بر می گردونه . با این ترکیب پس اگه بعد از دستور A=Lookup(a,key) به مقدار A توجه کنیم می بینیم که ارقام کدی کمتر از 10 دارند. پس اگه یه عدد رو فشار بدیم چون B مقدار اولیه صفر داره ( اگه برای یه متغیر مقدار اولیه تعریف نکنیم مقدارش صفر در نظر گرفته میشه) پس B در 10 ضرب میشه و با A جمع میشه . اگه فرض کنیم 2 رو زده باشیم ، B میشه 2 . در مرحله بعد کلید 5 رو می زنیم . این بار B در 10 ضرب میشه ( 20 ) و با A جمع میشه . در این صورت مقدار B=25 میشه .
حالا اگه کلید اینترو بزنیم ( تو برنامه کد 15 دادم ) وارد قسمت Motor میشه و ادامه ماجرا .
حامد جان یعنی رو برد ببندم؟
در مورد چرخش موتور هم باید بگم که فرض بر این بوده که موتور یک سیم مشترک و چهار سیم برای فرمان داره. این سیم ها ( سر سیم پیچ ها ) باید به ترتیب و در یک جهت شروع به چرخش کنند ( چرخش یک منطقی یا 5 ولت بین سیم ها ) . پس این برنامه رو نوشتم.
مقدار اولیه R=128 هست . یعنی 10000000 باینری . به محض وارد شدن تو حلقه For به ازای مقادیر مختلف I روی پورت خروجی داریم :
I=1 ===> 00000001
I=2 ===> 00000010
I=3 ===> 00000100
I=4 ===> 00001000
و این حلقه اونقدر ادامه پیدا می کنه تا تایمر به زمان B ثانیه برسه و مقدار check=1 بشه . بعد از این رویداد برنامه از حلقه خارج میشه و End برنامه.
خب میگی موتورت 200 پله است . یعنی هر پله 1.8 درجه . از طرفی میگی 135فقط درجه می چرخه. پس یعنی 75فقط پله می چرخه. با زمان تقریبی 10*75 میلی ثانیه یعنی 750 میلی ثانیه . با این حرف یعنی زمانی رو که تایمر ایجاد می کنه اینه . و چون میگی هر عددی میدی این همین زمانو طی می کنه پس یا درست شبیه سازی نمیشه یا زیربرنامه گرفتن عدد ایراد داره و یا قسمت تایمر ایراد داره.
حالا رو برد بورد ببند . نتیجشو بگو
دیدگاه