تفضل اخي شرح البرنامج واي استفسار انا جاهز
كود:
#include <mega8.h>
unsigned char x0=0,x1=0,x2=0,x3=0,x4=0,x5=0,x6=0,x7=0; //تعريف المتغيرات لاستخدامها في البرنامج
unsigned char y0=0,y1=0,y2=0,y3=0,y4=0,y5=0,y6=0,y7=0,V0=0,V1=0,V2=0,V3=0,V4=0,V5=0,V6=0,V7=0;
bit u0=0,u1=0,u2=0,u3=0,u4=0,u5=0,u6=0,u7=0,z=0,z1=0;
//////////////////////////////////////////////////////////////////////////
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //هذا التايمر نحدد به اقل جزء نريد ان نقسم عليه
{ //الزمن الدوري الكامل وهنا اخترنا40ميكرو ثانية
TCNT0=0xD7;
z=1; //هذا البت وضعناه في التايمر ليكون شرطا لتنفيذ التعليمات اللتى يجب ان تكون
} //داخل التايمرولكن ننفذها خارج التايمر
/////////////////////////////////////////////////////////////////
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // هذا التايمر نحدد به الزمن الدوري الكامل للنبضة
{ //وهنا اخترنا 10 ميلي ثانية
TCNT1H=0xFB1D >> 8;
TCNT1L=0xFB1D & 0xff;
z1=1; //هذا البت وضعناه في التايمر ليكون شرطا لتنفيذ التعليمات اللتى يجب ان تكون
} //داخل التايمرولكن ننفذها خارج التايمر
//////////////////////////////////////////////////////////////
void main(void)
{
PORTB=0x00;
DDRB=0xFF; //هنا تعريف المداخل والمخارج
PORTD=0xFF;
DDRD=0x00;
TCCR0=0x02;
TCNT0=0xD7;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xFB;
TCNT1L=0x1D;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=0x05;
#asm("sei")
///////////////////////////////////////////////////////////////////
while (1) //البرنامج الرئيسي
{
if(z==1) //هنا عند حدوث مقاطعة التايمر الاول كل 40ميكرو ثانية يتم الدخول الى هذا الشرط
{ //y وتصفير البت من اجل بدء دورة جديدة وزيادة كل متغيرات
z=0;
y0++;y1++;y2++;y3++;y4++;y5++;y6++;y7++;
}
/////////////////////////////////////////////////////
if(z1==1) //عند حدوث مقاطعة التايمر الثاني كل 10 ميلي ثانية يتم الدخول الى هذا الشرط
{ //وتصفير البت من اجل بدء دورة جديدة ووضع 5 فولت على كامل البورت اللذي نريد
//y او على اي قطب نريده من المايكروونقوم بتصفير جميع متغيرات
// المسئولة عن التاخير الزمني بين كل زيادةV ونقوم بزيادة متغيرات
z1=0;
PORTB=255;
y0=0;y1=0;y2=0;y3=0;y4=0;y5=0;y6=0;y7=0;
V0++;V1++;V2++;V3++;V4++;V5++;V6++;V7++;
}
/////////////////////////////////////////////////////////////////
if(V0>=5){x0++;V0=0;} // خمس مرات يعني كل 50ميلي ثانية سيدخل يصفر المتغير V هناعند زيادة متغير
// y0 اللتي سيتم مقارنتها مع x0 ويزيد
if(x0>=249)x0=0; //عند وصول متغير اكس الى 250يعني تقريبا كامل الزمن الدوري وهي 10ميلي تقسيم 40مايكرو نصفر اكس للبدء بدورة جديدة
//Vنقوم بتغيير قيمة BWM لكل مخرج شرط وهنا 8 شروط لتمن مخارج وللتحكم بسرعة ال
if(V1>=10){x1++;V1=0;}
if(x1>=249)x1=0;
if(V2>=15){x2++;V2=0;}
if(x2>=249)x2=0;
if(V3>=5){x3++;V3=0;}
if(x3>=249)x3=0;
if(V4>=5){x4++;V4=0;}
if(x4>=249)x4=0;
if(V5>=5){x5++;V5=0;}
if(x5>=249)x5=0;
if(V6>=5){x6++;V6=0;}
if(x6>=249)x6=0;
if(V7>=5){x7++;V7=0;}
if(x7>=249)x7=0;
/////////////////////////////////////////////////////////////////////
if(y0>=x0)PORTB.0=0; // نقوم باطفاء المخرج الذي x مساوية ل y عند وصول قيمة
//شغلناه اثناء الدخول لتايمر الزمن الدوي
if(y1>=x1)PORTB.1=0;
if(y2>=x2)PORTB.2=0;
if(y3>=x3)PORTB.3=0;
if(y4>=x4)PORTB.4=0;
if(y5>=x5)PORTB.5=0;
if(y6>=x6)PORTB.6=0;
if(y7>=x7)PORTB.7=0;
////////////////////////////////////////////////////////////////////
}
}