سلام .
یه برنامه در مورد فرکانس متر گرفتم اما نفهمیدم جربانش از چه قراره.کسی از دوستان میتونه سطر به سطر توضیح بده؟
کد 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 , B As Byte , I As Long
B = 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 نوشته است: [ -> ]کلمات فارسی که نوشتی جابجا شده.واسه همین جملات نا مفهومه
دوستمون زحمت کشیده واستون نوشت هرکدوم چکار میکنند؛ یکم هم شما زحمت بکشید و جملات رو درست کنید
---------------------------------------------------
تعریف میکرو و فرکانس کاری
خاموش کردن مکان نما
تایمر 1 رو کانتر تعریف کرده که حساس به لبه بالا رونده است
کد php:
Config Timer1 = Counter , Edge = Rising
Ddrd.5 = 0
Portd.5 = 1
تایمر صفر رو تاینمر تعریف کرده و به خاطر اینکه میخواد سر 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 , B As Byte , I As Long
B = 0
پاک کردن ال سی دی
شروع کار تایمر
حلقه برنامه
زیر برنامه برای تایمر
یعنی هر بار ی که برش میکنه به این زیر برنامه یکی به i اضافه میکنه تا زمانی که مقدارش بیشتر از 30 شد
انوقت میفهمیم که 1 ثانیه شده و باید مقدار کانتر رو بخونیم...
اگر مقدار i از 30 تا بیشتر شد انوقت
تایمر خاموش
اگر کانتر مقداری که خونده بود از 65536 بیشتر شده یکی به b در برنامه اضافه میشه و اینجا
د ر 65536 ضرب میشه تعداد باری که سریز کرده و بعد مقدارش ریخته میشه تو ی a
مقدار a جمع میشه با کانتر
اینچا متغیر ها صفر میشن
که دقیقا همین جا باید مقادیر رو روی ال سی دی نمایش بدی
کد php:
B = 0
I = 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 فعال شود تا تایمر رو از وقفه خارج کنید و زمان طی شده رو محاسبه کنید
خوش باشید.