البرنامج :
التعليق على خطوات البرنامج :
1- تعليقات الرأس أو مقدمة البرنامج
/*Header******************************************** **********/
2- الإعلان عن متغير : النوع " unsigned" أى " بدون إشارة " وعندما لا يذكر نوع محدد بعده يكون النوع عدد حقيقى "int" – اسم المتغير "cnt"
unsigned cnt; // Define variable cnt
3- دالة المقاطعة أو البرنامج الفرعى (روتين) للمقاطعة أو روتين خدمة المقاطعة ISR وصيغتها :
void interrupt() {
أ- تزايد المتغير cnt
cnt++; // Interrupt causes cnt to be incremented by 1
ب- إرجاع المؤقت TMR0 إلى قيمته الابتدائية .
TMR0 = 96; // Timer TMR0 is returned its initial value
ت- جعل خانة تمكين المقاطعة T0IE فى الحالة المرتفعة set = 1 ومسح (clear = 0 ) خانة علم المقاطعة بالمؤقت TMR0 وهى الخانة T0IF .
INTCON = 0x20; // Bit T0IE is set, bit T0IF is cleared
}
4- الدالة الرئيسية :
void main() {
5- التهيئة أو الإعدادات :
أ- تخصيص "معامل قسمة التردد" Prescaler ليعمل مع المؤقت TMR0 .
OPTION_REG = 0x84; // Prescaler is assigned to timer TMR0
ب- تهيئة جميع أطراف المداخل والمخارج لتكون رقمية .
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
ت- إعداد جميع أطراف المنفذ port B لتعمل كمخارج . و تصفير المنفذ ليصبح فى وضع البداية الآمن .
TRISB = 0; // All port B pins are configured as outputs
PORTB = 0x0; // Reset port B
ث- وضع قيمة ابتدائية بالموقت TMR0 وهى 96 بحيث يقوم بالعد من 96 إلى 255 .
TMR0 = 96; // Timer T0 counts from 96 to 255
ج- إعداد سجل التحكم فى المقاطعة INTCON لتمكين المقاطعة بالمؤقت TMR0
INTCON = 0Xa0; // Enable interrupt TMR0
ح- تصفير متغير العداد cnt
cnt = 0; // Variable cnt is assigned a 0
6- الدخول فى حلقة do{……}while(1) الغير منتهية حيث يجب أو تنفيذ جسم الحلقة كما يلى :
do { // Endless loop
أ- يبدأ جسم الحلقة بتعبير شرطى باستخدام if ويليها بين قوسين شرط تنفيذ الأوامر التالية لها .هذا الشرط هو (cnt == 400) بمعنى هل محتويات متغير العداد وصلت إلى 400 ؟
if (cnt == 400) { // Increment port B after 400 interrupts
ب- إن كانت الإجابة بنعم أى تحقق الشرط فيجب تنفيذ الآتى : تزايد المنفذ PORTB بواحد ووضع النتيجة به مرة أخرى , وتصفير العداد .
PORTB = PORTB++; // Increment number on port B by 1
cnt = 0; // Reset variable cnt
ت- أما إذا كانت الإجابة لا فلا تتم الأوامر السابقة بل يتم الخروج من تعبير الشرط
}
ث- حيث نجد الحلقة الغير منتهية وتؤدى إلى تكرار العملية السابقة .
} while(1);
}
المقاطعة باستخدام المؤقت TMR1 :