MohdJamal


3


1


0

Pulse Counter [PIC 16f877a]

2013-06-19

العديد من التطبيقات تتطلب منك معرفة عدد ال Pulses الناتجة ,, وابسط تلك التطبيقات هو تطبيق معرفة عدد نبضات القلب حيث تنتج على شكل pulses ويتوجب عليك معرفة عددها ضمن فتره زمنية معينه

يوجد العديد من الافكار لتطبيق الفكرة ولكن ما قمت باستخدامه هو استخدام الـ timer1 داخل المتحكم ليعمل ك عداد معتمدا على external pulse من ال Pin 15 داخل ال PIC

الكود

#include<16f877a.h> #fuses HS,nowdt #use delay(clock=20000000) #include<lcd.c> unsigned int16 counter; void main() { lcd_init(); delay_ms(100); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT); while(1) { set_timer1(0); Delay_ms(1000); counter = get_timer1(); lcd_putc('\f'); lcd_gotoxy(1,1); printf(lcd_putc,"%lu",counter2); counter=0; } }

المثال السابق يقوم بعد ال Pulses خلال دقيقه واحده ويقوم بطباعة النتيجة على الشاشه

ما يتوجب علينا فهمه وان ناخذه بعين الاعتبار هو ما يلي داخل ال pic16f877a هناك 3 timers timer0 , timer1 , timer2

timer0,timer2 : مخصص لهم 8 bit اكبر قيمه يعدها هي 255

timer1 مخصص له 16 bit اكبر قيمه يعدها هي 65536

Timer Overflow لنفرض ان pulses source يقوم بتوليد 300 pulse خلال الثانيه وقمت بعد ال pulses خلال الثانيه باستخدام timer0 فسأحصل على النتيجة 45 لماذا ؟؟ لان التايمر حدث له overflow ورجع للقيمه صفر وعاد من جديد

مثل هذه المشاكل كيف تحل ؟ اولا استخدام تايمر ذا سعه اكبر

T1_DIV_BY_1 Time divide by : اي ان القيمة الفعليه يتم قسمتها على عدد معين .. المثال السابق تم قسمة القيمة الفعلية على العدد واحد لذلك القراءه صحيحه بشكل مباشر

ولكن ماذا اذا كانت T1_DIV_BY_4

ما سيحصل فعليا ان القيمة ستتم قسمتها على اربعه اي في المثال السابق اذا كان لدينا مصدر لل pulses بمقدار 300 pulse بالثانيه وقمنا بعدها مع وضع القيمة T1_DIV_BY_4 فسنحصل على القيمة 75 لانه تمت قسمتها على 4

وعند عرض النتيجة النهائية للمستخدم نقوم بضرب القيمة التي حصلنا عليها ب 4 ونعرضها للمستخدم ... وهي حل اخر عوضا عن استخدام timer ذا سعه اكبر

ف احد المشاريع احتجت ل timer يقوم بعد اكثر من 800Khz في الثانية الواحده ولكن فعليا لا يوجد timer بهذه القدره ف قمت باخذ القيمه من ال timer كل 100ms وضرب القيمه ب 10 بعد ان وضعت قيمة Time divide by T1_DIV_BY_4

http://jemooo.com/pulse-counter-1/

1


Test User