هذه الطريقة تستخدم فكرة خوارزمية بريزنهام في رسم الخطوط
نحن هنا سنستخدمها في ضبط زمن واحد ثانية كمثال:
فرضاً لدينا كرستالة ذات تردد 4 ميقاهيرتز، هذا يعطي زمن دورة 1 ميقا هيرتز ولدينا 256 دورة(الزمن الذي يأخذه تايمر زيرو لكي يحدث اوفر فلو)ـ
ولدينا بريسكيلر (prescaler)بتقسيم 64 اذن كل طفح للتايمر زيرو يمثل: 256*64=16384 microseconds
نحن نبدأ العد باستخدام متغير يأخذ مثلا قيمة 1,000,000 (ميكرو ثانية أي 1 ثانية)ـ
هذا العدد بفرض اننا اخترنا ان تكون الفترة واحد ثانية
فعندما يحدث انتربت للتايمر زيرو اوفرفلو interrupt of timer0 overflow عندما تحدث هذه المقاطعة نقوم بطرح 16384 من الرقم الثابت وهنا هو 1,000,000 فإذا اصبح العداد بقيمة سالبة نحدث الزمن اي نضيف واحد ثانية للرقم المظهر دلالة على مرور واحد ثانية ، ثم نضيف 1,000,000 مرة اخرى.
بالتأكيد الثانية الأولى كان بها خطأ وهو الذي يظهر بقيمة سالبة في العداد، لكن عندما نضيف الرقم 1,000,000 فإن الخطأ في الثانية السابقة يطرح من الثانية التالية لها، وينعدم الخطأ تماماً في دورة ثانيتين.(متوسط ا لخطأ =0).
هذه الطريقة تعطي زمن دقيق 100% كما يمكن تطبيقها على اي نوع من الميكرو كنترولات وكل انواع الكريستالة مهما كان ترددها ، كما يمكن ان نحدد الفترة الزمنية اي زمن اقل او اكثر من واحد ثانية.
للأمانة هذه الفكرة منقولة من بوست بلغة اجنبية من الموقع وأرجو من ذوي الخبرة وضع كود كامل يعطي واحد ثانية فقط وسيكون باقي الأضافة عليه سهلة
http://www.massmind.org/techref/post...Black&tgt=post
Read more:
http://www.qariya.com/vb/newthread.p...#ixzz1NIJK6yWE