السلام عليكم
سرعه تنفيذ هي تعتمد على تردد الساعه (( كرستاله)) وسرعه البرنامج معتمده على هذا التردد فمثلا عندما نتعامل مع تايمر0 لابد من أخذ زمن تنفيذ الاوامر لكي نستطيع حساب عدد نبضات فمثلا كرستاله 4 معناها زمن تنفيذ الاوامر 1us وبتالي كل امر ينفذ بهذا الزمن الا delay يبقى نفس ماهو لانه داله وهذه داله تأخذ تغير تردد كرستاله بعين الاعتبار
(( في delay يزداد سرعه تنفيذ الاوامر داخل داله delay ولكنك ستحصل على نتيجه ثابته اي كانما نقول لغرض فهم ان delay اصلا هي عباره عن تكرار أمر لعده مرات وهذه تكرار مساويه تقريبا لزمن الحقيقي واذا افترضنا تردد كرستاله 4 وكتبنا الامر (delay_ms(1000
فانه حتى نحصل على هذا الزمن فان delay سوف تكرر الامر بعد x من مرات لكي يكون بعدها زمن 1 ثانيه واذا تم تغير كرستاله الى 8 هنا سرعه سوف تزداد ويصبح زمن تنفيذ 0.5us ولكي نحصل على 1 ثانيه فانه سوف تقوم داله delay بتنفيذ تكرار الاوامر بعدد 2x من مرات وبتالي يبقى زمن 1 ثانيه))
ولو تلاحظ في تايمر0 عندما يكون تردد كرستاله 4 فانما عندما نقول نريد يحدث الانتربت كل 1 ملي ثانيه يعني كل 1000 مايكروثانيه
انظر كود لكرستاله 8 ميكا
كود:
//Timer0
//Prescaler 1:8; TMR0 Preload = 5; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x82;
TMR0 = 5;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 5;
//Enter your code here
}
}
وكود لكرستاله 4 ميكا
كود:
//Timer0
//Prescaler 1:4; TMR0 Preload = 5; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x81;
TMR0 = 5;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 5;
//Enter your code here
}
}
على فكره يوجد برنامج كامل من شركه مايكروشيب لكتابه الكود لكل تايمرات
لاحظ بالكود انه الاعدادات هي نفسها ولكن اختلف فقط معامل تقسيم Prescaler
لكي يبقى زمن كما هو وفي مثالنا في الانتربت هو 1 ملي ثانيه