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

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 17-09-2014, 04:57 PM المشاركة 137   
افتراضي



اولت ان ارى نتيجة وضع متغير مكان االاخر
بمان قيمة زاية القدح تزداد بمقدار واحد ثم هدا الحاصل نضربه في 100 لكي نحصل
على قيمة في العداد حسب العلاقة cont=ratio*100;
اني ازلت cont وعودتها ب ratio ووضعت في الشرط if(ratio <8500) ratio +=100;
وكدلك داخل لوب كما ني قمت بوضع قيمة البدئية while(time< ratio
ratio=0
لم يعمل هدا اخي سوى احتمال لكي ارى النتيجة
شكرا على المتابعة
اخي بخصوص المؤقت 1 اخي حاول تصحح لي الكود
وشكرا
أخي يجب تعريف متغير ratio من نوع int لانه بالبرنامج معرفه من نوع char
اي تقول
unsigned int ratio

بالنسبه لتعديل كود ان شالله أقوم بذلك لكني أمهلني بعض وقت وان شالله ارد عليك

اعلانات

abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 17-09-2014, 05:44 PM المشاركة 138   
افتراضي


أخي يجب تعريف متغير ratio من نوع int لانه بالبرنامج معرفه من نوع char
اي تقول
unsigned int ratio

بالنسبه لتعديل كود ان شالله أقوم بذلك لكني أمهلني بعض وقت وان شالله ارد عليك
شكرا اخي
فلوقت كله لك اخي
شكرا لك اخي لمجهودك وعطاءك اللامحدودين آمل من الله العلي القديربالنجاح في سبيل الهدف الذي نسعى له جميعا النجاح في طلب العلم

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 18-09-2014, 05:50 PM المشاركة 139   
افتراضي


أخي العزيز
لقد حاولت ولم استطع
كود:
bit oldstate, oldstate1,oldstate2, oldstate3;
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;

sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;

sbit sw_inc3 at RB6_bit;
sbit sw_inc_dir3 at TRISB6_bit;

sbit sw_dec2 at RB7_bit;
sbit sw_dec_dir2 at TRISB7_bit;

sbit trigger at RB3_bit;
sbit trigger_dir at TRISB3_bit;

sbit trigger1 at RB5_bit;
sbit trigger1_dir at TRISB5_bit;

sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;

char zero_crosing=0, ratio=50,zero_crosing1=0, ratio1=50 ,x;

unsigned int time=0 , cont=0,time1=0 , cont1=0;

//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x86;
  TMR0                 = 100;
}
void InitTimer1(){
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0xB1;
  TMR1L         = 0xE0;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void interrupt()
{
 if(INTCON.INTF)
                {
                 INTCON.INTF=0;
                 tmr0=100;
                 tmr2=100;
                 zero_crosing=zero_crosing1=1;;
                }
  if (TMR0IF_bit){
    TMR0IF_bit         = 0;
    TMR0                 = 100;
    //Enter your code here
  }
 if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0xB1;
    TMR1L         = 0xE0;
    //Enter your code here
  }
}

void main()
{
  sw_dec_dir=sw_dec_dir2=1; // input
  sw_inc_dir=sw_inc_dir3=1; // input
  led_check_dir=0; //output
  trigger_dir=0;//output
  trigger1_dir=0;//output
  led_check=0;//led off
  oldstate=oldstate2=0;
  oldstate1=oldstate3=0;
  intcon=0xF0;
  InitTimer0();
  InitTimer1();
  for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
         {
          if(zero_crosing)
                       {
                         zero_crosing=zero_crosing1=0;
                         led_check=1;
                         time=time1=0;
                         cont=ratio*100;
                         cont1=ratio1*100;
                         if(time<cont){
                         while(time<cont)
                                {
                                 time=128*(tmr0-100);
                                }
                         led_check=0;
                          trigger=1;
                         delay_us(100);
                         trigger=0;
                       }
                      if(time1<cont1){
                         while(time1<cont1)
                                {
                                 time1=128*(tmr2-100);
                                }

                          trigger1=1;
                         delay_us(100);
                         trigger1=0;
                        }
                       
                       
                       }


        //Button to decrease the voltage
        if(sw_dec)  oldstate=1;
        if(!sw_dec && oldstate)
                     {
                      if(ratio <85) ratio +=1; //
                      oldstate = 0;
                     }

       //Button to increase the voltage
       if(sw_inc)  oldstate1=1;
       if(!sw_inc && oldstate1)
                    {
                     if(ratio>5)ratio -=1;
                     oldstate1 = 0;
                    }
      //Button to decrease the voltage
        if(sw_dec2)  oldstate2=1;
        if(!sw_dec2 && oldstate2)
                     {
                      if(ratio1 <85) ratio1 +=1; //
                      oldstate2 = 0;
                     }

       //Button to increase the voltage
       if(sw_inc3)  oldstate3=1;
       if(!sw_inc3 && oldstate3)
                    {
                     if(ratio1>5)ratio1 -=1;
                     oldstate3 = 0;
                    }
     }

}
فارجوا ان تساعدني اخي الفاضل
السلام عليكم
أخي كريم جرب هذا الكود
كود:
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;

sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;

sbit trigger1 at RB3_bit;
sbit trigger1_dir at TRISB3_bit;

sbit trigger2 at RB5_bit;
sbit trigger2_dir at TRISB5_bit;

sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;

char zero_crosing=0,x , trigger1_ok=0,trigger2_ok=0;

unsigned int time1=0 ,time2=0 , cont=0 , ratio1=5000 , ratio2=5000;
//Timer1
//Prescaler 1:1; TMR1 Preload = 0;

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0;
  TMR1L         = 0;
  TMR1IE_bit         = 1;

}



//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x86;
  TMR0                 = 100;
}


void interrupt()
{
 if(INTCON.INTF)
                {
                 INTCON.INTF=0;
                 tmr0=100;
                 zero_crosing=1;
                }
  if (TMR0IF_bit){
    TMR0IF_bit         = 0;
    TMR0                 = 100;
    //Enter your code here
  }
   if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0;
    TMR1L         = 0;
    //Enter your code here
  }

}

void main()
{
  sw_dec_dir=1; // input
  sw_inc_dir=1; // input
  led_check_dir=0; //output
  trigger1_dir=0;//output
  trigger2_dir=0;//output
  led_check=0;//led off


  intcon=0xB0;
  InitTimer0();
  InitTimer1();
  for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
         {
          if(zero_crosing)
                       {

                         led_check=1;
                        while(1)
                               {
                                if(trigger1_ok==0)time1=128*(tmr0-100);
                                //time2=4/F * presclear *(tmr1-initial value);
                                if(trigger2_ok==0)time2=(TMR1H *256)+TMR1L;
                                if(time1>ratio1 )
                                       {
                                         time1=0;
                                         trigger1_ok=1;
                                         trigger1=1;
                                         delay_us(100);
                                         trigger1=0;
                                       }
                                if(time2>ratio2 )
                                       {
                                         time2=0;
                                         trigger2_ok=1;
                                         trigger2=1;
                                         delay_us(100);
                                         trigger2=0;
                                       }
                                if(trigger1_ok==1 && trigger2_ok==1)
                                       {
                                        trigger1_ok=0;
                                        trigger2_ok=0;
                                        zero_crosing=0;
                                        led_check=0;
                                        break;// out from while(1)
                                       }
                               }



                       }


        //Button to decrease the voltage
        if(sw_dec)
                     {
                      if(ratio1 <8500) ratio1 +=100;
                      if(ratio2 <8500) ratio2 +=100;
                      delay_ms(250);
                      
                     }

       //Button to increase the voltage

       if(sw_inc )
                    {
                     if(ratio1>500)ratio1 -=100;
                     if(ratio2>500)ratio2 -=100;
                     delay_ms(500);
                    }

     }

}
ملاحظه هنا أستخدم نفس سويج لكي يزيد متغير ratio1 و ratio2 يمكنك اضافه سويجات لديمر2
ايضا في كود سويج عندما تبقى ضاغطا على سويج سوف يزداد قيمه متغيرات ratio1 و ratio2 عكس كود الاول لا يزداد قيمه متغير الا بعد رفع يدك من سويج

في كود تم تفعيل تايمر1 وطبعا اريد من تايمر فقط أحتساب زمن ولايصل الى مرحله انتربت لانه كما تعلم اقصى زمن لاشاره هو 10ms

في هذا كود
كود:
if(zero_crosing)
                       {

                         led_check=1;
                        while(1)
                               {
                                if(trigger1_ok==0)time1=128*(tmr0-100);
                                //time2=4/F * presclear *(tmr1-initial value);
                                if(trigger2_ok==0)time2=(TMR1H *256)+TMR1L;
                                if(time1>ratio1 )
                                       {
                                         time1=0;
                                         trigger1_ok=1;
                                         trigger1=1;
                                         delay_us(100);
                                         trigger1=0;
                                       }
                                if(time2>ratio2 )
                                       {
                                         time2=0;
                                         trigger2_ok=1;
                                         trigger2=1;
                                         delay_us(100);
                                         trigger2=0;
                                       }
                                if(trigger1_ok==1 && trigger2_ok==1)
                                       {
                                        trigger1_ok=0;
                                        trigger2_ok=0;
                                        zero_crosing=0;
                                        led_check=0;
                                        break;// out from while(1)
                                       }
                               }



                       }
ونفس حال لديمر2
تلاحظ وضعت متغيرين trigger1_ok و trigger2_ok لكي أضمن حصول ارسال نبضه لكي تراياك وبعدما يصبحان كلاهما =1 عند ذلك أجعل zero_cross=0

ايضا
ملاحظه اخرى مخرج اشاره للتراياك2 هو على RB5
كود:
sbit trigger2 at RB5_bit;
sbit trigger2_dir at TRISB5_bit;

أخي جرب الكود وأخبرني عن مشاكل الي تواجهك
تحياتي


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 18-09-2014 الساعة 06:13 PM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 18-09-2014, 06:28 PM المشاركة 140   
افتراضي


هذا الكود أفضل من ناحيه استقرار وكذلك أستخدام نفس تايمر
كود:
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;

sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;

sbit trigger1 at RB3_bit;
sbit trigger1_dir at TRISB3_bit;

sbit trigger2 at RB5_bit;
sbit trigger2_dir at TRISB5_bit;

sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;

char zero_crosing=0,x , trigger1_ok=0,trigger2_ok=0;

unsigned int time=0 , cont=0 , ratio1=5000 , ratio2=2500;
//Timer1
//Prescaler 1:1; TMR1 Preload = 0;


//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x86;
  TMR0                 = 100;
}


void interrupt()
{
 if(INTCON.INTF)
                {
                 INTCON.INTF=0;
                 tmr0=100;
                 zero_crosing=1;
                }
  if (TMR0IF_bit){
    TMR0IF_bit         = 0;
    TMR0                 = 100;
    //Enter your code here
  }

}

void main()
{
  sw_dec_dir=1; // input
  sw_inc_dir=1; // input
  led_check_dir=0; //output
  trigger1_dir=0;//output
  trigger2_dir=0;//output
  led_check=0;//led off


  intcon=0xB0;
  InitTimer0();
  //InitTimer1();
  for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
         {
          if(zero_crosing)
                       {

                         led_check=1;
                        while(1)
                               {
                                time=128*(tmr0-100);

                                if(time>ratio1 && trigger1_ok==0 )
                                       {
                                         trigger1_ok=1;
                                         trigger1=1;
                                         delay_us(100);
                                         trigger1=0;
                                       }
                                if(time>ratio2  && trigger2_ok==0)
                                       {
                                         trigger2_ok=1;
                                         trigger2=1;
                                         delay_us(100);
                                         trigger2=0;
                                       }
                                if(trigger1_ok==1 && trigger2_ok==1)
                                       {
                                        time=0;
                                        trigger1_ok=0;
                                        trigger2_ok=0;
                                        zero_crosing=0;
                                        led_check=0;
                                        break;// out from while(1)
                                       }
                               }



                       }


        //Button to decrease the voltage
        if(sw_dec)
                     {
                      if(ratio1 <8500) ratio1 +=100;
                      if(ratio2 <8500) ratio2 +=100;
                      delay_ms(250);
                      
                     }

       //Button to increase the voltage

       if(sw_inc )
                    {
                     if(ratio1>500)ratio1 -=100;
                     if(ratio2>500)ratio2 -=100;
                     delay_ms(500);
                    }

     }

}
حيث هنا أستخدمت فقط تايمر0 لكون اشاره واحده وبتالي أستفاد من هذه الخاصيه انه أستخدم تايمر واحد لحتساب زمن انتظار
ارجو التجربه واعطائنا النتائج
على فكره بهذه طريقه ممكن أستخدام عده ديمرات لتحكم بها ولكن دعنا نحاول تحكم بعدد اثنان وبعد ذلك نجعلها 3 وهكذا وبعد نضع كود عام ونخلق مكتبه نضع فيها نسبه ورقم ديمر فقط
تحياتي


abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 18-09-2014, 10:23 PM المشاركة 141   
افتراضي


شكرا اخي
ساجرب واعطيك النتيجة


abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 19-09-2014, 07:23 PM المشاركة 142   
افتراضي


حيث هنا أستخدمت فقط تايمر0 لكون اشاره واحده وبتالي أستفاد من هذه الخاصيه انه أستخدم تايمر واحد لحتساب زمن انتظار
ارجو التجربه واعطائنا النتائج
على فكره بهذه طريقه ممكن أستخدام عده ديمرات لتحكم بها ولكن دعنا نحاول تحكم بعدد اثنان وبعد ذلك نجعلها 3 وهكذا وبعد نضع كود عام ونخلق مكتبه نضع فيها نسبه ورقم ديمر فقط
تحياتي
اخي العزيز
لقد جربت الكود الدي قلت لي فيه استقرار والمشكل هو
المصباح الدي يوجد في rb3 تتغير شدة اضائته
المصباح الدي يوجد في rb5 لا تتغير شدته بل يبقى في حالة قصوى
عند ضغط على احد الزرين ان المصباح يطفئ ثم تتغيرت قيمته
جربت حلول عدة ولم ينجح الامر
كود:
 if(sw_inc )
                    {
delay_ms(500);
                     if(ratio1>500)ratio1 -=100;
                     if(ratio2>500)ratio2 -=100;
                     delay_ms(500);
                    }
كود:
 if(sw_inc )
                    {
delay_ms(100);
                     if(ratio1>500)ratio1 -=100;
                     if(ratio2>500)ratio2 -=100;
                     delay_ms(500);
                    }
كود:
if(sw_inc){ delay_ms(500); oldstate1=1;}
       if(!sw_inc && oldstate1)
                    {
                       if(ratio1>500)ratio1 -=100;
                     if(ratio2>500)ratio2 -=100;
                     oldstate1 = 0;
                    }


abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 19-09-2014, 11:24 PM المشاركة 143   
افتراضي


اخي الفاضل
لم افهم جيدا اخي
itime=128*(tmr0-100)
بمان تيمر0 تزداد قيمته 1 ميكروتانية
وان قيمة البدئية لي tmr0 هي 100
مثلا اخي انا وضعت في ratio=50 يعني cont=5000 تساوي 5ميلي تانية
هل tmr0 يزيد قيمته على 100 تصبح 101 الى ان يصل الى153
itime=6784. اي 6 ميكرو تانية
ثم يخرج من لوب ليتم قدح الترياك


abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 19-09-2014, 11:33 PM المشاركة 144   
افتراضي


اي انني ردت فقط أحتسب زمن حقيقي ولان زمن قليل لذا جعل مايكرو يعمل أنتربت خلال ازمنه صغيره يسبب أرباك للمايكروكنترولر لانه سوف ينفذ اوامر موجود في انتربت ولربما قبل العوده الى امر الذي كان ينفذه سوف يتم مقاطعته مره أخرى وبتالي يكون مشغولا بتنفيذ داله الانتربت لذا أبتعدت عن انتربت وجعلته كعداد للزمن

طبعا انت تستطيع أستخدام تايمر0 بدون حاجه الى التفعيل انتربت
تحياتي
اخي العزيز
انك اشرت الى دمج تيمر والنتربت في نفس البورت
اي اصبح انتربت للتايمر0 وانتربت على RB0

اخي هل تقصد انك لم تفعل تيمر 0 على RB0لكي يحسب بدون مقاطعته

اخي بخصوص للمؤقتات والتقاطعات المنتدى يفتقر الى دلك لكي تعم الفائدة
جزاك الله اجرا اخي

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025