ايران ويج

نسخه‌ی کامل: مشکل در TIMER 2 میکرو
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
دوستان من برای فعال کردن یک خروجی در یک زمان ،از تایمر میکرو استفاده کردم و برنامشو نوشتم .برنامه رو که بصورت جداگانه شبیه سازی میکنم تو پرتئوس هیچ موردی نداره ولی وقتی تو عمل پیادش میکنم بعضی مواقع کار نمیکنه بعضی مواقع که هم کار میکنه اصلا دقیق نیست .مثلا دستور دادم 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 هم همین مشکلو دارنند
(۱۲-خرداد-۱۳۹۱, ۲۳:۲۳:۵۸)علیدلی نوشته است: [ -> ]دوستان من برای فعال کردن یک خروجی در یک زمان ،از تایمر میکرو استفاده کردم و برنامشو نوشتم .برنامه رو که بصورت جداگانه شبیه سازی میکنم تو پرتئوس هیچ موردی نداره ولی وقتی تو عمل پیادش میکنم بعضی مواقع کار نمیکنه بعضی مواقع که هم کار میکنه اصلا دقیق نیست .مثلا دستور دادم 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
سلام
هر دو برنامه مشکل دارن
اینو امتحان کن

کد:
crystal=1000000
Config Timer0 = Timer ,  Prescale = 64
Enable Interrupts
Enable Timer0
On Timer0 mohammad
Dim S As Byte , M As Byte , H As Byte , x as byte
H = 23 : M = 58 : S = 0


Start Timer0
main :
do
If H = 23 And M = 58 And S = 30 Then Set Portb.4

If H = 23 And M = 58 And S = 50 Then Reset Portb.4
loop
end

mohammad:

stop timer0
incr x
if x=61 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 = 0
End If
x = 0
end if
timer0=0
strart timer0
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 پیکو براش بذار
صفحه‌ها: 1 2