السلام عليكم ورحمة الله وبركاته
انا احتاج الى توضيح بخصوص كيفة برمجة التايمر 0 ليعمل كمؤقت وليس كعداد
pic16f877a ... شكرا
|
اخى العزيز لكى تستخدم تايمر0 كمؤقت لابد من عمل الاتى :
1- تفعيل مقاطعه تايمر0
2- مسح سجل علم مقاطعه تايمر0
3- تفعيل سجل المقاطعات العامه
4- ضبط اعدادات تايمر0 عن طريق سجل التحكم الخاص به
فمثلا اذا كنت تستخدم pic16f877a فان الخطوات البرمجيه كالاتى :
int T0_cnt;
void interrupt(){
IF(TMR0IE_BIT&&TMR0IF_BIT){++T0_cnt;TMR0IF_BIT=0;T MR0IE_BIT=1;}
}
void main(){
TRISB=0;PORTB=0;
TMR0IE_BIT=1;
TMR0IF_BIT=0;
GIE_BIT=1;
OPTION_REG=8;
While(1){
}
}
فى السطور السابقه عملنا على تشغيل مقاطعه تايمر0 كمؤقت ولكن كيف يمكننا استخدامه كمؤقت لحساب فترة زمنيه لعشر ثوانى مثلا ؟
الاجابه هى انه عندما يعمل تايمر0 كمؤقت زمنى فان قيمته تزداد من 0 و حتى 255 واذا زادت عن 255 تحدث للمؤقت طفحان اى ان قيمته تعود ل 0 و تحدث مقاطعه البرنامج الرئيسي اى ان البرنامج الرئيسي يعمل توقف مؤقت للأوامر التى يقوم بتنفيذها ثم يذهب سريعا لداله المقاطعات و من خلالها يمكننا تنفيذ اى اوامر كما هو واضح اننا نقوم بزيادة عداد معين T0_cnt و هذا العداد يعد كم مرة حدث طفحان لتايمر0 ولكن ما فائدة ان نعلم ذلك ؟
اصبر معى و ستفهم التالى , عندما يعمل تايمر0 كمؤقت زمنى فكل زيادة لقيمته تعتبر تعليمه قام البك بتنفيذها و بالتالى كل طفحان لتايمر0 يعتبر تنفيذ ل 256 تعليمه و اذا علمنا زمن تنفيذ التعليمه بالبك فسنعرف زمن طفحان تايمر0 و بالتالى يمكننا حساب اى مدة زمنيه .
لحساب زمن تنفيذ اى تعليمه يقوم بها البك نستخدم القانون التالى :
Instruction Time = (4*Timer Prescaler)/Clock in HZ
و تكون قيمه Instruction Time بالثانيه اذا كانت قيمه الكريستاله المستخدمه بالهرتز وليس ميجا هرتز فمثلا اذا استخدمنا المقسم الداخلى لنبضات تايمر0 "Prescaler 1:1" مع كريستاله بقيمه 4 ميجا هرتز عندئذ يكون زمن تنفيذ التعليمه هو 1us اى واحد مايكروثانيه و هى واحد من مليون جزء من الثانيه و عندئذ يكون زمن طفحان تايمر0 هو 256 مايكرو ثانيه و بالتالى اذا اردنا حساب مدة زمنيه قدرها 10 ثوانى فنجد ان قيمه ال10 ثوانى تعادل 39062.5 مرة من مرات طفحان تايمر0 و بالتالى سيكون البرنامج السابق كالتالى
int T0_cnt;
void interrupt(){
IF(TMR0IE_BIT&&TMR0IF_BIT){++T0_cnt;TMR0IF_BIT=0;T MR0IE_BIT=1;IF(T0_cnt==39062){T0_cnt=0;PORTB};}
}
void main(){
TRISB=0;PORTB=0;
TMR0IE_BIT=1;
TMR0IF_BIT=0;
GIE_BIT=1;
OPTION_REG=8;
While(1){
}
}
اخى العزيز اتمنى ان يكون شرحى لاقى قبولك ولكن لكى تفهم طبيعه عمل تايمر0 لابد ان تمسك بورقه وقلم لكى لا تتوة وسط الحسابات و اى استفسار احنا تحت امرك