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

   

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 322
نشاط [ احمد شهيد جواد ]
قوة السمعة:
قديم 10-01-2017, 12:55 AM المشاركة 9   
افتراضي




اخى العزيز بالنسبة لدالة button :

كود:
if (Button(&PORTB, 0, 40, 1)) {               // Detect logical one       oldstate = 1;                              // Update flag     }
كود:
Button(&portb البورت الذى يحتوى المفتاح,pin number connected to switch, time delay for debounce, 0 or 1 state);
بخصوص العنصر الاخير و هو :
كود:
 0 or 1 state
اذا كان الضغط على المفتاح يدخل 1 على رجل البورت فاكتب 1
و العكس اكتب 0

ملاحظة : فى البرامج الاحترافية لا يستخدم delay كما قلت , ولكن يستخدم دالة millis or micros حيث انهما لا يجعلان الميكرو فى حالة انتظار دون عمل , لانهما يعتمدان على التايمر الداخلى للميكرو .


السلام عليكم اخي مشتاق
ماذا تقصد بالـ micros والـ millis ؟؟؟ هل هو موديول التايمر الداخلي ؟؟

اعلانات

الصورة الرمزية ياسين الحانوتي
ياسين الحانوتي
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2013
المشاركات: 164
نشاط [ ياسين الحانوتي ]
قوة السمعة:
قديم 10-01-2017, 08:30 PM المشاركة 10   
افتراضي


اريد ان اتحكم في عده متغيرات عن طريق زر واحد
كل ضغطه زر يكون حركه فلاش ( ليد ) مختلفه عن الاخرى
حاولت ان اعملها ولكن هذه الطريقة هذه بها العديد من المشاكل
هل من كود عملي ( احترافي ) استطيع من خلاله تنفيذ المطلوب من دون مشاكل


اللغه ميكرو سي
المتحكم pic16f716



كود:
        char x=0;
        void main() {

trisb.f4=0;
trisb.f2=1;
portb.f4=0;
 while(1){
 
      if (portb.f2==1)  {  delay_ms(40);  x++;  }
      if (x==4)  {    x=0;         }
      
      
      if (x==1)  {    portb.f4=1; delay_ms(100); portb.f4=0; delay_ms(100); }
      if (x==2)  {    portb.f5=1; delay_ms(300); portb.f5=0; delay_ms(300); }
      if (x==3)  {    portb.f6=1; delay_ms(700); portb.f6=0; delay_ms(700); }


}
}

أولا نست وضع
كود:
trisb.f5=trisb.f6=0;
لذلك لن تشتغل باقي الليدات

أما مشكلة الديلاي كما قلت احتمال ضعيف جدا أن يضغط الزر عند اللحظة المناسبة

يمكن استخدام interruption ان كانت متوفرة
مثلا هنا استخدمدت البين portb.f0 عوض ال f2 لأنه يتوفر على ال interruption
هذا بالنسبة PIC16F628A اعتقد حتى 716 نفس الشيء



كود:
char x=0;
  
  void interrupt (){

                          if(intcon.b1==1) {
                             while(portb.f0==1){}
                             x++;
                             if (x==4)  { x=0; }
                             intcon.b1=0;
                          }



  void main() {
  intcon=0b10010000;

trisb.f4= trisb.f5= trisb.f6=0;
trisb.f0=1;
portb.f4=0;


 while(1){


      if (x==1)  {    portb.f4=1; delay_ms(100); portb.f4=0; delay_ms(100); }
      if (x==2)  {    portb.f5=1; delay_ms(300); portb.f5=0; delay_ms(300); }
      if (x==3)  {    portb.f6=1; delay_ms(700); portb.f6=0; delay_ms(700); }


}      }
يمكن كذلك استخدام المؤقت..

هنا رابط المحاكاة على برنامج isis
https://www.4shared.com/rar/hy2AwXXBce/qarya_proj4.html

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

TIME0
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
المشاركات: 277
نشاط [ TIME0 ]
قوة السمعة:
قديم 13-01-2017, 01:28 AM المشاركة 11   
افتراضي


مشكور اخي ياسين على مشاركتك الجميله

كود الانتربت به اخطاء وهذه الرساله الي عندي





هل من الممكن ترفع الكود كامل

وعندي طلب ثاني لو تكرمت

اريد فقط ان اضيف للكود شغله واحده وهي -- توصيل ليد لايتوقف عن الوميض بزمن 500 ms
يعمل فور توصيل الكهرباء وليس له علاقه بالزر ووظائقه

اتمنى يعمل معي كود مثل هذا
وشكرا لجهودك


الصورة الرمزية عريبى محمود
عريبى محمود
:: ( رحمه الله عليه ) ::
تاريخ التسجيل: Feb 2009
الدولة: لا تسأل الطغاه لماذا طغو بل اسأل العبيد لماذا انحنو
المشاركات: 3,126
نشاط [ عريبى محمود ]
قوة السمعة:
قديم 13-01-2017, 05:14 AM المشاركة 12   
x4


مشكور اخي ياسين على مشاركتك الجميله

كود الانتربت به اخطاء وهذه الرساله الي عندي





هل من الممكن ترفع الكود كامل

وعندي طلب ثاني لو تكرمت

اريد فقط ان اضيف للكود شغله واحده وهي -- توصيل ليد لايتوقف عن الوميض بزمن 500 ms
يعمل فور توصيل الكهرباء وليس له علاقه بالزر ووظائقه

اتمنى يعمل معي كود مثل هذا
وشكرا لجهودك
السلام عليكم ورحمة الله وبركاته
اخى الكريم

الخطــأ فى الكود يتمثــل فى عدم وجود قوس الاقفال الموضح بالمربع الاحمر بالصورة المرفقة وبوضعه اكتمل البرنامج واصبح ليس به اخطاء





ارجو من حضرتك ذكر رقم البيك المستخدم ولك كل الشكر





الصورة الرمزية ياسين الحانوتي
ياسين الحانوتي
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2013
المشاركات: 164
نشاط [ ياسين الحانوتي ]
قوة السمعة:
قديم 13-01-2017, 07:37 AM المشاركة 13   
افتراضي


شكرا أخ عريبى محمود نسيت اغلاق ذلك القوس..


اريد فقط ان اضيف للكود شغله واحده وهي -- توصيل ليد لايتوقف عن الوميض بزمن 500 ms
يعمل فور توصيل الكهرباء وليس له علاقه بالزر ووظائقه

اليك اخي هذا الحل ,, حاولت ما امكن ان اجعل نبضات الليد مستقلة عن الاخرى لكن أثناء الضغط على الزر يتأثر التوقيت قليلا
لذلك يبقى الحل الأمثل هو استخدام المؤقت الداخلي ..

جرب هذا الكود اتمنى ان يفي بالغرض ,,

كود:
 char x=0;
    char i=0;
    char m2[5] = {1,5,11,17,23}  ;                           //
    char m3[5]=  {5,20,6,27,13}  ;                           //
  void interrupt (){

                          if(intcon.b1==1) {
                          portb.b5=portb.b6=portb.b4=0;
                             while(portb.f0==1){}
                             x++;
                             if(x==2) { i = m2[i%5];}       //
                             if(x==3) { i = m3[i%5];}       //
                             if(x==4)  { x=0; }
                             intcon.b1=0;
                          }

                            }

  void main() {
  intcon=0b10010000;

trisb.f4= trisb.f5= trisb.f6=trisb.b7=0;
trisb.f0=1;
portb.f4=0;


 while(1){
                  for(i=1;i<106;i++){

                    if(x==1)                { portb.f4=~portb.f4;  }
                    if((x==2) && (i%3==0))  { portb.f5=~portb.f5;  }
                    if((x==3) && (i%7==0))  { portb.f6=~portb.f6;  }

                    if(i%5 ==0)             { portb.f7=~portb.f7;  }

                    delay_ms(100);

                                    }


}      }
افضل ان لا تغير القيم (100 300 700 و 500 ميلي) لان الامر يتطلب تعديل بعض الاجزاء في الكود..

الليد الاضافي مركب على portb.b7


التعديل الأخير تم بواسطة : ياسين الحانوتي بتاريخ 13-01-2017 الساعة 07:52 AM

TIME0
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
المشاركات: 277
نشاط [ TIME0 ]
قوة السمعة:
قديم 13-01-2017, 11:31 PM المشاركة 14   
افتراضي


كود:
char x=0;

  void interrupt (){

                          if(intcon.b1==1) {
                             while(portb.f0==1){}
                             x++;
                             if (x==4)  { x=1; }
                             intcon.b1=0;  }
                          }


  void main() {
  intcon=0b10010000;

trisb.f1= trisb.f2= trisb.f5=0;
trisb.f0=1;

  portb.f1=0;
  portb.f2=0;
  portb.f5=0;

 while(1){

      if (x==1)  {    portb.f1=1; delay_ms(50); portb.f1=0; delay_ms(50); }
      if (x==2)  {    portb.f2=1; delay_ms(500); portb.f2=0; delay_ms(500); }
      if (x==3)  {    portb.f5=1; delay_ms(2000); portb.f5=0; delay_ms(2000); }

      }      }
شكرا لكم احبتي في الله لكل من شارك وساهم في هذا الموضوع

الاخ الفاضل ياسين
انا جربت الكود الذي تشاهده في الاعلى وساجرب الكود الثاني لاحقا
وكانت النتيجه انه عمل معي ولكن ليس على الوجه المطلوب ( به تاخير )
كي اختبر الانتربت
قمت بزياده الزمن الفلاش على النحو الاتي
الفلاش الاول يعمل بزمن 50 ملي سكند
الثاني 500 ملي سكند
الثالث وهنا الاختبار الحقيقي وهو 2000 ثانيتين

حيث عند الزمن الصغير يتنقل بشكل عادي
ولكن عند الزمن 2000 لايتنتقل بشكل سريع بل لابد من انتظار حتى ينتهي اليد من اداء عمله
انا اريد عمل مقاطعه ( اي اترك ماتعمله فورا ) وتنقل الى الوظيفه الاخرى
الكود شغال ولكن لابد من انتظار



صورت فيديو للتجربة
https://www.youtube.com/watch?v=YrfvqYbHAI8
----------------------------
التعديل على الكود كان فقط في الزمن الفلاش
وايضا استخدمت port 1,2 5 out put

ولكن مافهمت لماذا كتبت هذا السطر بهذا الشكل
trisb.f1= trisb.f2= trisb.f5=0
حيث انني حاولت على سبيل القضول كتابته بهذا الشكل واعطاني خطا
trisb.f1=0;
trisb.f2=0;
trisb.f5=0


التعديل الأخير تم بواسطة : TIME0 بتاريخ 13-01-2017 الساعة 11:50 PM

الصورة الرمزية ياسين الحانوتي
ياسين الحانوتي
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2013
المشاركات: 164
نشاط [ ياسين الحانوتي ]
قوة السمعة:
قديم 14-01-2017, 05:12 AM المشاركة 15   
افتراضي



حيث عند الزمن الصغير يتنقل بشكل عادي
ولكن عند الزمن 2000 لايتنتقل بشكل سريع بل لابد من انتظار حتى ينتهي اليد من اداء عمله
انا اريد عمل مقاطعه ( اي اترك ماتعمله فورا ) وتنقل الى الوظيفه الاخرى
الكود شغال ولكن لابد من انتظار
طبعا اخي لان البرنامج عند المقاطعة يعود ويكمل من حيث توقف ..
قلت انه عند الزمن الصغير لا بأس.. اذن اقترح عليك تقسم كل الازمنة الى 100 ميلي مثلا، وتضع حلقة تكرار مع متغير عداد ,
وأثناء تنفيد برنامج المقاطعة تضع تصفير لذلك المتغير.. كما في هذا الكود

طبعا ممكن تكون حلول أخرى أبسط..
هنا أقصى مدة انتظار ممكن أن تحصل في حدود 100 ميلي


كود:
  char x=0;
     char i =0;
  void interrupt (){

                       if(intcon.b1==1) {
                             while(portb.f0==1){/*portb=0;*/}
                             x++;
                             portb=0;
                             i=0;
                             if (x==1)  { portb.b4=1; }
                             if (x==2)  { portb.b5=1; }
                             if (x==3)  { portb.b6=1; }
                             if (x==4)  { x=0; }
                             
                             intcon.b1=0;
                          }

                            }

  void main() {
  intcon=0b10010000;

trisb=0;
trisb.f0=1;
portb=0;


 while(1){

       for(i=1;;i++){
       
              if (x==1)             {portb.f4=~portb.f4; i=0;}
              if((x==2) && (i==20)) {portb.f5=~portb.f5; i=0;}
              if((x==3) && (i==7 )) {portb.f6=~portb.f6; i=0;}
              
              delay_ms(100);
       }
      

}      }
اخبرنا بالنتائج..



ولكن مافهمت لماذا كتبت هذا السطر بهذا الشكل
حيث انني حاولت على سبيل القضول كتابته بهذا الشكل واعطاني خطا
trisb.f1=0;
trisb.f2=0;
trisb.f5=0
جربتها عندي واشتغلت!
اقرأ رسائل الاخطاء في الاسفل.. ربما الخطأ في نسيت ;

أفضل ان تكتب
portb=0b00000001
لتقتصد المساحة

ملاحظة التوقيت 100 - 2000 - 700


التعديل الأخير تم بواسطة : ياسين الحانوتي بتاريخ 14-01-2017 الساعة 05:17 AM

TIME0
:: مهندس جيد ::
تاريخ التسجيل: Mar 2012
المشاركات: 277
نشاط [ TIME0 ]
قوة السمعة:
قديم 16-01-2017, 01:16 AM المشاركة 16   
افتراضي


اشكرك اخي من كل قلبي على مشاركتك الطيبه

فكره تقسيم الوقت فكره جيده وانا اتبعتها سابقا
ممكن استخدام جمله فور وتقسيم الوقت

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

لا استخدم الانتربت وبعد ذلك اقوم بتقسيم الوقت

تخيل او الزمن عشر دقائق هل انتظر حتى تتهي العشر دقائق

انا اريد نفس كود الانتربت الذي كتبته ولكن بتعديل بسيط عليه



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