(۱۲-خرداد-۱۳۹۱, ۲۳:۲۳:۵۸)علیدلی نوشته است: [ -> ]دوستان من برای فعال کردن یک خروجی در یک زمان ،از تایمر میکرو استفاده کردم و برنامشو نوشتم .برنامه رو که بصورت جداگانه شبیه سازی میکنم تو پرتئوس هیچ موردی نداره ولی وقتی تو عمل پیادش میکنم بعضی مواقع کار نمیکنه بعضی مواقع که هم کار میکنه اصلا دقیق نیست .مثلا دستور دادم 5 ثانیه دیگه یه پین رو فعال کن نیم ساعت دیگه اینکارو انجام میده .یا دستور دادم که 15 ثانیه بعد پین رو غیر فعال کن 1 ساعته دیگه این کارو انجام میده .این برناممه .ممنونم دوستان راهنمایی کنند.
Config Timer2 = Timer , Async = ON , Prescale = 128
Enable Interrupts
Enable Timer2
On Timer2 mohammad
: Dim S As Byte , M As Byte , H As Byte , T As Byte
H = 23 : M = 58 : S = 0
Start Timer2
If H = 23 And M = 58 And S = 30 Then
Set Portb.4
Else
If H = 23 And M = 58 And S = 50 Then
Reset Portb.4
mohammad:
Incr S
If S > 59 Then
S = 0 : Incr M
End If
If M > 59 Then
M = 0 : Incr H
End If
If H > 23 Then
H = 1
End If
Return
یه مشکلی هم که هست تایمر 0 و 1 هم همین مشکلو دارنند
سلام...
شما دستورات شرطی رو توی زیز برنامه mohammad بزار درست میشه
[/align]
سلام دوست عزیز
ممنومن از راهنمایی که کردید.
من تغییرات رو دادم .و برنامه رو با تایمر0 نوشتم .مشکلی که الان داره دقیق نیست .مثلا باید 5 ثانیه بعد پین فعال بشه .90ثانیه بعد فعال میشه ...
باید 15 ثانیه بعد پین غیر فعال بشه 100 ثانیه بعد غیر فعال میشه
برا مدارم از کریستال خارجی استفاده نکردم وکریستال داخلی رو روی 1MHZ گذاشتم
ممنونم در این زمینه راهنمایی بفرماید.
هدف از این برنامه فعال کردن 1 پین،، هر روز میباشد که به مدت مثلا 30 دقیقه فعال بشه و بعد از 30 دقیقه غیر فعال بشه .
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
On Ovf0 Label
Enable Timer0
Start Timer0
Dim S As Byte , M As Byte , H As Byte , T As Byte
H = 23 : M = 59 : S = 10
Label:
Incr T
If T > 35 Then
Incr S
If S > 59 Then
S = 0 : Incr M
End If
If M > 59 Then
M = 0 : Incr H
End If
If H > 23 Then
H = 1
End If
T = 0
End If
Timer2 = 0
If H = 23 And M = 59 And S = 20 Then
Set Portb.4
Else
If H = 23 And M = 59 And S = 30 Then
Reset Portb.4
End If
End If
Return
فیوز بیت هارو چک کن ببین کریستالی که تنظیم کردی با کریستال میکرو هماهنگی داره (این مشکل پیش پا افتاده زیاد واسه من پیش اومده و کلی وقتم رو گرفته ، اینو می گم چون گفتید تو پروتوس درست کار می کنه ولی رو برد نه پس احتمال داره مشکل از فیوز بیت ها باشه)
ببین تایمر 0 با این prescale که تو انتخاب کردی( 1024) و با فرکانس کاری 1000000 یعنی تایمر با فرکانس حدود 977 کار می کنه
فرکانس تایمر = Crystal / prescale
این یعنی تو 1 ثانیه حدود 4 بار تایمر 0 سر ریز می کنه ( یعنی تو هر ثانیه 4 بار به زیر برنامه پرش می کنه)
اگه تایمر 1 ثانیه می خوای از یه تایمر 16 بیتی (تایمر 1 که تا 65535 می شماره بعد سر ریز می کنه) استفاده کن
بعد اگه بخوای از همین prescale و کریستال استفاده کنی اگر مقدار اولیه تایمر رو روی 64558 ( 65535-977) بزاری حدود 1 ثانیه بعد از شروع پرش می کنه و هر سری برای 0 کردن تایمر هم باید به جای 0 از همین 64558 استفاده کنی
بنابر گفته هام من برنامت رو به شکل زیر تغییر میدم ببین کار می کنه
کد:
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
On Ovf1 Label
Enable Timer1
Enable Ovf1
Start Timer1
Timer1=64558 'first value
Dim S As Byte , M As Byte , H As Byte , T As Byte
H = 23 : M = 59 : S = 10
Label:
Incr T
If T > 35 Then
Incr S
If S > 59 Then
S = 0 : Incr M
End If
If M > 59 Then
M = 0 : Incr H
End If
If H > 23 Then
H = 1
End If
T = 0
End If
Timer1 = 64558 'first value
If H = 23 And M = 59 And S = 20 Then
Set Portb.4
Else
If H = 23 And M = 59 And S = 30 Then
Reset Portb.4
End If
End If
Return
این جوری برنامه هر 1 ثانیه به زیر برنامه پرش می کنه ( وقفه تایمر 1 ovf1 هست)
یه برنامه هم هست که خودم قبلا درست کردم
مقدار کریستال
مقدار prescale
زمان مورد نیاز (به ثانیه)
رو بهش می دی و بعد کنار دکمه Get در مقابل First کلیلک می کنی تا بحت مقدار اولیه ای که باید به تایمر بدی رو بگه (عدد 65535 که کنار first هست همون مقدار حد اکثریه که تایمر می شماره در اینجا پیشفرض 65535 قرار داده شده که برای تایمر 1 هست یعنی اگه خواستی از تایمر 0 استفاده کنی باید اون رو 255 بزاری)
این برنامه مشکل داره و جواب لازمه رو نمیده !
چون زیربرنامه وقفه تایمر به موقع سرریز نمیشه ( بعد از مقدار گرفتن از متغیرها بلافاصله زیربرنامه اجرا میشه) و چند نکته که رعایت نشده
اینم کد اصلاح شدش
کد:
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
On Ovf1 Label
Enable Timer1
Enable Ovf1
Timer1=64558 'first value
Start Timer1
Dim S As Byte , M As Byte , H As Byte , T As Byte
H = 23 : M = 59 : S = 10
do
loop
end
Label:
stop timer1
Incr T
If T > 35 Then
Incr S
If S > 59 Then
S = 0 : Incr M
End If
If M > 59 Then
M = 0 : Incr H
End If
If H > 23 Then
H = 1
End If
T = 0
End If
Timer1 = 64558 'first value
start timer1
If H = 23 And M = 59 And S = 20 Then
Set Portb.4
Else
If H = 23 And M = 59 And S = 30 Then
Reset Portb.4
End If
End If
Return
از تمامی دوستان متشکرم مشکل بر طرف شد .
سلام به دوستان
من هر چند وقت یه بار با این تایمر دعوام میشه.
می خوام به ازای هر یک ثانیه یه پین صفر و یک بشه
شبیه سازی درست اما در عمل خیر. کریستال هم گزاشتم
کد:
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer2 = Timer , Async = On , Prescale = 128
Dim Secend1 As Word , A As Byte , Trac1 As Byte , Trac2 As Byte , Trac3 As Byte
Dim Trac4 As Byte , X As Byte , Cont As Byte
Enable Interrupts
Enable Timer2
On Timer2 Secen
'Enable Timer2
Start Timer2
Cont = 200
Config Portd.7 = Output
Portd.7 = 0
Main:
Portb.1 = 1
Waitms Cont
Portb.1 = 0
Waitms Cont
Goto Main
End 'end program
Secen:
Incr Secend1
Portd.7 = 1
Waitms 100
Portd.7 = 0
Return
(۲۶-تير-۱۳۹۳, ۱۹:۱۷:۳۹)Ambassador نوشته است: [ -> ]سلام به دوستان
من هر چند وقت یه بار با این تایمر دعوام میشه.
می خوام به ازای هر یک ثانیه یه پین صفر و یک بشه
شبیه سازی درست اما در عمل خیر. کریستال هم گزاشتم
سلام
چه کریستالی گذاشتی واسش؟
خازن های دوسر کریستال ضرفیت شون چقدره؟
همون 32768هزار. هیچ خازنی نزاشتم . قبلا 20 پیکو میزاشتم . یعنی اینقدر مهمه ؟
(۲۶-تير-۱۳۹۳, ۲۳:۰۴:۱۸)Ambassador نوشته است: [ -> ]همون 32768هزار. هیچ خازنی نزاشتم . قبلا 20 پیکو میزاشتم . یعنی اینقدر مهمه ؟
واسه 32768k خازن نمیخواد
ولی واسه بقیه مهمه
با کریستال 11.59200 تستش کن
خازن هم 2 تا 10 پیکو براش بذار