ايران ويج

نسخه‌ی کامل: فرکانس متر
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام .
یه برنامه در مورد فرکانس متر گرفتم اما نفهمیدم جربانش از چه قراره.کسی از دوستان میتونه سطر به سطر توضیح بده؟

کد php:
$regfile "m8def.dat"
$crystal 8000000
'----------
Cursor Off
'
-----------
Config Timer1 Counter Edge Rising
Ddrd.5 
0
Portd.5 
1
'-------
Config Timer0 = Timer , Prescale = 1024
'
---------------
Enable Timer1
Enable Timer0
Enable Interrupts

'---------------------
On Ovf1 Pulse_counter
On Ovf0 Yazdkit
'
-------------------
Dim A As Long As Byte As Long
0
'----------------------------

Cls
'
-----------------------
Start Timer0
'------------
Do
Loop
End                                                         '
end program
'--------------

Yazdkit:
Incr I
If I > 30 Then
Stop Timer0
Cls
A = B * 65536
A = A + Counter1

B = 0
I = 0
Counter1 = 0
Start Timer0
End If
Return
'
----------------------
Pulse_counter:
Incr B
Counter1 
0
Return 
سلام.. من یه بار قبلا توضیح داده بودم...
فرکانس یعنی چی؟؟ یعنی تعداد پالس در 1 ثانیه...
پس شما باید توسط یک تایمر 1 ثانیه رو ایجاد کنی و توسط یک کانتر تعداد پالس هاش رو بخونی...
کد:
$regfile = "m8def.dat"
تعریف میکرو و فرکانس کاری
$crystal = 8000000
'----------
خاموش کردن مکان نما
Cursor Off
'-----------
تایمر 1 رو کانتر تعریف کرده که حساس به لبه بالا رونده است
Config Timer1 = Counter , Edge = Rising
Ddrd.5 = 0
Portd.5 = 1
'-------
تایمر  صفر رو تاینمر تعریف کرده و به خاطر اینکه میخواد سر 1 ثانیه سرریز کنه مقدار prescal رو گذاشته 1024 یعنی

8000000 تقسیم بر 256(8 بیتی بودن تایمر 0)  و جوابش تقسیم بر 1024 میشه 30... یعنی اگر از 30 تا شمارشش بیشتر شد 1 ثانیه شده
Config Timer0 = Timer , Prescale = 1024
'---------------
فعال کرده تایمر 1 و 0 و وقفه کلی میکرو
Enable Timer1
Enable Timer0
Enable Interrupts

'---------------------
ovf0 اگر تایمر 0 خورد بپر به
و اگر تایمر 1 که 16 بیتی است و مقدارش با 65536 پر میشه سرریز کرد انوقت برو به
On Ovf1 Pulse_counter
On Ovf0 Yazdkit
'-------------------
تعریف متغییر ها
Dim A As Long , B As Byte , I As Long
B = 0
'----------------------------
پاک کردن ال سی دی
Cls
'-----------------------
شروع کار تایمر
Start Timer0
'------------
حلقه برنامه
Do
Loop
End                                                         'end program
'--------------
زیر برنامه برای تایمر
یعنی هر بار ی که برش میکنه به این زیر برنامه یکی به i اضافه میکنه تا زمانی که مقدارش بیشتر از 30 شد
انوقت میفهمیم که 1 ثانیه شده و باید مقدار کانتر رو بخونیم...
Yazdkit:
Incr i
اگر مقدار i از 30 تا بیشتر شد انوقت
If I > 30 Then
تایمر خاموش
Stop Timer0
Cls
اگر کانتر مقداری  که خونده بود از 65536 بیشتر شده یکی به b در برنامه اضافه میشه و اینجا
د ر 65536 ضرب میشه تعداد باری که سریز کرده و بعد مقدارش ریخته میشه تو ی a
A = B * 65536
مقدار a  جمع میشه با کانتر
A = A + Counter1
اینچا  متغیر ها صفر میشن
که دقیقا همین جا باید مقادیر رو روی ال سی دی نمایش بدی
B = 0
I = 0
Counter1 = 0
Start Timer0
End If
Return
'----------------------
اینجا همون جاییه که اگر کانتر 1 کا 16 بیتی است و با 65535 پر میشه و با 65536 سرریز میکنه
و یکی به b  اضافه میکنه
فرض کن تعدا پالس که خونده در 1 ثانیه   1000000 پاس بود انوقت مقدار b  15 است
Pulse_counter:
Incr B
Counter1 = 0
Return
ممون.ولی کلمات فارسی که نوشتی جابجا شده.واسه همین جملات نا مفهومه.یه سوالی داشتم.فرض کن میخاوم تو مدت زمان یه سیکل هر وقت یکی از پایه های میکرو رو یک کردم زمان تا اونجا محاسبه بشه.فرض کن من یه پالس ورودی با فرکانس 300 هرتز دارم با پهنای پالس 200 میکرو.حالا یکی از پایه های دیگه رو هم به عنوان ورودی دارم.میکرو در حالت عادی میاد پالس رو بررسی میکنه تا ببینه که من در مدت یک سیکل ورودی داشتم یا نه.حالا هر وقت من پایه مورد نظر رو یک کردم میکرو از زمانی که پالس 300 هرتز من یک شد تا زمانی که اون یکی از پایه ها یک شد زمان رو محاسبه کنه.ایا میشه؟
(۳۱-مرداد-۱۳۹۲, ۰۰:۱۰:۰۹)kelaran نوشته است: [ -> ]کلمات فارسی که نوشتی جابجا شده.واسه همین جملات نا مفهومه

دوستمون زحمت کشیده واستون نوشت هرکدوم چکار میکنند؛ یکم هم شما زحمت بکشید و جملات رو درست کنید

---------------------------------------------------

کد php:
$regfile "m8def.dat" 
تعریف میکرو و فرکانس کاری
کد php:
$crystal 8000000 

خاموش کردن مکان نما
کد php:
Cursor Off 

تایمر 1 رو کانتر تعریف کرده که حساس به لبه بالا رونده است
کد php:
Config Timer1 Counter Edge Rising
Ddrd.5 
0
Portd.5 


تایمر صفر رو تاینمر تعریف کرده و به خاطر اینکه میخواد سر 1 ثانیه سرریز کنه مقدار prescal رو گذاشته 1024 یعنی

8000000 تقسیم بر 256(8 بیتی بودن تایمر 0) و جوابش تقسیم بر 1024 میشه 30... یعنی اگر از 30 تا شمارشش بیشتر شد 1 ثانیه شده
کد php:
Config Timer0 Timer Prescale 1024 

فعال کرده تایمر 1 و 0 و وقفه کلی میکرو
کد php:
Enable Timer1
Enable Timer0
Enable Interrupts 


ovf0 اگر تایمر 0 خورد بپر به
و اگر تایمر 1 که 16 بیتی است و مقدارش با 65536 پر میشه سرریز کرد انوقت برو به
کد php:
On Ovf1 Pulse_counter
On Ovf0 Yazdkit 

تعریف متغییر ها
کد php:
Dim A As Long As Byte As Long


پاک کردن ال سی دی
کد php:
Cls 

شروع کار تایمر
کد php:
Start Timer0 

حلقه برنامه
کد php:
Do
Loop
End                                                         
'end program 
زیر برنامه برای تایمر
یعنی هر بار ی که برش میکنه به این زیر برنامه یکی به i اضافه میکنه تا زمانی که مقدارش بیشتر از 30 شد
انوقت میفهمیم که 1 ثانیه شده و باید مقدار کانتر رو بخونیم...
کد php:
Yazdkit:
Incr i 
اگر مقدار i از 30 تا بیشتر شد انوقت
کد php:
If 30 Then 
تایمر خاموش
کد php:
Stop Timer0
Cls 
اگر کانتر مقداری که خونده بود از 65536 بیشتر شده یکی به b در برنامه اضافه میشه و اینجا
د ر 65536 ضرب میشه تعداد باری که سریز کرده و بعد مقدارش ریخته میشه تو ی a
کد php:
65536 
مقدار a جمع میشه با کانتر
کد php:
Counter1 
اینچا متغیر ها صفر میشن
که دقیقا همین جا باید مقادیر رو روی ال سی دی نمایش بدی
کد php:
0
0
Counter1 
0
Start Timer0
End 
If
Return 

اینجا همون جاییه که اگر کانتر 1 کا 16 بیتی است و با 65535 پر میشه و با 65536 سرریز میکنه
و یکی به b اضافه میکنه
فرض کن تعدا پالس که خونده در 1 ثانیه 1000000 پاس بود انوقت مقدار b 15 است
کد php:
Pulse_counter:
Incr B
Counter1 
0
Return 
(۳۱-مرداد-۱۳۹۲, ۰۰:۱۰:۰۹)kelaran نوشته است: [ -> ]یه سوالی داشتم.فرض کن میخاوم تو مدت زمان یه سیکل هر وقت یکی از پایه های میکرو رو یک کردم زمان تا اونجا محاسبه بشه.فرض کن من یه پالس ورودی با فرکانس 300 هرتز دارم با پهنای پالس 200 میکرو.حالا یکی از پایه های دیگه رو هم به عنوان ورودی دارم.میکرو در حالت عادی میاد پالس رو بررسی میکنه تا ببینه که من در مدت یک سیکل ورودی داشتم یا نه.حالا هر وقت من پایه مورد نظر رو یک کردم میکرو از زمانی که پالس 300 هرتز من یک شد تا زمانی که اون یکی از پایه ها یک شد زمان رو محاسبه کنه.ایا میشه؟

سلام
توضیحاتتون کمی گنگه
میخواهید با یه کلید تعیین کنید که میکرو پالس رو دریافت کنه یا نه؟
این کار رو میتونید طی وقفه انجام بدید
ممنون.ببینید من دوتا پین رو به عنوان ورودی تعریف میکنم.مثلا PINB و PINC .در حقیقت هردوتا پین ورودی پالس هستند.یعنی PINB ورودی PWM و PINC ورودی تک پالس.فرض کنید ورودی PINB ما پالسی با فرکانس 500هرتز و پهنای پالس 200میکرو.طبق شکل A زمان سیکل مااز X تاY.و حرف Z هم ضربه ورودی به PINC حالا میخوام مدت زمان X تا Z رو محاسبه کنم.امیدوارم تونسته باشم منظورم رو رسونده باشم
سلام
برای اندازه گیری زمان یک سیکل باید سیکل ورودی رو به یکی از پایه های وقفه خارجی int میکرو بدید و وقفه رو روی لبه بالارونده تنظیم کنید
زمانیکه سیکل شروع شد، با لبه بالارونده وقفه سرریز شده و طی وقفه میتونید یک تایمر رو فعال کنید تا شروع به شمارش زمان سیکل کنید
بعد منتظر بمونید که pinc فعال شود تا تایمر رو از وقفه خارج کنید و زمان طی شده رو محاسبه کنید


خوش باشید.