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

   

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 22-03-2016, 08:02 AM المشاركة 9   
sun



بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

اخى الحبيب اولا هذا البرنامج مجانى سيساعدك على كتابة الكود الخاص بضبط
التايمر و interrup و هو مجانى من الميكروسي , و لا يمنع ان تجتهد و تشاهد

فيديوهات بالعربى يوتيوب لشرح التايمر و تفهمه ( و كذلك فهمته ) :

http://www.mikroe.com/timer-calculator/

و ذلك شكل البرنامج اضبط الخطوات 1- 4 ثم اضغط calculate :




اما عن الدائرة :




نعم استخدمت عداد خاص لكل حالة من الست حالات , يعد من 0 - 59 اى 60 مرة داخل المقاطعة
و التى بدورها تتكرر كل 50 مللى ثانية , و بالتالى يكون الحصل => 60*50=3000 مللى = 3 ثوانى .
و بالتالى اذا اردت تغيير المدة الى خمس ثوانى مثلا تغير العداد ليعد حتى 100 مرة , فيكون 100*50=5000 مللى = 5 ثوانى .

و ما توفيقى الا بالله
اللهم اجعله لقلوبنا ربيعا

و لنا دليلا و قائدا



اعلانات

mohamad19
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2013
الدولة: سوريا
المشاركات: 60
نشاط [ mohamad19 ]
قوة السمعة:
قديم 23-03-2016, 03:05 AM المشاركة 10   
افتراضي


الف شكر اخي للتوضيح كنت اجد صعوبة بالجزء الاول بالكود لاني لم افهمه اما الان فهمت الكود كامل.
الله يجعل هالعمل في ميزان حسناتك يارب وانا سأبحث اكثر عن فيديوهات تفيدني في مجال البرمجة.

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

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 23-03-2016, 04:31 AM المشاركة 11   
افتراضي


شرح عمل البرنامج للمهندس احمد سمير ..
https://www.youtube.com/watch?v=B9Wdnd5erco


mohamad19
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2013
الدولة: سوريا
المشاركات: 60
نشاط [ mohamad19 ]
قوة السمعة:
قديم 24-03-2016, 12:16 AM المشاركة 12   
افتراضي


شكرا لك مهندس حيدر على هذه اللفتة الجميلة.


mohamad19
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2013
الدولة: سوريا
المشاركات: 60
نشاط [ mohamad19 ]
قوة السمعة:
قديم 26-03-2016, 01:14 AM المشاركة 13   
افتراضي


السلام عليكم
أخي الكريم لقد عدلت على الكود حتى يصبح 5 مخارج و5 مداخل ولكن لم يعمل معي فما السبب؟
لقد عدلت على الكود ولكن لايعمل أرجو تصحيح الغلط اللذي بالكود وأعتذر ولكن حاولت قدر المستطاع ولم أنجح بجعله يعمل وهذا الكود اللذي عدلته بحيث وضعت عداد رابع ولكن تظهر لي إشارة خطئ لذلك أرجو التعديل على الكود حتى يصبح 5 مخارج و5 مداخل وشكرا جزيلا.
كود:
// MCU : 16F628A   OSCILLATOR : 4MHZ internal
 unsigned char count_00 = 0 ,count_01=0, count_10 = 0 ,count_11 = 0 , count_20=0 , count_21=1
 count_30=0 ,count_31=1;
  //Timer2
//Prescaler 1:16; Postscaler 1:13; TMR2 Preload = 240; Actual Interrupt Time : 49.933 ms
void InitTimer2(){
  T2CON     =  0x66;
  PR2         = 240;
  TMR2IE_bit     = 1;
  INTCON     = 0xC0;
}

void Interrupt(){     // Interrupt every 49.3 ms  so counerts= 60* 49.3 = 3000 ms
  if (TMR2IF_bit){ TMR2IF_bit = 0;

     if (porta.B0==1){count_01++ ;count_00=0; if (count_01>=59){ portb.B0=1;count_01=0; }  }
     else { count_00++ ;count_01=0; if(count_00>=59){portb.B0=0;} }

     if (porta.B1==1){count_11++ ;count_10=0; if (count_11>=100){ portb.B1=1; count_11=0; }  }
     else { count_10++ ;count_11=0; if(count_10>=100){portb.B1=0;} }

    if (porta.B2==1){count_21++ ;count_20=0; if (count_21>=59){ portb.B2=1; count_21=0; }  }
     else { count_20++ ;count_21=0; if(count_20>=1){portb.B2=0;} }
     
     if (porta.B3==1){count_31++ ;count_20=0; if (count_31>=59){ portb.B2=1; count_31=0; }  }
     else { count_30++ ;count_31=0; if(count_30>=1){portb.B2=0;} }
  }
}


void main() {   trisb=0;  trisa=0xff; portb=0;
InitTimer2();
CMCON |= 7 ;
  while (1){

          }
}


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 26-03-2016, 08:20 AM المشاركة 14   
sun


بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

اخى العزيز الكود الذى عدلته سليم لكن لانك استعملت copy/past فتكرر الكود
فى اللون الاحمر , عدله و حاول مرة اخرى بتأنى .
احب ان تعدله بنفسك باذن الله


كود:
// MCU : 16F628A   OSCILLATOR : 4MHZ internal
 unsigned char count_00 = 0 ,count_01=0, count_10 = 0 ,count_11 = 0 , count_20=0 , count_21=1,
 count_30=0 ,count_31=1;
  //Timer2
//Prescaler 1:16; Postscaler 1:13; TMR2 Preload = 240; Actual Interrupt Time : 49.933 ms
void InitTimer2(){
  T2CON     =  0x66;
  PR2         = 240;
  TMR2IE_bit     = 1;
  INTCON     = 0xC0;
}

void Interrupt(){     // Interrupt every 49.3 ms  so counerts= 60* 49.3 = 3000 ms
  if (TMR2IF_bit){ TMR2IF_bit = 0;

     if (porta.B0==1){count_01++ ;count_00=0; if (count_01>=59){ portb.B0=1;count_01=0; }  }
     else { count_00++ ;count_01=0; if(count_00>=59){portb.B0=0;} }

     if (porta.B1==1){count_11++ ;count_10=0; if (count_11>=100){ portb.B1=1; count_11=0; }  }
     else { count_10++ ;count_11=0; if(count_10>=100){portb.B1=0;} }

    if (porta.B2==1){count_21++ ;count_20=0; if (count_21>=59){ portb.B2=1; count_21=0; }  }
     else { count_20++ ;count_21=0; if(count_20>=1){portb.B2=0;} }
     
     if (porta.B3==1){count_31++ ;count_20=0; if (count_31>=59){ portb.B2=1; count_31=0; }  }
     else { count_30++ ;count_31=0; if(count_30>=1){portb.B2=0;} }
  }
}


void main() {   trisb=0;  trisa=0xff; portb=0;
InitTimer2();
CMCON |= 7 ;
  while (1){

          }
}
و ما توفيقى الا بالله

اللهم اجعله لقلوبنا ربيعا

و لنا دليلا و قائدا







ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 26-03-2016, 10:15 AM المشاركة 15   
افتراضي


السلام عليكم
ياشباب أنا أعمل بالمجال الإلكتروني منذ فترة وأحتاج إلى دارة تعتمد على الميكروكونترولر ولكن برمجتي ضعيفة رغم أن البرنامج بسيط وغير معقد ولكني لاأعرف بالبرمجة الكثير.
بإختصار أنا أريد أن يكون للميكروكونترولر ثلاث مداخل وثلاث مخارج والمداخل عندما يكون الفولت عليها 5 فولت أريد أن يعمل المخرج رقم واحد بعد إنقضاء ثلاث ثواني ويبقى في حالة عمل وعندما يصبح الفولت 0 على المدخل رقم واحد أريده أن يطفئ المخرج رقم واحد بعد إنقضاء ثلاث ثوان وأنا أعرف طريقة كتابة البرنامج ولكن الميكروكونترولر لايقوم بالعمل على الثلاث مداخل والمخارج معا,أقصد إذا كان المدخل رقم واحد والمخرج رقم واحد فإن باقي المداخل والمخارج لاتعمل حتى ينتهي المدخل والمخرج رقم واحد من العمل.
أقصد مثل هذا ياشباب ولكن على ثلاث مخارج وثلاث مداخل وأعتقد حسب ماأعرفه أنني بحاجة للإنتربيت حتى لاتقف الميكروكونترولر على أحد الأمور البرمجية وتتابع عملها.
كود:
if(porta.f0==1)
{delay_ms(3000),portb.f0=1;}
else{delay_ms(3000),portb.f0=0;}
مشكلة هذا الكود أنك تستخدم الأمر لكى توقف نشاط الميكرو حتى تنتهى 3 ثوانى للزر الأول على اى حال ثم تكرر نفس الشيء للثانى بعد الأول و أخيرا الثالث فستنتظر 9 ثوانى حتى تعود لتحسس حال الأول مرة أخرى
لو المداخل 3 فقط لا أكثر فغالبية الميكرو تحتوى 3 عدادات/مؤقتات Timer counter داخلى و يجب ان توظف واحد لكل مدخل تحسب به الزمن 3 ثوانى
ثانيا يجب ان تتحسس التغيير وليس القيمة و يمكنك مراجعة الكومبايلر لتحديد ما إن كان يحتوى مثل هذه الدالة و ما أثرها على سير البرنامج الباقى و إلا ستضطر لكتابة هذا الكود بنفسك أن تخلق 3 متغيرات كل منها بت واحدة و تجعل كل منها بحال المدخل المناظر
ثم تقارن إن كان المدخل لا يساوى المتغير فالمطلوب حساب الزمن
أيضا يجب أن تحدد ماذا يحدث لو ان المدخل تغير قبل الثوانى الثلاث هل ستلغى العملية كلها أم ماذا


mohamad19
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2013
الدولة: سوريا
المشاركات: 60
نشاط [ mohamad19 ]
قوة السمعة:
قديم 26-03-2016, 01:12 PM المشاركة 16   
افتراضي


ألف شكر لكم إخوتي(مشتاق الله,ماجد عباس محمد)على ردودكم والحمد لله عدلت على الكود مثل ماقلت لي أخي (مشتاق الله) وقد عمل الحمد لله وفعلا كانت الأغلاط بسيطة ولكن لم ألاحظها وأيضا الكهرباء سيئة جدا لدينا لذلك يتوجب عليّ العمل بسرعة لذلك لم أنتبه لهذه الأغلاط البسيطة وهذا الكود النهائي.
كود:
// MCU : 16F628A   OSCILLATOR : 4MHZ internal
 unsigned char count_00 = 0 ,count_01=0, count_10 = 0 ,count_11 = 0 , count_20=0 , count_21=1,
 count_30=0 ,count_31=1 count_40=0 , count_41=1 ;
  //Timer2
//Prescaler 1:16; Postscaler 1:13; TMR2 Preload = 240; Actual Interrupt Time : 49.933 ms
void InitTimer2(){
  T2CON     =  0x66;
  PR2         = 240;
  TMR2IE_bit     = 1;
  INTCON     = 0xC0;
}

void Interrupt(){     // Interrupt every 49.3 ms  so counerts= 60* 49.3 = 3000 ms
  if (TMR2IF_bit){ TMR2IF_bit = 0;

     if (porta.B0==1){count_01++ ;count_00=0; if (count_01>=59){ portb.B0=1;count_01=0; }  }
     else { count_00++ ;count_01=0; if(count_00>=59){portb.B0=0;} }

     if (porta.B1==1){count_11++ ;count_10=0; if (count_11>=100){ portb.B1=1; count_11=0; }  }
     else { count_10++ ;count_11=0; if(count_10>=100){portb.B1=0;} }

    if (porta.B2==1){count_21++ ;count_20=0; if (count_21>=59){ portb.B2=1; count_21=0; }  }
     else { count_20++ ;count_21=0; if(count_20>=1){portb.B2=0;} }

     if (porta.B3==1){count_31++ ;count_30=0; if (count_31>=59){ portb.B3=1; count_31=0; }  }
     else { count_30++ ;count_31=0; if(count_30>=1){portb.B3=0;} }
     
      if (porta.B3==1){count_31++ ;count_30=0; if (count_31>=59){ portb.B3=1; count_31=0; }  }
     else { count_30++ ;count_31=0; if(count_30>=1){portb.B3=0;} }
     
     if (porta.B4==1){count_41++ ;count_40=0; if (count_41>=59){ portb.B4=1; count_41=0; }  }
     else { count_40++ ;count_41=0; if(count_40>=59){portb.B4=0;} }
  }
}


void main() {   trisb=0;  trisa=0xff; portb=0;
InitTimer2();
CMCON |= 7 ;
  while (1){

          }
}



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