اهلا اخوي ennng
1- لا اخي التايمر يكون شغال. لكن احنا نفعل المقاطعة لحساب عدد طفح التايمر اذا كان التردد منخفض. ونلاحظ ان المقاطعه تفعلت بعد حدوث اول rising edge. .ولكن التايمر شغال وبيعد.
2- اذا لم يحصل طفح للتايمر, ال ov-cnt =0 لانه تم تصفيرها بعد الدخول في داله ال if
كود:
if (!RB0) //if pushbutton is pressed
{
__delay_ms(50);
ov_cnt=0;
Read more: http://www.qariya.com/vb/newreply.php?do=postreply&t=128416#ixzz2T74q3GXC
3- من الافضل نوضح العمليات الحسابية حتى تتضح الفكرة..
الان تايمر1 يحتوي على 16 بت..يعني راح يعد من 0 الى 65535
طيب اذا احنا فعلنا الكريستاله الداخلية وتم ضبطها على 16 ميجاهرتز. راح يكون زمن التعليمة في المايكروكنترولر pic هي 16ميجاهرتز / 4 = 4 ميجاهرتز. وزمن النبضة راح يكون 1/4Mhz= 250ns.
تايمر1 يعتمد على زمن النبضة لزيادة قيمة التايمر. اذا تايمر1 راح يبدا يعد من 0 الى 65535 لكل 250ns
فمثلاً:
تايمر1 ريجستر: الوقت
0 : 0s
1: 250 ns
2: 2* 500ns= 250ns
:
:
65535: 65535 * 16ms= 250ns
الان ان شاءالله وضحت فكرة الحساب ..خلينا ناخذ مثالين..واحد يحدث في طفح للتايمر والاخر بدون طفح للتايمر..حتى تتضح الفكرة اكثر
مثال 1: لو بنحسب تردد 100 كيلوهرتز.. وخلينا نقول ان اول rising edge حصل عند (تايمر1 ريجستر = 34 ,الوقت : 8.5us ) ..ثاني rising edge راح يكون:
تايمر1 ريجستر: الوقت
34 : 8.5us
8.5us + (1/100Khz) 18.5us: X
ولحساب قيمة x نضرب طرفين في وسطين:
x= (18.5u * 34) /8.5u
x=74
اذا عند حدوث اول rising edge عند Timer1=34 المفروض ثاني rising edge تحدث عندما Timer2=74 وللتاكد:
تايمر1 ريجستر: الوقت
34 : 8.5us
74: 18.5us
لونطرح زمن النبضة الثانية من زمن النبضة الاولى نحصل على (18.5us - 8.5us) نحصل على 10us. وللحصول على التردد ناخذ معكوس الفرق في الزمن F=1/t
F=1/10us
F=100Khz
وهنا صورة الناتج التي تم الحصول عليه عن طريق برنامج بروتس موكدة للعمليات الحسابية التي قمت بها في الاعلى:
مثال2: لو اردنا حساب اشاراة ترددها 1 هرتز..خينا هنا نشغل البرنامج في بروتس ونشوف النتيجة وبعد كذا نتاكد من العمليات الحسابية.. هنا صورة لحساب تردد 1 هرتز
http://upload.qariya.info/images/qar...bd30432f29.jpg
نلاحظ ان اول rising edge حدث عند timer1= 23728 اي عندما كان الوقت 5.9ms
(23728* 250ns طيب الان نريد ان نعرف متى سيحصل ال rsing edge الثاني:
تايمر1 ريجستر: الوقت
23728 : 5.9ms
8.5us + (1/1hz) 1.0059s: X
الان نحسب قيمة x:
X= (23728 * 1.0059s) / 5.9ms
x= 4045422
الان عندنا مشكلة طفح..لان التايمر يعد الى 65535 بينما قيمة ثاني rising edge راح تحدث عند 4045422.9
اذا لمعرفة عدد مرات الطفح نقسم 4045422 على 65535 ..وراح تساوي 61 مره .
الان عندنا 60 طفح عدت65536 ( من 0 الى 65535) وعندنا طفح واحد عد 41807 ( من 23728 الى 65535).. اذا نحسب الوقت كالتالي:
(65536 * 60 * 250ns*(41807) + (250ns = تقريبا 0.99349175s
اذا
قراءة Timer1 لثاني rising edge :
x = (1s - 0.99349175s)/250ns
x=26033
الان عندنا القيم التالية :
firs edge: 23728
Second edge: 26033
timer1 overflow: 61
لو نستخدم المعادلة لحساب الوقت:
period= ov_cnt*65536 + temp2 - temp1
period = 61 * 65536 + 26033 - 23728
period =4000 001
اذا لحساب الوقت في الثانية نضرب في 250ns
period= 250ns * 4000 001 = 1s
ولحساب التردد ناخذ مقلوب الزمن
freq =1/1s = 1hz
5- نعم صحيح راح يرتفع علم مقاطعة ال capture ولكن لان ال GIE=0, فلن نحتاج الى سب روتين للمقاطعة..والكود سوف يكمل قراءة السطر الثاني
6- جربت اخذ كل 4 rising edge بس كانت تبطي عملية الحساب. وقراءت انه من الافضل اخذ 4 rising edge للحصول على دقة اعلى.. ولكن لم الاحظ تغيير.
7- عفوا اخي وان شاءاالله قدرت اجاوب على كل اسئلتك..واسف كتبت الرد على عجلة ولكن اذا عندك استفسار او تريد توضيح اكثر اسئلني وان شاءالله ارجع اوضح اكثر.
نقطه اخيرة جربت الكود على مايكروكنترول PIC16F1937 وكانت النتيجة ممتازة ولكن اذا كنت تريد دقة اعلى يفضل استخدام كريستاله خارجية لان الكريستاله الداخلية غير دقيقة حسب ماقريت. انا ممكن اعدل على الكود واشغله على كريستالة داخلية 32Mhz وهذا راح يساعدنا لقراءة ترددات عالية.
ايضاً لما كنت اعمل على الكود كنت افكر استخدام Atml بدل PIC لان زمن قراءة التعليمة لاتقسم على 4 وهذا راح يساعد بسهولة لقراءة ترددات عالية.