قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 08-01-2020, 06:49 AM المشاركة 105   
افتراضي



الأن تم تطوير البرنامج ليصبح عداد ذاتي أو ساعة ايقاف


الدائرة




كود
كود:
 

     unsigned short mask(unsigned short num);
     unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,SEGMENT6=0,SEGMENT7=0,SEGMENT8=0;
     unsigned int X=0,START=0;
     
    #define REST_ALL SEGMENT1=0; SEGMENT2=0; SEGMENT3=0; SEGMENT4=0; SEGMENT5=0; SEGMENT6=0; SEGMENT7=0; SEGMENT8=0;
      
    //Timer0
    //Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms

    //Place/Copy this part in declaration section
    void InitTimer0(){
    OPTION_REG	 = 0x82;
    TMR0		 = 6;
    INTCON	 = 0xA0;
  }

    void Interrupt(){
    if (TMR0IF_bit){
    TMR0IF_bit = 0;
    TMR0       = 6;
    //Enter your code here   START
    

    X++;
    if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
    if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
    if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }



  }
}

            void main() {
          TRISB=0; PORTB=0;
          TRISD=7; PORTD=0;
          TRISC=0; PORTC=0;
          InitTimer0();
          while(1){

         if(START==1){SEGMENT8++; delay_ms(30);}

          if( PORTD.F0==1 ) { START=1; delay_ms(250);}
          if( PORTD.F1==1 ) { START=0; delay_ms(250);}
          if( PORTD.F2==1 ) { REST_ALL delay_ms(250);}
          
      if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
      if( SEGMENT7 >9  ) { SEGMENT7=0;  SEGMENT6 ++;  }
      if( SEGMENT6 >9  ) { SEGMENT6=0;  SEGMENT5 ++;  }
      if( SEGMENT5 >9  ) { SEGMENT5=0;  SEGMENT4 ++;  }
      if( SEGMENT4 >9  ) { SEGMENT4=0;  SEGMENT3 ++;  }
      if( SEGMENT3 >9  ) { SEGMENT3=0;  SEGMENT2 ++;  }
      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1 ++;  }
      if( SEGMENT1 >9  ) { REST_ALL     START=0;      }
  }
  }
    
  unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;

 
}
}

هذا العداد هوا ذاتي العد مكون من 8 شاشات اول شاشتين
من اليمين لعد اللحظات
وتاني شاشتين لعد السواني
وثالث شاشتين لعد الدقائق
ورابع شاشتين لعد الساعات

مفتاح UP. . . لتشغيل العداد
مفتاح DWEN لإيقاف العداد
مفتاح REST . لتصفير العداد

القادم شرح البرنامج



التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 08-01-2020 الساعة 06:53 AM
اعلانات

salim2
:: مهندس ::
تاريخ التسجيل: Aug 2007
الدولة: الجزائر
المشاركات: 38
نشاط [ salim2 ]
قوة السمعة:
قديم 08-01-2020, 12:32 PM المشاركة 106   
افتراضي


جزاك الله خيرا أستاذنا الفاضل وجعلها في ميزان حسناتك.

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,679
نشاط [ مسلم11 ]
قوة السمعة:
قديم 08-01-2020, 09:58 PM المشاركة 107   
افتراضي


شكرا لك اخي الكريم عرض مع شرح رائعين
عندما كتبت البرنامج و هممت ببناءه لتوليد ملف hex ظهرت لدي هذه الرسالة .
لم اشأ فعل شيء حتى استشريك
بارك الله بك

مبارك الترقية ياذهب .


التعديل الأخير تم بواسطة : مسلم11 بتاريخ 09-01-2020 الساعة 03:36 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 09-01-2020, 02:30 AM المشاركة 108   
افتراضي


شكرا لك اخي الكريم عرض مع شرح رائعين
عندما كتبت البرنامج و هممت ببناءه لتوليد ملف hex ظهرت لدي هذه الرسالة .
لم اشأ فعل شيء حتى استشريك
بارك الله بك
السلام عليكم ورحمه الله

أخي هل تم نسخ الكود ووضعة في مشروع جديد !!
واضح انه سقت من بعض التعليمات بالسهو ..

الكود كامل
كود:
  
     // ENG / ABDALLA HEGAZY **
    // DATA / 2019/12/30     **
    // controller            **


  #define  MOTOR_vibrator_M11     PORTC.F7
  #define  MOTOR_Mixing_M62      PORTC.F6
  #define  Helical_motor_M61      PORTC.F5
  #define  MOTOR_Y33              PORTC.F4
  #define  MOTOR_Water_valve_Y32  PORTA.F5
  #define SENSOR_LEVEL_1  PORTD.F2
  #define SENSOR_LEVEL_2  PORTD.F3
  #define SENSOR_LEVEL_3  PORTD.F4
  #define SENSOR_LEVEL_4  PORTD.F5
  #define SENSOR_LEVEL_5  PORTD.F6
  #define SENSOR_LEVEL_6  PORTD.F7
  #define END_ALL   Helical_motor_M61 =0;  MOTOR_Y33 =0; MOTOR_Mixing_M62 =0; MOTOR_vibrator_M11=0; MOTOR_Water_valve_Y32 =0;
  #define BEZR  PORTD.F1=1; delay_ms(350); PORTD.F1=0; delay_ms(200);
  #define BEZRR  PORTD.F1=1; delay_ms(270); PORTD.F1=0; delay_ms(50);  PORTD.F1=1; delay_ms(270); PORTD.F1=0; delay_ms(1500);
  #define END_OFF  PORTD.F1=1; delay_ms(3000); PORTD.F1=0; delay_ms(50);
   unsigned X1=0,X2=0,X3=0,M=0,A=0;
   unsigned DATA_SHOW=0,DATA_SHOW2=0;
   unsigned W1=0,W2=0,W3=0,W4=0,W5=0;
   //===================================//
     //Timer0
    //Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms

    //Place/Copy this part in declaration section
    void InitTimer0(){
    OPTION_REG	 = 0x82;
    TMR0	 = 6;
    INTCON	 = 0xA0;
  }

    void Interrupt(){
    if (TMR0IF_bit){
    TMR0IF_bit	 = 0;
    TMR0	 = 6;
    //Enter your code here
    
       if ( W2==1 ){ W3++; }
       if ( W3==250 ){PORTE.F0=1; }
       if ( W3==550 ){PORTE.F0=0; W3=0; }
       
       if ( W4==1 ){ W5++; }
       if ( W5==250 ){PORTB.F7=1; }
       if ( W5==550 ){PORTB.F7=0; W5=0; }
    
  }
}

 //===================================//
   
   
       void AUTO() {


       W1=0;   W2=1;
       while(X1==0){
      if (Button(&PORTE, 1, 10, 0)){END_ALL END_OFF X1=1;  }  //END PROGRAM //
       while(X1==0)
   {
      if(W1==0 ){
      MOTOR_vibrator_M11=1; MOTOR_Water_valve_Y32 =1; W1=1; }
     if (Button(&PORTE, 1, 10, 0)){END_ALL  X1=1;  }  //END PROGRAM //
     if( SENSOR_LEVEL_1 ==1  ){ MOTOR_Mixing_M62 =1; }
     if( SENSOR_LEVEL_2 ==1 ){ Helical_motor_M61 =1; }
     if( SENSOR_LEVEL_3 ==1 ){ MOTOR_vibrator_M11=0; }
     if( SENSOR_LEVEL_4 ==1 )
    {
  MOTOR_Water_valve_Y32 =0; for(X3=0; X3<M; X3++){ delay_ms(60000); }
  MOTOR_Y33 =1;
     X1=1;
   }
   
   }
     X1=0;
      while( X1==0 )
    {
       if (Button(&PORTE, 1, 10, 0)){END_ALL END_OFF X1=1;  }  //END PROGRAM //
      if( SENSOR_LEVEL_1 ==0){
      for(X3=0; X3<M; X3++){ delay_ms(60000); }
      END_ALL
      X1 =1;
      }
   }
     delay_ms(1000);
    if (Button(&PORTE, 1, 10, 1)){ delay_ms(50); X1=0; }
     X1=1;  W2=0; PORTE.F0=0;
 }
 
}
  //====================================//
  //************************************//
        void MANUAL() {

         W1=0;   W4=1;
       while(X1==0){

       while(X1==0)
   {

      if(W1==0 ){
      MOTOR_vibrator_M11=1; MOTOR_Water_valve_Y32 =1; W1=1; }

     if( SENSOR_LEVEL_1 ==1  ){ MOTOR_Mixing_M62 =1; }
     if( SENSOR_LEVEL_2 ==1 ){ Helical_motor_M61 =1; }
     if( SENSOR_LEVEL_3 ==1 ){ MOTOR_vibrator_M11=0; }
     if( SENSOR_LEVEL_4 ==1 )
    {
  MOTOR_Water_valve_Y32 =0; for(X3=0; X3<M; X3++){ delay_ms(60000); }
  MOTOR_Y33 =1;
     X1=1;
   }

   }
     X1=0;
      while( X1==0 )
    {

      if( SENSOR_LEVEL_1 ==0){
      for(X3=0; X3<M; X3++){ delay_ms(60000); }
     END_ALL
      X1 =1;
      }
   }
     X1=0; delay_ms(1000);
    if (Button(&PORTE, 1, 10, 1)){END_ALL END_OFF X1=1; W4=0; PORTB.F7=0; }
 }
  W4=0;
}
   //===========================================//
      void SET_PROGRAM() {
     PORTB.F0=1;
     PORTD.F1=1; delay_ms(800);  PORTD.F1=0; delay_ms(500);
     PORTD.F1=1; delay_ms(800);  PORTD.F1=0; delay_ms(500);
      X2=0;

       while(X2==0)
    {
       PORTB.F1=1;
      if(PORTC.F1==1){BEZR M ++;  }
      if(PORTC.F2==1){BEZR M =0;  }
      if(PORTC.F3==1){BEZR  X2=1;  }
      if( M > 20 ){ M =0;  }

    }  EEPROM_Write(0, M);  delay_ms(10);


      X2=0;  PORTB.F2=1;  PORTB.F1=0;
      while(X2==0)
    {
      if(PORTC.F1==1){BEZR A ++;  }
      if(PORTC.F2==1){BEZR A =0;  }
      if(PORTC.F3==1){BEZR  X2=1;  }
       if( A > 20 ){ A =0;  }
    }   
       PORTB.F0=0;  PORTB.F2=0;
        X2=0;  EEPROM_Write(1, A);  delay_ms(10);
    }

 //===========================================//
  //************************************//
         void main() {
        TRISB=0;   PORTB=0;
        TRISD=252; PORTD=0;
        TRISC=15; PORTC=0;
        TRISA=1;   PORTA=0;
        TRISE=6;   PORTE=0;
        ADC_Init();  // Initialize ADC module with default settings  //
        adcon1=0x07;
        InitTimer0();
       BEZRR BEZRR  BEZRR delay_ms(250);


       M = EEPROM_Read(0);
       A = EEPROM_Read(1);

       /*EEPROM_Write(0, 0);
        EEPROM_Write(1, 0);
        EEPROM_Write(2, 0);
        EEPROM_Write(3, 0);*/


     //====================//

       while(1){
       PORTE.F0=0;
       PORTB.F7=0;
     if (Button(&PORTC, 0, 10, 1)) {BEZR delay_ms(350); SET_PROGRAM();} // SET //
   
     if (Button(&PORTE, 1, 10, 1)) 
     {
       delay_ms(5000);
       if (Button(&PORTE, 1, 10, 1)){ X1=0;  BEZR  AUTO(); }
     }
     
     if (Button(&PORTE, 2, 10, 1)) 
     {
        delay_ms(5000);
        if (Button(&PORTE, 2, 10, 1)){ X1=0;  BEZR  MANUAL(); }

     }
   
   
    }
   }

يجب وضع تعريف للعنوان
كود:
 #define
ولاجظ توجد عناوين بدون تعريف وهذا خطأ عند توليد ملف hex سوف تظهر لك رسالة خطأ من المترجم ..

يجب أن نكتب تعريف قبل العنوان
كود:
 #define
ليصبح العنوان هكذا
كود:
#define  MOTOR_Y33   PORTC.F4
ويجب وضع مسافة بين تعريف العنوان وأسم العنوان وايضا وضع مسافة بين أسم العنوان والتعليمات بعد أسم العنوان

لاحظ أخي هذة العناوين المستخدمه في البرنامج
كود:
 #define  MOTOR_vibrator_M11     PORTC.F7
  #define  MOTOR_Mixing_M62      PORTC.F6
  #define  Helical_motor_M61      PORTC.F5
  #define  MOTOR_Y33              PORTC.F4
  #define  MOTOR_Water_valve_Y32  PORTA.F5
  #define SENSOR_LEVEL_1  PORTD.F2
  #define SENSOR_LEVEL_2  PORTD.F3
  #define SENSOR_LEVEL_3  PORTD.F4
  #define SENSOR_LEVEL_4  PORTD.F5
  #define SENSOR_LEVEL_5  PORTD.F6
  #define SENSOR_LEVEL_6  PORTD.F7
  #define END_ALL   Helical_motor_M61 =0;  MOTOR_Y33 =0; MOTOR_Mixing_M62 =0; MOTOR_vibrator_M11=0; MOTOR_Water_valve_Y32 =0;
  #define BEZR  PORTD.F1=1; delay_ms(350); PORTD.F1=0; delay_ms(200);
  #define BEZRR  PORTD.F1=1; delay_ms(270); PORTD.F1=0; delay_ms(50);  PORTD.F1=1; delay_ms(270); PORTD.F1=0; delay_ms(1500);
  #define END_OFF  PORTD.F1=1; delay_ms(3000); PORTD.F1=0; de


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 09-01-2020, 02:44 AM المشاركة 109   
افتراضي


نكمل شرح البرنامج

كود:
     unsigned short mask(unsigned short num);
     unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,SEGMENT6=0,SEGMENT7=0,SEGMENT8=0;
     unsigned int X=0,START=0;
     
    #define REST_ALL SEGMENT1=0; SEGMENT2=0; SEGMENT3=0; SEGMENT4=0; SEGMENT5=0; SEGMENT6=0; SEGMENT7=0; SEGMENT8=0;
      
    //Timer0
    //Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms

    //Place/Copy this part in declaration section
    void InitTimer0(){
    OPTION_REG         = 0x82;
    TMR0                 = 6;
    INTCON         = 0xA0;
  }

    void Interrupt(){
    if (TMR0IF_bit){
    TMR0IF_bit = 0;
    TMR0       = 6;
    //Enter your code here   START
    

    X++;
    if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
    if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
    if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }



  }
}

            void main() {
          TRISB=0; PORTB=0;
          TRISD=7; PORTD=0;
          TRISC=0; PORTC=0;
          InitTimer0();
          while(1){

         if(START==1){SEGMENT8++; delay_ms(30);}

          if( PORTD.F0==1 ) { START=1; delay_ms(250);}
          if( PORTD.F1==1 ) { START=0; delay_ms(250);}
          if( PORTD.F2==1 ) { REST_ALL delay_ms(250);}
          
      if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
      if( SEGMENT7 >9  ) { SEGMENT7=0;  SEGMENT6 ++;  }
      if( SEGMENT6 >9  ) { SEGMENT6=0;  SEGMENT5 ++;  }
      if( SEGMENT5 >9  ) { SEGMENT5=0;  SEGMENT4 ++;  }
      if( SEGMENT4 >9  ) { SEGMENT4=0;  SEGMENT3 ++;  }
      if( SEGMENT3 >9  ) { SEGMENT3=0;  SEGMENT2 ++;  }
      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1 ++;  }
      if( SEGMENT1 >9  ) { REST_ALL     START=0;      }
  }
  }
    
  unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;

 
}
}


هنا تم تحديد كل التعليمات الجديدة بالون الأحمر والتعليقات باللون الأخضر وكما نعلم أن التعليقات هي فقط لتوضيح عمل تعليمة معينة والمترجم لا ينظر اليها وعند توليد ملف hex لا ينظر البرنامج للتعليقات ويعتبرها غير موجوده


قد ذكرنا وشرحنا كود التايمر في المشاركة السابقة
والأن نشرح البرنامج وكيف تجري الأمور ونبدأ من دالة البداية
كود:
void main()


ونجد انة توجد تعريفات للبرنامج لكي يفهم ما علية فعلة وما هي حالة المنافذ وتهيئة وتعريف وتشغيل التايمر الداخلي للمتحكم


كود:
 void main() {
          TRISB=0; PORTB=0;
          TRISD=7; PORTD=0;
          TRISC=0; PORTC=0;
          InitTimer0();
كما هوا واضح من دالة البداية ووجود تعليمات التهيئة والتعريف
وهنا تم الإعلان عن وجود دالة فرعية وتم تميز لونها بالأحمر
وهنا عند قرأة البرنامج لتعليمة هذة الدالة يذهب فورا اليها

كود:
//Timer0
    //Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms

    //Place/Copy this part in declaration section
    void InitTimer0(){
    OPTION_REG         = 0x82;
    TMR0                 = 6;
    INTCON         = 0xA0;
  }
هنا بدون الدخول في تفاصيل عن سجلات المتحكم وكيف تم ضبط. اعدادات التايمر وكيف تم تحديد واختيار الزمن الدوري للتايمر
لأننا استخدمنا أداة توليد كود تعريف وتهيئة التايمر المشروحة
في المشاركة اعلاة وهنا التعليمات الموجودة داخل هذة الدالة
الفرعية هي تعليمات تهيئة وضبط الزمن الدوري للتايمر
وتم ذكر ذالك في التعليق باللون الأخضر
بعد قرأة محتوي هذة الدالة يخرج منها البرنامج ويذهب لأستكمال
عملة ويبدأ من هنا
كود:
  while(1){

         if(START==1){SEGMENT8++; delay_ms(30);}

          if( PORTD.F0==1 ) { START=1; delay_ms(250);}
          if( PORTD.F1==1 ) { START=0; delay_ms(250);}
          if( PORTD.F2==1 ) { REST_ALL delay_ms(250);}
          
      if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
      if( SEGMENT7 >9  ) { SEGMENT7=0;  SEGMENT6 ++;  }
      if( SEGMENT6 >9  ) { SEGMENT6=0;  SEGMENT5 ++;  }
      if( SEGMENT5 >9  ) { SEGMENT5=0;  SEGMENT4 ++;  }
      if( SEGMENT4 >9  ) { SEGMENT4=0;  SEGMENT3 ++;  }
      if( SEGMENT3 >9  ) { SEGMENT3=0;  SEGMENT2 ++;  }
      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1 ++;  }
      if( SEGMENT1 >9  ) { REST_ALL     START=0;      }
  }
  }


وللعلم البرنامج يقرأ التعليمات اسفل دالة البداية مرة واحدة فقط عند توصيل التيار
للدائرة


نبدأ من هذا السطر
كود:
 if(START==1){SEGMENT8++; delay_ms(30);}
وكما هوا واضح انة امر شرط
ويقول هذا الأمر لو قيمة المتغير START==1 هل =1 لو تساوي واحد يتم ذيادة المتغير
كود:
SEGMENT8++; delay_ms(30)
بواحد وينتظر 30 ميلي سانية وهكذا طول ما قيمة START = واحد يدخل ويذيد المتغير SEGMENT8 بواحد


وهنا نأتي لهذه التعليمات
كود:
if( PORTD.F0==1 ) { START=1; delay_ms(250);}
          if( PORTD.F1==1 ) { START=0; delay_ms(250);}
          if( PORTD.F2==1 ) { REST_ALL delay_ms(250);}
ايضا هذة التعليمات هي أوامر شرطية

كود:
 if( PORTD.F0==1 ) { START=1; delay_ms(250);}
هذا الشرط يقول لو البن رقم واحد للمنفذ PORTD هل = 1 ! لو تساوي واحد أجعل قيمة المتغير
كود:
 START=1; delay_ms(250);
تساوي واحد
ولو نلاحظ هنا أن أمر اختبار شرط ذيادة قيمة الشاشة الأولي لن يتحقق الا ايذا كانت قيمة START = واحد وهنا قد علمنا أن
هذا الشرط يجعل START = واحد لكي يتحقق شرط ذيادة أو تشغيل العداد


كود:
 if( PORTD.F1==1 ) { START=0; delay_ms(250);}
هذا الشرط هوا يجعل قيمة المتغير START = صفر وهنا لو المتغير START اصبح قيمتة = صفر سوف يتوق العداد لأن شرط ذيادة العداد قد توقف
ونتكلم هنا عن هذا الشرط
كود:
if(START==1){SEGMENT8++; delay_ms(30);}
هنا لو اصبحت قيمة START = صفر فلن يدخل البرنامج لذيادة قيمة المتغير SEGMENT8


نكمل

كود:
if( PORTD.F2==1 ) { REST_ALL delay_ms(250);}
هنا في هذا الشرط عند تحققة يدخل ويجعل قيمة
كل الشاشات = صفر وايضا يوقف العداد
ونلاحظ تعليمة تصفير الشاشات هذة REST_ALL

وهي عنوان لهذ الكود
كود:
 #define REST_ALL SEGMENT1=0; SEGMENT2=0; SEGMENT3=0; SEGMENT4=0; SEGMENT5=0; SEGMENT6=0; SEGMENT7=0; SEGMENT8=0;
وهكذا عندما يقررأ البرنامج هذا العنوان
يذهب وينفذ كل التعليمات ويجعل قيم كل الشاشات = صفر


وايضا نلاحظ تعليمة
كود:
START=0;
وهي كما شرحنها توقف العداد عن العمل ..

نكمل


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 09-01-2020 الساعة 06:43 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 09-01-2020, 04:14 AM المشاركة 110   
افتراضي


نكمل


كود:
if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
      if( SEGMENT7 >9  ) { SEGMENT7=0;  SEGMENT6 ++;  }
      if( SEGMENT6 >9  ) { SEGMENT6=0;  SEGMENT5 ++;  }
      if( SEGMENT5 >9  ) { SEGMENT5=0;  SEGMENT4 ++;  }
      if( SEGMENT4 >9  ) { SEGMENT4=0;  SEGMENT3 ++;  }
      if( SEGMENT3 >9  ) { SEGMENT3=0;  SEGMENT2 ++;  }
      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1 ++;  }
      if( SEGMENT1 >9  ) { REST_ALL     START=0;      }


في الحقيقة المتحكم لا يفعل شئ من
تلقاء نفسة وبالأحري لا يستطيع فهم شئ
ويجب توجيهه في كل مراحل البرنامج
لذالك تم كتابة هذة التعليمات للسيطرة
علي حالة العداد

ونبدأ من هذا السطر
كود:
if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
هوا أمر شرط أو خلينا نقول أمر مراقبة لقيمة المتغير SEGMENT8 وقد ذكرنا أن العداد يبدأ في العد من SEGMENT8 وهنا يجب تحديد وتقييد قيمة المتغير SEGMENT8 لأن لو لم نحدد له قيمة سوف يذداد قيمتة الي ماشاء الله
ولكي نلاحظ في أمر المراقبة هذا
كود:
 if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
هذا الأمر يقول للو قيمة SEGMENT8 هل هي أكبر من 9 لو وصلت قيمة SEGMENT8 الي أكبر من 9
هنا يتحقق الشرط ويذهب لتنفيذ التعليمات داخل قوسين الشرط
كود:
{ SEGMENT8=0;  SEGMENT7 ++;  }
وهذة التعليمات تقول أجعل SEGMENT8 = صفر وقوم بذيادة SEGMENT7 بواحد
وهنا نلاحظ أن قيمة SEGMENT7 = واحد وقيمة SEGMENT8 اصبحت = صفر
وهنا يظهر لنا علي أول شاشتين من جهة اليمن رقم 10
وهوا بالفعل الرقم اللذي عدة
ولكن نلاحظ ان قيمة SEGMENT8 اصبحت = صفر
وهنا لن يتحقق هذا الشرط
كود:
 if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
ويقوم البرنامج بذيادة قيمة SEGMENT8 بواحد مرة أخري
الي أن تصل قيمتة أكبر من 9
وهنا يتحقق هذا الشرط مرة أخري
كود:
 if( SEGMENT8 >9  ) { SEGMENT8=0;  SEGMENT7 ++;  }
ويدخل يجعل SEGMENT8 = صفر ويذيد SEGMENT7 بواحد وهكذا
تستمر هذة الضورة الي أن تصل قيمة SEGMENT7 أكبر من 9
فهنا يأتي دور الشرط الثاني
كود:
 if( SEGMENT7 >9  ) { SEGMENT7=0;  SEGMENT6 ++;  }
وهنا قيمة SEGMENT7 = أكبر من 9
ويتحقق الشرط ويجعل قيمة SEGMENT7 = صفر
ويقوم بذيادة SEGMENT6 بواحد وهنا نحن في خانة المئات وتستمر الدورات هكذا
الشاشة الأولي تعد 10 عدات لكي وبعدها تذيد الشلشة الثانية بواحد وتبدأ الشاشة الأولي في عد 10 مرة أخري وبعدها تذيد الشاشه الثانية
الي أن تعد الشاشة الثانية 10 عداد تقوم بذيادة الشاشة الثالثة وهكذة
الي عد الثالثة 10 عدات وتذيد الرابعه بواحد الي الوصول
للشاشة االأخيرة
وهذا هو سطر التحكم بها
كود:
 if( SEGMENT1 >9  ) { REST_ALL     START=0;      }
هنا في هذا الشرط
يقول لو اصبحت قيمة الشاشة الأخيرة أكبر من 9
وهنا ستكون كل الشاشات قد عدت هذا الرقم 99999999 وهنا يتحقق الشرط وقد وصل العداد لأخرة
ويتم تصفير جميع الشاشات ايضا بستخدام هذا العنوان REST_ALL
وقد تم شرحة وايضا يتوقف العداد لأن تم جعل قيمة
كود:
 START=0;
= صفر وقد تم شرح دور هذا المتغير في سير البرنامج

نكمل


سوف نشرح كود التايمر وكيف تم التحكم واظهار البيانات علي الشاشات


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 09-01-2020 الساعة 04:49 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 09-01-2020, 05:25 AM المشاركة 111   
افتراضي


نكمل

كود:
void Interrupt(){
    if (TMR0IF_bit){
    TMR0IF_bit = 0;
    TMR0       = 6;
    //Enter your code here   START
    
    X++;
    if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
    if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
    if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }

  }
}


كود اظهار البيانات علي الشاشات قد تم شرحة من قبل
وسوف نتحدث هنا عن حيلة قد تم استخدامها بدلا من أمر الإنتظار

نبدأ من المتغير ++ X

كما علمنا أن وضع علامتين ++ أمام المتغير تعني ان يقوم بذيادة بواحد كل ما يمر علية البرنامج

ونلاحظ هنا أنة لا توجد أوامر انتظار بعد تشغيل كل شاشة
واتفقنا أن المتحكم سريع جداا في تنفيذ
الأوامر ويجب وضع أمر انتظار بعد أمر تشغيل الشاشة
لكي يعطي زمن مناسب لعين الإنسان لطبع الصورة في ذاكرتة
لأن تحدثنا عن طريقة تشغيل الشلاشات وقولنا
أنة بيتم تشغيل أول شاشة من اليسار وينتظر 1 ميكرو سانية
ويطفئ هذة الشاشة ويشغل الشاشة اللتي تليها
من جهة اليسار وهكذا مع باقي الشاشات


لقد حددنا دورة التايمر بواحد ميكرو سانية بمعني أن التايمر يستغرق وقت من بداية التعليمة ++X الي أن يصل الي هذة الأقواس
كود:
}
}
نهاية التعليمات يستغرق وقت واحد ميكرو سانية في كل دور يبدأ من ++X وينتهي الي الأقواس وهنا استغرق 1 ميكرو سانيه


حسننا ماذا سوف يفيدنا هذا الوقت للدورة الواحده
اتفقنا اننا نريد 1 ميكرو سانية بعد تشغيل كل شاشة

وهنا جاء دور المتغير X
وقد تم تعريف هذا المتغير وتحديد قيمتة بصفر
وهنا في بداية تشغيل البرنامج يبدأ من المتغير X
ليجد أن قيمتة = صفر ثم يذيدة بواحد هكذا ++X الأن اصبح المتغير X = واحد
ثم يقوم البرنامج بالمرور علي هذة الأوامر الشرطية


كود:
if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
    if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
    if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }



ولاحظ الشرط المميز بالأحمر هذا
كود:
if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
هذا الشرط. يقول هل X==1 بتساوي واحد لو = واحد نفذ أمر تشغيل الشاشة الأولي
وباقي الأوامر الشرطية غير محققة فهنا ينزل البرنامج الي نهاية القوسين
وهنا قد استغرق البرنامج 1. ميكرو سانية ثم يذهب
الي X مرة. أخري ويذيدة بواحد ليصبح قيمتة = 2 ثم
ينزل البرنامج للأوامر الشرطية

كود:
if(X==1){  PORTC=1;   PORTB = mask ( SEGMENT1 ); }
    if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
    if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }
ونلاحظ ايضا الشرط باللون الأحمر
وهنا للتذكير X=2 حسنا ننظر لهذا الشرط
كود:
 if(X==2){  PORTC=2;   PORTB = mask ( SEGMENT2 ); }
يقول هذا الشرط لو X بتساوي. 2 أخرج علي البن رقم 2 للمنفذ C خمسة فولت لتغذية طرف مشترك أنود الشاشة الثانية وباقي الشاشات لا يصل اليها 5 فولت
وفي نفس الوقت
كود:
PORTB = mask ( SEGMENT2 );
يجعل البورت B. يخرج بيانات بالقيمة المحولة المحفوظة في متغير mask لكي يشعل الشاشة الثانية
وتظل الشاشة الثانيه تعمل ثم ينزل البرنامج ليختبر باقي الشروط
كود:
if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
    if(X==4){  PORTC=8;   PORTB = mask ( SEGMENT4 ); }
    if(X==5){  PORTC=16;  PORTB = mask ( SEGMENT5 ); }
    if(X==6){  PORTC=32;  PORTB = mask ( SEGMENT6 ); }
    if(X==7){  PORTC=64;  PORTB = mask ( SEGMENT7 ); }
    if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }
ليجدا لن تتحقق لأن X بتساوي 2 ثم يذهب للنهاية وصولا للقوصين
وهنا. قد استغرق 1 ميكرو سانية
ثم يذهب الي المتغير X. اعلي الكود ليجده = 2 ثم يقوم بذيادتة
بواحد ليصبح = 3 ثم ينزل للأوامر الشرطية
ليجد الشرط هذا
كود:
 if(X==3){ PORTC=4;   PORTB = mask ( SEGMENT3 );  }
وهذا الشرط يقول لو X = ثلاثة أدخل وأخرج 5 فولت للبن رقم3 في المنفذ PORTC
وبااقي المنفذ صفر. فولت. وهنا طرف مشترك. جميع الشااشات لن يصل اليه فولت
ماعدا الشاشة الثالثة الموصلة علي البن رقم 3
وهنا بنفس الطريقه يخرج داتا علي االمنفذ PORTB = mask لكي يشعل الشاشة
الثالثه
وثم ينزل الي القوسين وهنا ايضا استغرق وقت 1 ميكرو سانية ويذهب الي X

وهكذا الي. تصل قيمة X الي 8
وهنا يتحقق هذا الشرط
كود:
  if(X==8){  PORTC=128; PORTB = mask ( SEGMENT8 );X=0; }
ونفس الشرح ونلاحظ هنا وجود تعليمة تجعل X تساوي صفر لكي يبدأ البرنامج بتشغيل دورة الشاشات من جديد ..

وهنا. زمن التبديل بين الشاشات هوا 1 ميكرو سانية ..
وهنا زمن دورة تشغيل. ال. 8 شاشات هوا 8 ميكرو سانية
ونستنتج هنا أن فرق الزمن من بداية. تشغيل الشاشة الأولي وصولا للأخيرة هوا 8 ميكروسانية
وهنا تتم عملية الخداع البصريي لأن سرعة المشاهد اسرع من سرعة العين وهنا لا يمكننا ملاحظة أن الشاشات تعمل بالتوالي شاشة تلو الأخري ..

وهنا فائدة االتايمر انه يجعل الأولويا لتشغيل الشاشات
ولنعطي مثال تخيل اننا كتبنا أمر أنتظار واحد سانية في دالة البداية
هنا سوف نقول هل. البرنامج سوف ينشغل في تنفيذ أمر الإنتظار وييترك تنفيذ التعليمات الموجوده داخل حلقة التايمر !
الجواب بالطبع لا
ايذا ماذا يحدث
ما يحدث أن البرنامج يبدأ. في تشغيل أمر الإنتظار ويكون التايمر شغال في نفس الوقت وعند تحقق شرط من الشروط الموجودة داخل. حلقة التايمر
في هذة االحالة تحدث. اللمقاطعة وهوا أن يترك.
البرنامج أمر الإنتظار ويذهب الي تنفيذ الشرط الموجود داخل حلقة التايمر
ثم يعود لإستكمال عملة من حيث ذهب
بمعني لو كان انتظر 100 ميكرو من أصل الف وذهب للمقاطعه ثم عاد يكمل علي ال 100 ميكرو اللذي انتظرهم وهكذا ولكن الأولوية للمقاطعات مهما كان المتحكم مشغول عند حدوث مقاطعة يذهب لتنفيذها فوراا
لذالك غير مستحب استخدام اوامر إنتظار داخل حلقة التايمر لأنها تفسد عمله ..


القادم التحدث عن المقاطعات بأمثلة للبرامج


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 09-01-2020 الساعة 06:39 AM

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,679
نشاط [ مسلم11 ]
قوة السمعة:
قديم 09-01-2020, 12:28 PM المشاركة 112   
افتراضي


بداية الف الف مبروك الذهبية للذهب .
تستحق اكثر من ذلك بكثير
تاليا تم شحن البرنامج بفضل الله وجاري بناء الدارة وربطها مع المجسم .
تحياتي



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 06:59 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)