الموضوع بسيط جدا إن شاء الله ...
فلنقل بسم الله
ونصلي على النبي عليه الصلاة والسلام .
===============================
الآن الكود السابق يقوم بعمل ديلاي باستخدام timer0 .
في البداية يكون الريجستر tmr0 يساوي صفر عن طريق الأمر
clrf tmr0
والمفترض أن tmr0 تزداد قيمته بالمقدار واحد كل زمن معين . هذا الزمن يعتمد على تردد الكريستال وبما أننا نستخدم في هذا المثال كريستال ذو تردد أربعة ميجا هيرتز .
إذن الزمن يساوي معكوس ربع التردد . . سأشرح هذه الجملة الآن
4 ميجا قسمة أربعة تساوي واحد ميجا هيرتز ( وهذا ربع التردد)
ونحن لا نريد تردد بل نريد حساب زمن إذن نقول واحد على واحد ميجا أي واحد على مليون = واحد ميكرو ثانية .
إذن سيزداد الرقم الموجود في tmr0 كل واحد ميكرو ثانية ولكن انتبه هذا الكلام يكون صحيح في حالة واحدة وهو أن prescaler يساوي 1:1 .
والـ prescaler هي خاصية تسمح بأن نتحكم في الزمن الذي يجعل tmr0 يزداد .
فيمكننا جعله واحد إلى واحد فتكون حساباتنا السابقة صحيحة أو نجعله بقيم أخرى كما هو في الداتاشيت مثل القيمة 1:256 .
ولكن ماذا يعني أن الـ prescaler يساوي واحد إلى مئتين وستة وخمسين .
هذا يعني أن كل 256 نبضة (زمن النبضة في مثالنا قمنا بحسابه وهو واحد ميكرو ) تجعل تايمر زيرو يزداد بمقدار واحد .
أعيدها مرة أخرى كل 256 نبضة تزيد tmr0 بالمقدار واحد .
وبما أن كل نبضة تستغرق ميكروثانية إذن سيزداد قيمة التايمر زيرو كل 256 ضرب واحد ميكرو .
أي تزداد قيمة التايمر زيرو كل 256 ميكروثانية
وفي المثال الذي ذكرته أخي الكريم نريد أن نختبر هل وصلت قيمة التايمر زيرو إلى 128 أم لا .
ولحساب الزمن الذي سيستغرقه تايمر زيرو حتى يصل إلى 128 .
سنضرب الرقم 128*256 ميكرو ثانية . لأن تايمر زيرو يزاد بواحد كل 256 مايكرو وبما أنه زاد 128 مرة إذن سنضرب 256 في 128 فنحصل على الناتج 32768 ميكرو
أي يساوي تقريبا 32.8 ملي ثانية
إذن لكي يصبح تايمر زيرو يساوي 128 سيستغرق هذا ن الزمن 32.8 ملي ثانية
والآن لنكتب كود يختبر هل وصلنا لهذه القيمة أم لا كل ما نحتاجه هو اختبار البت رقم سبعة في تايمر زيرو لأن البت رقم سبعة يمثل الرقم 128 كيف هذا ؟؟
10000000 هذا الرقم بالنظام الثنائي ( البايناري) يكافئ الرقم 128 بالنظام العشري
المثال يقول
كود:
again btfss tmr0, 7 ; if bit 7 = 1
goto again ; no, then check again
return
اي اختبر البت رقم سبعة من المسجل tmr0 هل هو بواحد أم لا إذا كان بواحد اقفز وإن لم يكن بواحد نفذ الأمر التالي .
والأمر التالي يجعل الميكرو يعيد الاختبار بالذهاب إلى again .
والبت رقم سبعة يصبح بواحد عندما تصبح قيمة التايمر زيرو بـ 128 .
===================================
تمنياتي بالتوفيق والتميز دائما وأي سؤال لا تتردد
وكل عام وأنت بخير