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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 11-03-2015, 06:07 AM المشاركة 17   
افتراضي



ألف شكر لك أخي حسن والله أنكَ أفرحتني بهذا.
منتظر الكود على أحر من الجمر,ولكن أهم شيء هوَ الدقة أخي حسن فأنا لاأريد تضييع النبضات حتى لو كانت نبضة واحدة لكي لاتختلف دقة المكنة.
لايهم أخي أين تكون المداخل والمخارج أنت إختر المداخل والمخارج التي تراها مناسبة.
وبالنسبة للكود أنا سأحاول فهمه إنشاء الله لكي أعرف كيف أستخدمه بالمستقبل.
تفضل هذا الكود
كود:
sbit motor1 at RA0_bit;
sbit motor1_dir at TRISA0_bit;

unsigned int time_stop;
unsigned char flag_stop=0 , flag_run=0;

#define OFF  1
#define ON  0
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x11;
  TMR1IF_bit         = 0;
  TMR1H         = 0x3C;
  TMR1L         = 0xB0;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt()
{
  if(INTF_bit==1 )
     {
      motor1=ON; // Run motor
      INTF_bit=0;
      time_stop=0;// reset time
      flag_run=1;
     }
  if (TMR1IF_bit)
     {
      TMR1IF_bit = 0;
      TMR1H         = 0x3C;
      TMR1L         = 0xB0;
      //Enter your code here
      if(flag_run==1) time_stop++;
     }
}


void main()
{
 cmcon=7;
 InitTimer1();
 TRISB0_bit=1;
 motor1_dir=0;
 motor1=OFF;
 INTEDG_bit=1;// RB0/INT External Interrupt Enable bit
 INTF_bit=0; //RB0/INT External Interrupt Flag bit
 INTEDG_bit=1;// 1 = Interrupt on rising edge of RB0/INT pin
 
 while(1)
       {
        if(flag_run==1 && time_stop>=60)// mean time>=3000ms=3s
            {
             flag_run=0;
             time_stop=0;
             motor1=OFF;
            }

       }

}

البيك المستخدم 16f628a وتردد 8mhz

نبضات تدخل على RB0 ومحرك يعمل على RA0


طبعا انا لاأعرف هل يشتغل محرك لما يكون خرج 0 ام 1 لذا تستطيع التعديل في هذا الكود

كود:
#define OFF  1
#define ON  0
ايضا هل هو محرك واحد او اكثر لان هذا الكود لمحرك واحد فقط ولكن يمكن تطويره لخمسه محركات لان external interrupt=5 وهي
RB0 , RB4, RB5 , RB6,RB7

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 11-03-2015, 06:42 AM المشاركة 18   
افتراضي


بالنسبه لكود أطفاء وتشغيل بأستخدام سويجات

كود:
sbit sw1 at RA2_bit;
sbit sw1_dir at TRISA2_bit;
sbit sw2 at RA3_bit;
sbit sw2_dir at TRISA3_bit;
sbit sw3 at RA4_bit;
sbit sw3_dir at TRISA4_bit;

char sw1_flag=0,sw2_flag=0,sw3_flag=0 ;
char sw1_time=0,sw2_time=0,sw3_time=0 ;

//Timer1

//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON	 = 0x11;
  TMR1IF_bit	 = 0;
  TMR1H	 = 0x3C;
  TMR1L	 = 0xB0;
  TMR1IE_bit	 = 1;
  INTCON	 = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H	 = 0x3C;
    TMR1L	 = 0xB0;
    //Enter your code here
    if(sw1_flag==2)sw1_time++;
    if(sw2_flag==2)sw2_time++;
  }
}

void main() 
{
cmcon=7;
InitTimer1();
 sw1_dir=1;
 sw2_dir=1;
 sw3_dir=1;
trisb=0;
portb=0;
delay_ms(200);
while(1){
         if(sw1==0 ) sw1_flag=1;
         if(sw1==1 && sw1_flag==1)sw1_flag=2;
         if(sw2==0) sw2_flag=1;
         if(sw2==1 && sw2_flag==1)sw2_flag=2;
        if(sw1_flag==2 && sw1_time>=10)// this mean time >= 500
          {
           sw1_flag=0;
           sw1_time=0;
           PORTB.F0=~PORTB.F0;
          }

         if(sw2_flag==2 && sw2_time>=10)// this mean time >= 500
          {
           sw2_flag=0;
           sw2_time=0;
           PORTB.F1=~PORTB.F1;
          }

       }
}
هنا اذا تم ضغط على سويج 1 نجعل flag=1
كود:
  if(sw1==0 ) sw1_flag=1;
ولكن انا اريد ينفذ عندما ارفع يدي من سويج اذن اكتب
كود:
  if(sw1==1 && sw1_flag==1)sw1_flag=2;

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

الصورة الرمزية hussien1995
hussien1995
:: عضو فضي ::
تاريخ التسجيل: Nov 2012
الدولة: syria
المشاركات: 764
نشاط [ hussien1995 ]
قوة السمعة:
قديم 11-03-2015, 04:01 PM المشاركة 19   
افتراضي


شكراً جزيلاً أخي حسن لسرعة ردك.
بالنسبة للكود أنا جربت الكود الثاني ولم يعمل بصراحة ولاأعرف لماذا.
أنا أريد كود لثلاث محركات فالألة يوجد بها ثلاث محاور وكل محول يقوده محرك لذلك أنا أريد نفس الفكرة التي أرسلت صورتها ولكن مضاعفة ثلاث مرات.
وأيضاً أخي أنا أريد أنهُ عندما تصلها نبضة أن تعمل فوراً ولاتنتظر ولا حتى 1ميلي ثانية وعند إنتهاء النبضات تنتظر 3ثواني وبعدها تفصل المخرج.
النبضات التي ستتلقاها البيك هيَ سالبة وليست موجبة.
أتمنى أن تكون الأن الفكرة قد إكتملت لديك,جرب الكود اللذي أرسلته قبل عدت رسائل وهذا اللذي أريده بالضبط والكود عمل ولكن أريد أن ينتظر 3ثانية قبل فصل المخرج.


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 11-03-2015, 04:08 PM المشاركة 20   
افتراضي


هذا كود أخر
حيث هنا يتغير حاله RB0 , RB1 بمجرد الضغط على سويج
اي عكس كود سابق حيث كان لاينفذ الامر حتى ترفع يدك هنا سوف ينفذ الامر واذا استمريت بالضغط على سويج سوف يعمل flashing
فائده الانتربت هو بأمكانك الضغط على كل سويجات في ان واحد وسوف ينفذها معا بدون تأخير
كود:
sbit sw1 at RA2_bit;
sbit sw1_dir at TRISA2_bit;
sbit sw2 at RA3_bit;
sbit sw2_dir at TRISA3_bit;
sbit sw3 at RA4_bit;
sbit sw3_dir at TRISA4_bit;

char sw1_flag=0,sw2_flag=0,sw3_flag=0 ;
char sw1_time=0,sw2_time=0,sw3_time=0 ;

//Timer1

//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x11;
  TMR1IF_bit         = 0;
  TMR1H         = 0x3C;
  TMR1L         = 0xB0;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x3C;
    TMR1L         = 0xB0;
    //Enter your code here
    if(sw1_flag==1)sw1_time++;
    if(sw2_flag==1)sw2_time++;
  }
}

void main() 
{
cmcon=7;
InitTimer1();
 sw1_dir=1;
 sw2_dir=1;
 sw3_dir=1;
trisb=0;
portb=0;
delay_ms(200);
while(1){
         if(sw1==0 ) sw1_flag=1;
         if(sw2==0 ) sw2_flag=1;
        if(sw1_flag==1 && sw1_time>=10)// this mean time >= 500
          {
           sw1_flag=0;
           sw1_time=0;
           PORTB.F0=~PORTB.F0;
          }

          if(sw2_flag==1 && sw2_time>=10)// this mean time >= 500
          {
           sw2_flag=0;
           sw2_time=0;
           PORTB.F1=~PORTB.F1;
          }

       }
}


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 11-03-2015, 04:57 PM المشاركة 21   
افتراضي


شكراً جزيلاً أخي حسن لسرعة ردك.
بالنسبة للكود أنا جربت الكود الثاني ولم يعمل بصراحة ولاأعرف لماذا.
أنا أريد كود لثلاث محركات فالألة يوجد بها ثلاث محاور وكل محول يقوده محرك لذلك أنا أريد نفس الفكرة التي أرسلت صورتها ولكن مضاعفة ثلاث مرات.
وأيضاً أخي أنا أريد أنهُ عندما تصلها نبضة أن تعمل فوراً ولاتنتظر ولا حتى 1ميلي ثانية وعند إنتهاء النبضات تنتظر 3ثواني وبعدها تفصل المخرج.
النبضات التي ستتلقاها البيك هيَ سالبة وليست موجبة.
أتمنى أن تكون الأن الفكرة قد إكتملت لديك,جرب الكود اللذي أرسلته قبل عدت رسائل وهذا اللذي أريده بالضبط والكود عمل ولكن أريد أن ينتظر 3ثانية قبل فصل المخرج.
تفضل هذا لثلاث محركات
كود:
sbit motor1 at RA0_bit;
sbit motor1_dir at TRISA0_bit;
sbit motor2 at RA1_bit;
sbit motor2_dir at TRISA1_bit;
sbit motor3 at RA2_bit;
sbit motor3_dir at TRISA2_bit;

unsigned int time1_stop , time2_stop,time3_stop;
unsigned char flag1_run, flag2_run=0 ,flag3_run=0 ;

#define OFF  1
#define ON  0
//Timer1
//Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x11;
  TMR1IF_bit         = 0;
  TMR1H         = 0x3C;
  TMR1L         = 0xB0;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt()
{
  if(RBIF_bit==1 )
    {
     RBIF_bit=0;
     if(RB4_bit==1)
       {
        motor1=ON; // Run motor
        time1_stop=0;// reset time
        flag1_run=1;
       }
       
       if(RB5_bit==1)
       {
        motor2=ON; // Run motor
        time2_stop=0;// reset time
        flag2_run=1;
       }
       
       if(RB6_bit==1)
       {
        motor3=ON; // Run motor
        time3_stop=0;// reset time
        flag3_run=1;
       }
    }

  if (TMR1IF_bit)
     {
      TMR1IF_bit = 0;
      TMR1H         = 0x3C;
      TMR1L         = 0xB0;
      //Enter your code here
      if(flag1_run==1) time1_stop++;
      if(flag2_run==1) time2_stop++;
      if(flag3_run==1) time3_stop++;
     }
}


void main()
{
 cmcon=7;
 InitTimer1();
 TRISB4_bit=1;
 TRISB5_bit=1;
 TRISB6_bit=1;
 motor1_dir=0;
 motor2_dir=0;
 motor3_dir=0;
 motor1=OFF;
 motor2=OFF;
 motor3=OFF;
 RBIE_bit=1;//Enables the RB port change Interrupt
 RBIF_bit=0;//When at least one of the RB<7:4> pins changes state (must be cleared in software)
 

 while(1)
       {
        if(flag1_run==1 && time1_stop>=60)// mean time>=3000ms=3s
            {
             flag1_run=0;
             time1_stop=0;
             motor1=OFF;
            }
        if(flag2_run==1 && time2_stop>=60)// mean time>=3000ms=3s
            {
             flag2_run=0;
             time2_stop=0;
             motor2=OFF;
            }
            
         if(flag3_run==1 && time3_stop>=60)// mean time>=3000ms=3s
            {
             flag3_run=0;
             time3_stop=0;
             motor3=OFF;
            }
       }

}
ملاحظات //
1- يتم ربط نبضات على RB4 وهذا بدوره يشغل محرك 1 مربوط على RA0
2- يتم ربط نبضات على RB5 وهذا بدوره يشغل محرك 2 مربوط على RA1
3- يتم ربط نبضات على RB6 وهذا بدوره يشغل محرك 3 مربوط على RA2

4- يتم ربط مقاومه 10k مع RB4 و RB5 و RB6 من نوع pull down

5- اذا كانت نوع نبضه مرسله من كومبيوتر هي من 0 الى 1 فهنا يحتاج البيك الى دائره NOT لانه الانتربت يعتمد على 1 يعني لما تصل 1 الى RB4 او RB5 او RB6 يحدث الانتربت


ممكن صوره النبضات الى ترسل للبيك لوضع دائره مقترحه

طبعا هي تعمل ولكن ربما سوف تخسر نبضه واحده


الصورة الرمزية hussien1995
hussien1995
:: عضو فضي ::
تاريخ التسجيل: Nov 2012
الدولة: syria
المشاركات: 764
نشاط [ hussien1995 ]
قوة السمعة:
قديم 11-03-2015, 07:55 PM المشاركة 22   
افتراضي


شكراً أخي حسن الكود الأخير هوَ اللذي كنت أريده بارك الله بك.
بالنسبة للنبضة سوف أجعلها نبضة موجبة مثلما قلت أنت.
أخي حسن هل يمكن تحويل هذا الكود لأحد الأيسيات التالية:
16f676
or
16f630
or
16f84a
لأنه للأسف غير متوفرة حالياً الأيسية 628a وأنا لدي هذه الأيسيات فهل يمكن تحويل الكود لأحد هذه الأيسيات؟؟؟
وألف شكر لك أخي حسن ماقصرت


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 11-03-2015, 08:36 PM المشاركة 23   
افتراضي


شكراً أخي حسن الكود الأخير هوَ اللذي كنت أريده بارك الله بك.
بالنسبة للنبضة سوف أجعلها نبضة موجبة مثلما قلت أنت.
أخي حسن هل يمكن تحويل هذا الكود لأحد الأيسيات التالية:
16f676
or
16f630
or
16f84a
لأنه للأسف غير متوفرة حالياً الأيسية 628a وأنا لدي هذه الأيسيات فهل يمكن تحويل الكود لأحد هذه الأيسيات؟؟؟
وألف شكر لك أخي حسن ماقصرت
pic 16f84a , 8mhz

كود:
sbit motor1 at RA0_bit;
sbit motor1_dir at TRISA0_bit;
sbit motor2 at RA1_bit;
sbit motor2_dir at TRISA1_bit;
sbit motor3 at RA2_bit;
sbit motor3_dir at TRISA2_bit;

unsigned int time1_stop , time2_stop,time3_stop;
unsigned char flag1_run, flag2_run=0 ,flag3_run=0 ;

#define OFF  1
#define ON  0
//Timer0
//Prescaler 1:256; TMR0 Preload = 61; Actual Interrupt Time : 24.96 ms

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

void Interrupt()
{
  if(RBIF_bit==1 )
    {
     RBIF_bit=0;
     if(RB4_bit==1)
       {
        motor1=ON; // Run motor
        time1_stop=0;// reset time
        flag1_run=1;
       }

       if(RB5_bit==1)
       {
        motor2=ON; // Run motor
        time2_stop=0;// reset time
        flag2_run=1;
       }

       if(RB6_bit==1)
       {
        motor3=ON; // Run motor
        time3_stop=0;// reset time
        flag3_run=1;
       }
    }
  if (TMR0IF_bit){
    TMR0IF_bit	 = 0;
    TMR0		 = 61;
    //Enter your code here
    //Enter your code here
      if(flag1_run==1) time1_stop++;
      if(flag2_run==1) time2_stop++;
      if(flag3_run==1) time3_stop++;
  }
}


void main()
{
 InitTimer0();
 TRISB4_bit=1;
 TRISB5_bit=1;
 TRISB6_bit=1;
 motor1_dir=0;
 motor2_dir=0;
 motor3_dir=0;
 motor1=OFF;
 motor2=OFF;
 motor3=OFF;
 RBIE_bit=1;//Enables the RB port change Interrupt
 RBIF_bit=0;//When at least one of the RB<7:4> pins changes state (must be cleared in software)
 

 while(1)
       {
        if(flag1_run==1 && time1_stop>=60)// mean time>=3000ms=3s
            {
             flag1_run=0;
             time1_stop=0;
             motor1=OFF;
            }
        if(flag2_run==1 && time2_stop>=60)// mean time>=3000ms=3s
            {
             flag2_run=0;
             time2_stop=0;
             motor2=OFF;
            }
            
         if(flag3_run==1 && time3_stop>=60)// mean time>=3000ms=3s
            {
             flag3_run=0;
             time3_stop=0;
             motor3=OFF;
            }
       }

}


الصورة الرمزية hussien1995
hussien1995
:: عضو فضي ::
تاريخ التسجيل: Nov 2012
الدولة: syria
المشاركات: 764
نشاط [ hussien1995 ]
قوة السمعة:
قديم 11-03-2015, 09:15 PM المشاركة 24   
win


تمام أخي حسن الكود عمل بشكل رائع وعلى الواقع بإستخدام ليد والأن سوف أجربه على المحركات وأخبرك النتيجة ولكن هناك شيء ينقص الكود وهوَ ليد بيان لكي يبين أن الدارة تعمل فتومض الليدة عدت مرات قبل أن تعمل الدارة,أنا حاولت إذافة هذا الأمر ولكن لايعمل وأجهل السبب؟؟
شكراً جزيلاً أخي حسن على مساعدتي وجعل الله هذا العمل في ميزان حسناتك



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