بسم الله الرحمن الرحيم
الكود
كود:
char n,m;
int x,i,b;
void interrupt()
{
if(intcon.f1==1)
{
x++;
intcon.f1=0;
}
}
void main()
{
trisb=0;
trisb.f0=1;
trisa=0xff;
portb=0;
intcon=0b10110000;
option_reg=0b10111000;
start:
portb=0;
i=1;
b=0;
n=0;
m=0;
if(porta.f0==1)
{ x=0;
while(x<2000) { }
x=0;
tmr0=0;
while(x<18000)
{
if(x==(5*i)+b)
{portb.f1=portb.f0; n=1;}
else {portb.f1=0;
if(n==1){n=0;i++;b++;}
}
if(tmr0==5)
{portb.f2=porta.f4; m=1;}
else {portb.f2=0;
if(m==1){m=0;tmr0=0;}
}
}
}
goto start;
}
شرح البرنامج بشكل عام
اولا نقوم بتعريف متغير X يقوم بحساب عدد ال Pulses الداخلة من RB0 وذلك بالاستفادة من المقاطعات بحيث نقوم بتنفيذ البرنامج الاساسي وعند دخول Pulse تتم المقاطعة ويزيد المتغير X بواحد وهكذا، وبالنسبة لل Pulses الداخلة من RA4 فقد استفدت من السجل tmr0 واستخدمته كعداد خارجي (اي كل Pulse داخلة لل RA4 تزيد tmr0 بواحد وهكذا)
لفهم المقاطعات بشكل اكبر يرجى الرجوع للموضوع التالي
المقاطعات وكيفية الاستفادة منها..
في البرنامج الاساسي
1- ننتظر الى ان يتم الضغط على مفتاح بدء العد الذي في المنفذ RA0
2- من ثم ننتظر الى ان يكون العدد في المتغير X هو 2000
3- من ثم نقوم بتصفير المتغير X ، ونفحص المتغير X الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RB0 يخرج من المنفذ RB1 (وهي ال Pulse رقم 6) ، ومرة اخرى نفحص المتغير X الى ان يصل للرقم 11 فنجعل بعد ذلك ما سيدخل للمنفذ RB0 يخرج من المنفذ RB1 (وهي ال Pulse رقم 12)، وهكذا .... ولا ننسى انه في نفس الوقت يتم فحص السجل tmr0 الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RA4 يخرج من المنفذ RB2 (وهي ال Pulse رقم 6) ومن ثم نصفر ال tmr0 ومرة اخرى نفحص السجل tmr0 الى ان يصل للرقم 5 فنجعل بعد ذلك ما سيدخل للمنفذ RA4 يخرج من المنفذ RB2 (وهي ال Pulse رقم 12) وهكذا...
4- الى ان يصل الرقم في المتغير X الى الرقم 18000 (لان 18000 مع 2000 السابقة تكون 20000) يعيد تنفيذ البرنامج من جديد.
شرح الكود
كود:
char n,m;
int x,i,b;
تعريف للمتغيرات
n,m من النوع char لان الرقم الذي سيحفظ بهم لن يتجاوز 2
x,i,b من النوع int لان الرقم الذي سيحفظ بهم يصل لاكبر من 3000
كود:
void interrupt()
{
if(intcon.f1==1)
{
x++;
intcon.f1=0;
}
}
برنامج المقاطعة الذي يعمل على تزايد X كلما دخلت بلس من RB0
كود:
trisb=0; // PrttB is output
trisb.f0=1; // RB0 is input
trisa=0xff; // PortA is input
portb=0; // reset portB
الشرح امامهم
كود:
intcon=0b10110000;
option_reg=0b10111000;
الاعدادات الخاصة بعمل المقاطعات
كود:
start: // label
portb=0; // reset portB
i=1; // set i to 1
b=0; // reset
n=0; // reset
m=0; // reset
الشرح امامهم
لفحص اذا ما تم الضغط على مفتاح بدء العد ينفذ ما بعده من اوامر
كود:
x=0; // reset x
while(x<2000) { } // wait until x = 2000
يصفر المتغير X ومن ثم ينتظر الى ان تدخل 2000 بلس (اي يصبح العدد في X هو 2000)
يصفر كلا من X و tmr0 ليتم الحساب من البداية
كود:
while(x<18000)
{
if(x==(5*i)+b)
{portb.f1=portb.f0; n=1;}
else {portb.f1=0;
if(n==1){n=0;i++;b++;}
}
if(tmr0==5)
{portb.f2=porta.f4; m=1;}
else {portb.f2=0;
if(m==1){m=0;tmr0=0;}
}
}
الامر while(x<18000) ينفذ الاوامر المحصورة بين حاصرتيه الى ان يصل عدد البلس 18000 ومن ثم يخرج
كود:
if(x==(5*i)+b)
{portb.f1=portb.f0; n=1;}
يفحص اذا ما وصل العدد في X الى 5 او 11 او 17 او ...... يقوم بجعل البلس التالية تخرج من RB1 ويجعل n=1
كود:
else {portb.f1=0;
if(n==1){n=0;i++;b++;}
في حال عدم تحقق الشرط السابق يقوم بتصفير المنفذ RB1 ويتأكد هل n=1 فاذا ساوت 1 يقوم بتصفير n ويزيد كل من i, b بواحد
كود:
if(tmr0==5)
{portb.f2=porta.f4; m=1;}
else {portb.f2=0;
if(m==1){m=0;tmr0=0;}
}
نفس ما في السابق
عند وصول عدد البلس الى 18000 يخرج من حلقة While وينفذ هذا الامر الذي يعيد البرنامج من البداية.
ارجو ان اكون قد اوضحت البرنامج بشكل واضح واذا في اي غموض في مكان محدد فاشر اليه وان شاء الله نوضحه
بالتوفيق بإذن الله.