ايران ويج

نسخه‌ی کامل: تایمر بسکام
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام من می خوام یک برنامه با تایمر بنویسم که هر 5 ثانیه یک ال ای دی رو روشن کنه و 20 ثانیه وایسه و این حالت به مدت 2 ساعت اتفاق بیافته .
من 5 ثانیه رو می تونم ایجاد کنم ولی با بقیه اش مشکل دارم .
خواهشا کمک کنید ...
توی پروتیوس هم جواب نمی گیرم اصلا
احساس ميكنم صورت سئوالتون ايراد داره؟!


شايد منظورتون اينه كه هر 20 ثانيه يكبار روشن بشه و براي 5 ثانيه روشن بمونه و ....
درسته؟
(۱۶-خرداد-۱۳۹۴, ۱۱:۳۴:۴۸)student-p نوشته است: [ -> ]احساس ميكنم صورت سئوالتون ايراد داره؟!


شايد منظورتون اينه كه هر 20 ثانيه يكبار روشن بشه و براي 5 ثانيه روشن بمونه و ....
درسته؟


بله منظورم همین بود Biggrin
صرفا جهت راهنمايي؛


فرض كنيد ميخواهيد از ميكرويي با فركانس 8 مگ ،استفاده از تايمر يك،Prescale مثلا 128 استفاده كنيد؛



طبق روابط، تايمر تقريبا هر 0.016 ثاينه يكبار(هر 16 ميلي ثانيه)سرريز ميشه،
حالا ميشه با شمارش اين تعداد دفعات زمان 1 ثانيه رو جهت انجام ادامه كار بدست آورد؛كه ميشه حدود 62 (62=1/0.016)

حالا فقط كافيه ي متغير بعنوان كانتر تعريف كني(مثلا A) و بگي مثلا هر وقت a برابر 20 شد پورتX رو يك كن ؛و در ادامه هر وقت 5 شد پورت مورد نظر رو ريست كن؛؛؛؛؛؛؛؛؛؛؛

ي متغير هم براي زمان كلي (ساعت)ك 2 ساعت ميشه 7200 ثانيه

در ادامه ي كد زدم(صرفا جهت نمونه)،



کد:
$regfile = "m32def.dat"
$crystal = 8000000
Config Timer1 = Timer , Prescale = 128
Config Porta = Output

Enable Interrupts
Enable Timer1
On Timer1 ovf1


Dim t As Byte
Dim t As Byte
Dim saat As long

do

loop

end




ovf1:
incr t

if t=62 then

t=0
incr a
incr saat

if saat=7200 then stop timer1

if a=20 then
set porta.1
end if

if a=25 then
reset porta.1
a=0
end if

end if

return
(۱۶-خرداد-۱۳۹۴, ۱۴:۳۷:۱۰)student-p نوشته است: [ -> ]صرفا جهت راهنمايي؛


فرض كنيد ميخواهيد از ميكرويي با فركانس 8 مگ ،استفاده از تايمر يك،Prescale مثلا 128 استفاده كنيد؛



طبق روابط، تايمر تقريبا هر 0.016 ثاينه يكبار(هر 16 ميلي ثانيه)سرريز ميشه،
حالا ميشه با شمارش اين تعداد دفعات زمان 1 ثانيه رو جهت انجام ادامه كار بدست آورد؛كه ميشه حدود 62 (62=1/0.016)

حالا فقط كافيه ي متغير بعنوان كانتر تعريف كني(مثلا A) و بگي مثلا هر وقت a برابر 20 شد پورتX رو يك كن ؛و در ادامه هر وقت 5 شد پورت مورد نظر رو ريست كن؛؛؛؛؛؛؛؛؛؛؛

ي متغير هم براي زمان كلي (ساعت)ك 2 ساعت ميشه 7200 ثانيه

در ادامه ي كد زدم(صرفا جهت نمونه)،



کد:
$regfile = "m32def.dat"
$crystal = 8000000
Config Timer1 = Timer , Prescale = 128
Config Porta = Output

Enable Interrupts
Enable Timer1
On Timer1 ovf1


Dim t As Byte
Dim t As Byte
Dim saat As long

do

loop

end




ovf1:
incr t

if t=62 then

t=0
incr a
incr saat

if saat=7200 then stop timer1

if a=20 then
set porta.1
end if

if a=25 then
reset porta.1
a=0
end if

end if

return




واقعا متشکرم به خاطر راهنماییتون ولی دو تا سوال دارم :
1- تایمر 1 که با prescale= 128 کار نمی کنه و شما طبق چه فرمولی 0.016 ثانیه بدست آوردید ؟ چون تقسیم 128 و 8MHz می شه 0.000016 ثانیه .

2- من روی برد که بستم زمان دقیقی که می خوام و نشون نمیده باید چی کار کنم ؟؟ Sad
سلام
بنده عرض كردم كه كد نوشته شده؛ نمونه است،

62500=8000000/128 فركانس كار تايمر
0.000016=1/62500
0.016=1024*0.000016 مدت زمانيكه طول مي كشد تا تايمر يك سرريز شود

حالا براي بدست آوردن مدت زمان يك ثانيه كافيه كه:
62=1/0.016 همان متغير T




از بابت Prescale = 128 معذرت؛Question

شما فقط كافيه ك تغييرات مد نظر خودتون رو مطابق روابط بالا اعمال كنيد
(۱۷-خرداد-۱۳۹۴, ۱۴:۴۴:۵۹)student-p نوشته است: [ -> ]سلام
بنده عرض كردم كه كد نوشته شده؛ نمونه است،

62500=8000000/128 فركانس كار تايمر
0.000016=1/62500
0.016=1024*0.000016 مدت زمانيكه طول مي كشد تا تايمر يك سرريز شود

حالا براي بدست آوردن مدت زمان يك ثانيه كافيه كه:
62=1/0.016 همان متغير T




از بابت Prescale = 128 معذرت؛Question

شما فقط كافيه ك تغييرات مد نظر خودتون رو مطابق روابط بالا اعمال كنيد



يا رابطه ساده شده ي زير:

(مقدار نهايي تايمر*مقسم فركانس تايمر)/فركانس كار ميكرو=T




(1024*128)/8000000=t
t=62
(۱۷-خرداد-۱۳۹۴, ۱۵:۰۵:۱۵)student-p نوشته است: [ -> ]
(۱۷-خرداد-۱۳۹۴, ۱۴:۴۴:۵۹)student-p نوشته است: [ -> ]سلام
بنده عرض كردم كه كد نوشته شده؛ نمونه است،

62500=8000000/128 فركانس كار تايمر
0.000016=1/62500
0.016=1024*0.000016 مدت زمانيكه طول مي كشد تا تايمر يك سرريز شود

حالا براي بدست آوردن مدت زمان يك ثانيه كافيه كه:
62=1/0.016 همان متغير T




از بابت Prescale = 128 معذرت؛Question

شما فقط كافيه ك تغييرات مد نظر خودتون رو مطابق روابط بالا اعمال كنيد



يا رابطه ساده شده ي زير:

(مقدار نهايي تايمر*مقسم فركانس تايمر)/فركانس كار ميكرو=T




(1024*128)/8000000=t
t=62


متشکرم ولی متاسفانه مشکلم هنوز حل نشده.
من برنامه ام و شبیه سازی رو براتون توی پیوست می ذارم لطفا بگید مشکل از کجاست ؟
یکی کمک کنه یعنی هیشکی نمی تونه اشکال برنامه رو بگه ؟؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!
سلام

اگه امكان داره تايمر يك رو انتخاب كنيد و پرسكيل رو 64 (يا هر مقدار پيش فرض ديگه)قرار بدين؛


كدهاي زير رو هم اصلاح كنيد:

Main1:
Set Pind.0
Bitwait Pinb.1 , Set
return

Main2:
Start Timer1
return


return ها رو يادتون رفته،