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

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

A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 21-11-2017, 11:17 PM المشاركة 1   
افتراضي سؤال بسيط Twitter FaceBook Google+



السلام عليكم و رحمة الله :
اخواني انا اعرف ان امر التاخير يكون بالثواني و كل الف ميلي ثانيه تعتبر ثانيه , فلو اردنا تاخير 5 ثواني
نكتب الامر DELAY_MS(5000);
و لكن ماذا لو اردنا تاخير الامر لمده طويله و لتكن 10 ساعات مثلا ؟؟
كيف يكون الامر ؟؟هل نحول الساعات الى دقائق ثم ثواني ؟ و هذا ليس منطقيا .. ام ان هناك امر اخر .. الرجاء الشرح مع التوضيح لو تكرمتم

اعلانات

walid nadim
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2015
المشاركات: 92
نشاط [ walid nadim ]
قوة السمعة:0
قديم 22-11-2017, 02:56 AM المشاركة 2   
افتراضي


هناك عدة طرق من بينها استعمال حلقة loop مثل for و while
مثال

for(x=0; x<1000; x++) delayTime_ms(5000); g

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

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 22-11-2017, 05:09 AM المشاركة 3   
افتراضي


السلام عليكم و رحمة الله :
اخواني انا اعرف ان امر التاخير يكون بالثواني و كل الف ميلي ثانيه تعتبر ثانيه , فلو اردنا تاخير 5 ثواني
نكتب الامر DELAY_MS(5000);
و لكن ماذا لو اردنا تاخير الامر لمده طويله و لتكن 10 ساعات مثلا ؟؟
كيف يكون الامر ؟؟هل نحول الساعات الى دقائق ثم ثواني ؟ و هذا ليس منطقيا .. ام ان هناك امر اخر .. الرجاء الشرح مع التوضيح لو تكرمتم
هذه التعليمة بحد أقصى 4294967295 مللى ثانية أى بقسمتها على 1000 ثم 3600 ينتج 1193.05 ساعة أى 49.71 يوم
المشكلة فى مثل هذه التعليمات أنها توقف حركة الميكرو للفترة الزمنية لأنها و طبقا لملف امساعدة للبرنامج تولد دورة مثل دورة For لهذا القدر من الوقت و من ثم لو WDT فاعل سيخرج الميكرو من هذه الدورة
الأصوب و ما اتبعه دوما هو أن انشئ متغير بالسعة المناسبة ثم استخدم تايمر 16 بت لكى يعطى مقاطعة كل فترة أطول ما يتيح النظام و مناسبة للحساب و فى برنامج المقاطعة أضيف واحد لهذا المتغير فإن وصل للحد المناسب اصفر المتغير و أفعل شيئا ما ثم أعود و إلا أعود فقط وهذا استخدمته فى عمل ساعة بدون RTC و غيره من المشاريع التى تحسب وقت طويل أيام و اسابيع و شهور


التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 23-11-2017 الساعة 05:02 AM السبب: تصحيح أخطاء هجائية
احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 2 اعجاب
اعجاب abu-thabit, borda ( أعجبته المشاركة )

A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 26-11-2017, 06:48 AM المشاركة 4   
افتراضي


ممكن مثال عملي اذا سمحت


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 26-11-2017, 07:03 AM المشاركة 5   
افتراضي


معذرة الموضوع يعتمد على الميكرو المستخدم و على المترجم وهذا يتطلب دراسة خواص الرقم الذى تستخدمه ثم تختار تايمر 16 بت و تفعل خاصية المقاطعة ولو له pre scaler أيضا تفعلة و تختار له عدد يقاطع كل زمن سهل الإستخدام مثل 10 مللى ثانية أو 100 مللى ثانية
ثم تنشئ متغير بالحجم الذى تحتاجه لكى يعد الوقت الكلى المطلوب
فى Function الخاص بالمقاطعة تزود 1 لهذا المتغير Increment ثم تقارن بالتعليمة If else
يجب أن تقرأ الداتاشيت جيدا للرقم المستخدم من الميكرو


A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 27-11-2017, 12:27 PM المشاركة 6   
افتراضي


بوركت اخي ... البرنامج المستخدم مايكرو سي و بروتس و البك المستخدم 16f628a و 16f877a
ارجو كتابة برنامج بسيط على مدة تأخير ساعتين ... تحملني اخي حيث انني متدرب و خبرتي بسيطه في مجال البرمجه


borda
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2007
المشاركات: 85
نشاط [ borda ]
قوة السمعة:0
قديم 27-11-2017, 10:44 PM المشاركة 7   
adevil Timer 0


كود:
unsigned short counter=0, counter2=0;

//Timer 0 initiallisations
void InitTimer0()
{
  //OPTION Register
  OPTION_REG.T0CS = 0; //Internal instruction cycle clock (CLKOUT)
  OPTION_REG.PSA = 0;  //Prescaler is assigned to the Timer0 module

  //PS2:PS0: Prescaler Rate Select bits, Prescaler 1:64
  OPTION_REG.PS2 = 1;
  OPTION_REG.PS1 = 0;
  OPTION_REG.PS0 = 1;


  TMR0 = 99; //Timer0 starts counting value

  //INTCON Register
  INTCON.TMR0IE = 1; //1 = Enables the TMR0 Interrupt
  INTCON.PEIE=1;  //Enables all unmasked peripheral interrupts
  INTCON.GIE = 1; //1 = Enables all interrupts

}


//isr
void Interrupt()
{
  if(INTCON.TMR0IF == 1)   //if timer0 interrupt occured
  {
     INTCON.TMR0IF = 0;  //reset timer0 interrupt flag
     TMR0 = 99; //Timer0 starts counting again

     counter++; //counts 1 second
     
     counter2++; //counts 2 seconds
     
     if(counter == 100)
     {
       counter=0;
       portb.b0 = ~portb.b0; //toggle led
     }
     
     if(counter2 == 200)
     {
       counter2=0;
       portb.b1 = ~portb.b1; //toggle led
     }


  }
}



void main() 
{
   InitTimer0(); //Timer 0 initiallisations
   
   //pin B0 as output
   trisb.b0 = 0;
   portb.b0 = 0;
   
   trisb.b1 = 0;
   portb.b1 = 0;

}


التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 28-11-2017 الساعة 05:20 AM السبب: وضعها فى صيغة Code
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً ماجد عباس محمد ( شكر العضو على هذه المشاركة )

A-M-S
:: مهندس جيد ::
تاريخ التسجيل: May 2014
المشاركات: 242
نشاط [ A-M-S ]
قوة السمعة:0
قديم 28-11-2017, 02:16 PM المشاركة 8   
افتراضي


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

إضافة رد

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

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

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


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

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