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

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

الصورة الرمزية المخترع01
المخترع01
:: مهندس متميز ::
تاريخ التسجيل: Dec 2009
المشاركات: 397
نشاط [ المخترع01 ]
قوة السمعة:0
قديم 07-10-2014, 02:08 PM المشاركة 1   
ha شرح عمل التيمر الداخلي Twitter FaceBook Google+



السلام عليكم

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

مع البيك و برنامج ميكرو سي

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

اعلانات

الصورة الرمزية المخترع01
المخترع01
:: مهندس متميز ::
تاريخ التسجيل: Dec 2009
المشاركات: 397
نشاط [ المخترع01 ]
قوة السمعة:0
قديم 08-10-2014, 03:57 PM المشاركة 2   
افتراضي


لايوجد مساعدة من فضلكم

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

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


السلام عليكم

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

مع البيك و برنامج ميكرو سي

لم لفهم كيف استدعي التيمر ارجو منكم مساعدتي
السلام عليكم
عفوا أخي لم أفهم مقصدك ماذا تعني للعمل عوض الدولي


الصورة الرمزية المخترع01
المخترع01
:: مهندس متميز ::
تاريخ التسجيل: Dec 2009
المشاركات: 397
نشاط [ المخترع01 ]
قوة السمعة:0
قديم 08-10-2014, 08:06 PM المشاركة 4   
افتراضي


السلام عليكم
عفوا أخي لم أفهم مقصدك ماذا تعني للعمل عوض الدولي
شكر على الرد

يعني احي كما نعلم ان دولي ياخر عمل التعليمة

مثلا انا عندي ليد و اريد ان اطفء و اشعل كل 1 ثانية

و في نفس الوقت اريد عرض عللى شاشة سيفن سيغمن كلمة كما فعلت في مشروع العداد

طيب هنا نعتمد على التيمر الداخلي و الانتربت التي لم افهمها

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

و جزاك الله

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

abu-thabit
:: مهندس متميز ::
تاريخ التسجيل: Oct 2010
المشاركات: 339
نشاط [ abu-thabit ]
قوة السمعة:0
قديم 08-10-2014, 08:33 PM المشاركة 5   
افتراضي


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


يا اخي الكريم نحب لغتنا العربية فاستخدمها على قدر ما تستطيع لنفهمك

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

الى من يقرأ هذا الموضوع اود التوضيج ان الاخ الكريم يقصد ب " دولي " delay

بوركتم

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 09-10-2014, 03:30 AM المشاركة 6   
افتراضي


شكر على الرد

يعني احي كما نعلم ان دولي ياخر عمل التعليمة

مثلا انا عندي ليد و اريد ان اطفء و اشعل كل 1 ثانية

و في نفس الوقت اريد عرض عللى شاشة سيفن سيغمن كلمة كما فعلت في مشروع العداد

طيب هنا نعتمد على التيمر الداخلي و الانتربت التي لم افهمها

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

و جزاك الله
السلام عليكم
أفضل طريقه في تايمرات هي أستخدام البرنامج TimerCalculator
يمكنك تحميله من موقع الرسمي
http://www.mikroe.com/timer-calculator/
وحسب البرنامج
1- تختار جهاز الو pic
2- تحدد تردد
3- تحدد تايمر الذي تعمل عليه
4- تحدد زمن انتربت
ثم تضغط على calculate ليولد لك الكود مطلوب
انتبه أضع الكود على micro c والموجوده اسفل البرنامج
مثال
كود:
//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
  }
}
واضح من تعليق البرنامج
Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 50 ms
انتربت يحدث كل 50ms

توجد عباره في انتربت
//Enter your code here
معناها هنا نضع الكود الذي نريد عند حدوث انتربت

ملاحظه مهمه لكي يعمل انتربت يجب وضع داله الي يولده البرنامج والتي اسمها هنا void InitTimer1() في داله الرئيسيه main لكي يتم تهيئه تايمر

في مشاركه القادمه سوف أضرب لكم مثال

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب المخترع01 ( أعجبته المشاركة )

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


مثال يوضح كيفيه أستفاده من تايمر داخلي حيث ان هذا تايمر يعمل بشكل مستقل عن عمل مايكرو وبتالي لن يعيق عمله
في مثال التالي يوضح سويجين مربوطين على RA0_bit و RA1_bit ولمبات leds مربوطه على RB0_bit و RB1_bit
اذا اضغطت على sw1 ومربوط عند RA0_bit يعمل led1 ومربوط عند RB0_bit وبعد 1 ثانيه ينطفئ

اذا اضغطت على sw2 ومربوط عند RA1_bit يعمل led2 ومربوط عند RB1_bit وبعد 2 ثانيه ينطفئ

كود:
sbit sw1 at RA0_bit;
sbit sw1_dir at TRISA0_bit;
sbit sw2 at RA1_bit;
sbit sw2_dir at TRISA1_bit;
sbit led1 at RB0_bit;
sbit led1_dir at TRISB0_bit;
sbit led2 at RB1_bit;
sbit led2_dir at TRISB1_bit;

unsigned char flag_sw1=0,flag_sw2=0;
unsigned int time_sw1=0,time_sw2=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(flag_sw1==1)time_sw1++;
    if(flag_sw2==1)time_sw2++;
  }
}


void main()
{
 cmcon=7;
 sw1_dir=1;
 sw2_dir=1;
 led1=0;
 led2=0;
 led1_dir=0;
 led2_dir=0;
 InitTimer1();
 while(1)
       {
        if(sw1 ==0)flag_sw1=1;
        if(sw2 ==0)flag_sw2=1;
        if(flag_sw1==1 && led1==0)led1=1;
        if(flag_sw2==1 && led2==0)led2=1;
        if(flag_sw1==1 && time_sw1>20) //1sec ==>  1000ms/50=20
           {
            flag_sw1=0;
            time_sw1=0;
            led1=0;
           }
        if(flag_sw2==1 && time_sw2>40)// 2sec ==> 2000ms/50=40
           {
            flag_sw2=0;
            time_sw2=0;
            led2=0;
           }
       }
}
كيف نولد الزمن
لاحظ هذا الكود
كود:
   if(sw1 ==0)flag_sw1=1;
يعني اذا ضغطت على سويج خلي متغير سميته flag_sw1=1
لو نرجع الى كود انتربت سوف تلاحظ ان كل 50ms راح يزداد متغير أخر سميته time_sw1 وهذا مهمته أحتساب زمن لهذا السويج فقط

انا كتبت التالي
كود:
if(flag_sw1==1 && led1==0)led1=1;
يعني انا اريد عندما اضغط على سويج يعمل led
اذن أختبر متغير الخاص بحاله سويج flag_sw1 هل يساوي 1 وهل led طافي عندها شغل led وضع الشرط هل ليد طافئ لكي لا أريد يتنفذ الشرط تشغيل ليد عده مرات اريده يتنفذ مره واحده فقط

بعد 1 ثانيه من ضغطه السويج مفروض يطفئ ليد وايضا يجب اعاده متغيرات خاصه بحاله سويج وبعداد تايمر لهذا السويج الى 0
كود:
if(flag_sw1==1 && time_sw1>20) //1sec ==>  1000ms/50=20
           {
            flag_sw1=0;
            time_sw1=0;
            led1=0;
           }
أذن بأختصار كل سويج او اي شيئ تريد أحتساب له زمن معين يحتاج الى متغير اخر لتعبير عن حالته يعني دائما سميه قريب من أسمه مثلا سميت flag_sw1 اي وضعت فقط كلمه flag_ امام سويج او اي متغير لغرض انك تعرف لمن تابع هذا متغير
هو طبعا يمكنك وضع اي اسم ولكن دائما خلي متغيرات قريبه من شيئ الذي تنفذه او الذي تعبر عنه لتسهيل لك فهمه فيما بعد

وفي داله الانتربت تختبر الشروط لديك اذا تحققت أخبره قم بزياده متغير اخر خاص بزمن
الشروط يعني مثلا اذا ضغطت على سويج اوكي خليت flag_sw1=1 اذن تحقق الشرط راح يزيد متغير time_sw1
احيانا لا الشرط فيه عده حالات لكي يتم زياده time_sw1 مثلا اريد اذا سويج sw1 تم ضغطه وسويج sw2 لم يتم ضغطه
اذن هنا الشرط يختلف لانك راح تختبر هل flag_sw1==1 و flag_sw2==0 عندها قم بزياده time_sw1 كل 50ms

ملاحظه// بالنسبه لاستدعاء انتربت بالحقيقه هو البرنامج يقوم بعمل أنتربت كل 50 ms ويتفحص الشروط الموجوده في داله الانتربت ثم يعود لاكتمال عمل البرنامج

طبعا 50ms تخص هذا المثال فقط
تلاحظ ان خليت زمن انتربت عالي ولم أضعه 1ms لاني اريده فقط توليد أزمنه أساسا هي كبيره اذن لست بحاجه الى أرهاق مايكرو بكثره أنتربت

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب المخترع01 ( أعجبته المشاركة )

الصورة الرمزية المخترع01
المخترع01
:: مهندس متميز ::
تاريخ التسجيل: Dec 2009
المشاركات: 397
نشاط [ المخترع01 ]
قوة السمعة:0
قديم 09-10-2014, 04:04 PM المشاركة 8   
افتراضي


اخي حسن تخية من القلب لكم على الشرح

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

كل 2 ثانية و كيف اكتب برنامج mikroelectro
والحساب به

هو ينتج الكود او انا اعدل لكي ينتج

إضافة رد

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

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

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


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

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