ايران ويج

نسخه‌ی کامل: تایمر0
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام من یه مگا8 دارم با یه کریستال 4مگا هرتز
می خوام زمان تاخیر 30 ثانیه با تایمر0 ایجاد کنم.هر کار کردم نشد.از فرمولهای تایمر هم استفاده کردم.ولی تاخیر خیلی بیشتر میشه.اگه ممکنه یه مثال برام بزنید همراه با نحوه محاسبه فرمول
ممنون
سلام.

شما زمان 1 ثانيه رو مي توني بسازي ؟
روال به اين صورت هست كه بعد از تعيين prescale و ...
هر بار كه سرريز رخ مي ده ، مي ره تو وقفه و اونجا چك مي كنه كه چندبار اومده به وقفه ، فرض كنيد با 4000 بار اومدن به وقفه 1ثانيه ي ما ساخته مي شه، درست ؟
حالا بعد از اين شرط خط اول كه برآورده شد ، باز يه متغيير جديد بذار براي شمارش كه وقتي به 30 رسيد ، يعني زمان 30 ثانيه ساخته شده و شرط دوم در روال وقفه هم برآورده مي شه و خواسته ي شما در خطوط بعدي اجرا مي شه ...
شرمنده من متوجه نشدم.
اگه بامثال بگید فکر کنم بهتره
راستش من دستورات تایمر را میدونم ولی این که زمان سرریز شدن راچطور بدست بیارم برام مشکله.
البته چندتا فرمول دیدم از روی اونها محاسبه کردم ولی نتیجه نداد


يه مثال با كريستال 8MHz و Prescale = 8 مي زنم ، روش كار رو كه فهميديد مقادير رو براي مورد خودتون بدست بياريد.
8/8=1MHz كه فركانس شمارش هست ، 1/1M=1us كه زمان شمارش يك واحد شمارنده هست.
به تايمر صفر مقدار اوليه ي 6 مي دم. به اين ترتيب زمان لازم براي سرريز شدن تايمر0 كه يه شمارنده ي 8 بيتيه 250us مي شه ...
1 ثانيه چند ميكرو ثانيه هست ؟
1s=250us*4000
يعني با مقدار اوليه ي 6 هر وقت 250 تا شمردم ، مقدار شمارنده يك واحد بيشتر از 255 مي شه و در اين لحظه شمارنده سرريز مي شه و يك وقفه اتفاق مي افته.
در زير روال وقفه مي نويسم ...
کد php:
timm0:
m=m+1
if m<4000 then
timer0
=6
return
endif
' كد هاي مورد نظر كه بعد از هر 1ثانيه بايد اجرا بشه
.
.
.
m=0
timer0=6
return 
----------------------
حالا براي زمان 30 ثانيه ، مثل روش قبل فقط يه شرط ديگه اضافه مي كنيم ...

کد php:
timm0:
m=m+1
if m<4000 then
timer0
=6
return
endif
m=0
n
=n+1
if n<30 then
timer0
=6
return
endif
' كد هاي مورد نظر كه بعد از هر 30 ثانيه بايد اجرا بشه
.
.
.
m=0
n=0
timer0=6
return 
سلام
اگه میشه این برنامه را کنترل کنید.نمی دونم چرا تو پروتئوس کار نمیکنه.
کد:
regfile = "m8def".dat$
crystal = 8000000$
Dim M As Word
Dim N As Word
Config Portb = Output

Config Timer0 = Timer , Prescale = 8
Enable Interrupts
Enable Timer0
Start Timer0
On Timer0 1

1:
M = M + 1
If M < 4000 Then
Timer0 = 6
Return
End If
Set Portb.3
M = 0
N = N + 1
If N < 30 Then
Timer0 = 6
Return
End If
Set Portb.4

M = 0
N = 0
Timer0 = 6
Return
پروتوس رو ول كنيد ...
مخصوصا در بحث تايمينگ ...

كدتون رو در عمل چك كنيد ...
سلام
من میخوام با استفاده از تایمر صفر، 60ثانیه درست کنم.فرکانس میکرو من 16 مگاهرتزه و تقسیم بر8.توضیحات شما رو خوندم ولی توی برنامه ی من یه وقفه ی دیگه از تایمر 1 وجود داره که یه pwm درست میکنه.در اینجا هم باید وقفه بذارم.و میکرو خیلی درگیر میشه باید چیکار کنم؟؟؟ بعد این 60 ثانیه میخوام وقفه ای داشته باشم تا کاری که میخواهم انجام دهد.
شما برای PWM وقفه گذاشتید؟!!!
-
لذوما میکرو خیلی درگیر نمیشه باید آزمایش کنید + PRESCALE رو چرا 8 گذاشتید خوب مگه 60 ثانیه نمی خواید مقدارشو بیشتر کنید!
اوکی .فهمیدم.مقدارشو 1024 میذارم.اونوقت16 میلی ثانیه میشه.(اگر از 6تا 256 تغییر کنه)برای 60 ثانیه از وقفه سرریز استفاده میکنم ولی حالا موقع رسیدن به 60 ثانیه باید چیکار کنم؟دستوراتمو کجا بنویسم؟
شما توی همون روتین وقفه چک کن که اگه 60 ثانیه شده بره به تابعی که برای 60 ثانیه نوشتی