$regfile=”m32def.dat”
Config lcd pin=pin , db4=port c.4 , db5=port.5 , db6=portc.6 , b7=portc.7 , rs=pinc.2 , e=portc.3
Config timer 1=counter , edge = rising
Config timer 0= timer , prescale= 1024
Enable counter1
Enable interrupts
Enable timer0
Enable timer1
On ovf1 pulsecount
On ovf0 ovf0occures
Dim a as lomg , I as long , b as bye
B=0
Cls
Start timer 0
Do
Loop
End
ovf0occures:
incr i
if i>30 then
stop timer 0
cls : home
a =b * 65536
a=a+ counter 1
lcd “ frequncy is “ : ;a ; “hz”
b=0
i=0 : counter 1=0
start timer 0
end if
return
pulsecount :
incr b
counter 1=0
return
حامد جان یه توضیحی در مورد این برنامه بده خدا خیرت بده
خب من نمی دونم فرکانس کاری چنده؟
من کلی میگم:
فرض می کنیم فرکانس کلاک X باشه و مقدار Prescale برابر با Y .
در نتیجه فرکانس کاری تایمر صفر میشه : X/Y یا زمان کاری اون میشه : Y/X
به زبان ساده تر یعنی به ازای گذشت زمان Y/X ام (Z )، یک مقدار به شمارنده تایمر صفر اضافه میشه( اگه شمارنده مقدار دهی اولیه نشه مقدارش صفر در نظر گرفته میشه) . با این حساب بعد از گذشت 255 بار مقدار تایمر صفر پر میشه(چون تایمر صفر 8 بیتیه) در واقع مدت زمان آZآ*255 ثانیه لازمه تا وقفه تایمر اتفاق بیفته.
ولی در عمل زمانی رو که تایمر می تونه ایجاد کنه زیاد نیست . برای همین از یک متغیر برای شمارش استفاده میشه. یعنی هربار که یه وقفه اتفاق می افته به مقدار شمارنده یکی اضافه میشه و این روند ادامه پیدا میکنه.
در کل خیلی بد توضیح دادم. جزئی تر بپرس تا جزئی تر توضیح بدم . ضمن این که نوشتن محاسبات ریاضی اینجا خیلی سخته( اعداد عقب جلو میشه)
حامد جان ممنون از راهنماییت چند تا سوال دارم
اول اینکه چرا فرکانس کاری رو بر prescal تقسیم میکنن ؟
دوم اینکه حتما باید تایمر سر ریز بشه تا زیر برنامه مورد نظر اجرا بشه
سوم اینکه چطور میشه زمان دلخواه مثلا یک ثانیه یا دو ثانیه یا ... رو تولید کرد فرمول خاصی داره
ببخشید اگه سوالام خیلی پیش پا افتاده اس :redface:
خب
هر قسمت تو AVR با یک فرکانس مخصوص به خودش کار میکنه. حالا این فرکانس برای تایمر تنوع داره. می تونه خود فرکانس کلاک باشه یا مقسوم علیهی از اون و یا این که به طور خارجی بهش اعمال بشه.
معمولا از تقسیم کننده استفاده می کنند. ساده ترینش اینه که می تونی یه مقدار مناسب توسط این Prescale برای تایمرت ایجاد کنی.
روتین وقفه تایم دقیقا وقتی انجام میشه که سرریز اتفاق بیفته.
برای ساخت زمان یک ثانیه من فرمول رو این طوری میگم:
N : تعداد تکرار زیر برنامه وقفه تایمر
T : زمانی که قصد تولید اون رو داریم
Q : فرکانس کاری میکرو
P : مقدار Prescale
B : دو به توان تعداد بیت تایمر( برای تایمر هشت بیتی مثل تایمر صفر و تایمر دو میشه 256 و برای تایمر 16 بیتی مثل تایمر 1 میشه 65536)
با این توضیحات فرمول میشه:
ممنون از توضیحاتت جواب دو سوال اولم رو گرفتم ولی در مورد سومی
اگه فرکانس کار میکرو 8000000 باشه و بخواهیم زمان 1 ثانیه رو تولید کنیم با prescal 256 و با استفاده از تایمر صفر زیربرنامه وقفه تایمر حدودا 122 بار باید تکرار بشه درسته؟
خب یه جور دیگه میگم. فرکانس کاری تایمر میشه 8000000 تقسیم بر 256 ، یعنی 31250 .یا به عبارت دیگه زمانش میشه یک تقسیم بر 31250 یا 32 میکرو ثانیه. پس یعنی به ازای هر 32 میکرو ثانیه یکی به مقدار تایمر صفر اضافه میشه. اگر مقدار اولیه تایمر صفر رو 0 در نظر بگیریم ، بعد از 256*32 میکرو ثانیه ، یک وقفه اتفاق می افته . یعنی بعد از 8.192 میلی ثانیه . پس اگر بخوای 1000 میلی ثانیه تولید کنی باید 8.192/1000 بار اونو تکرار کنی. یعنی 122 بار.
پس محاسباتت درسته. :agree:
ولی همیشه اگه بتونی مقادیر مختلف رو جوری انتخاب کنی که عدد رندی به دست بیاد تایمر دقیقی بدست میاری، مثل:
فرکانس کاری 8 مگا - مقدار Prescale ، هشت - انتخاب 64536برای مقدار اولیه تایمر صفر - و تعداد تکرار 1000 بار
salam.mazerat mikham.man ye naghshe fereqans metr mikham ke b 8051 kar mikone.akhe daram ye rotoobat sanj misazam ke bayad khooroojiye oscillaor 10khz ro vasam andaze begire.mamnoo misham .
nioton2@yahoo.com
دیدگاه