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

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

أبو كريم555
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 30
نشاط [ أبو كريم555 ]
قوة السمعة:0
قديم 02-11-2017, 12:04 AM المشاركة 1   
افتراضي يتحقق الشرط ولكن ليس قبل زمن,كيف ذلك؟ Twitter FaceBook Google+



السلام عليكم
اريد مساعدة كود
لو الخرج يتغير من 0 الى 1 لشرط معين if statment
مثال على ذلك
كود:
if (portb.f0==0)motor=1;
لو الشرط خلص يعني
كود:
if (portb.f0==1)motor=0;
هذا سيكون المرة الاولى ولكن لا يتحقق هذا الشرط اذا لم يمر عليه 4 دقائق مثلا
يعني
كود:
كود:
if (portb.f0==0&&delay_ms(4000);)motor=1;
كيف يمكنني ان اكتب هذا الكود ؟
شكرا

اعلانات

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


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

أما لو تريد استخدام الميكرو فى وظائف أخرى و بعد انقضاء الوقت تنفذ الشرط
يمكنك هنا أن تفعل Timer من النوع 16 بت و تضع له prescale مع مصدر clock مناسب لتوفير هذا الوقت الطويل وهذا يعتمد أساسا على نوع الميكرو المستخدم ثم إما تختبر كل حين هل انتهى العد أو تستخدم خاصية المقاطعة وهى الأفضل

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

أبو كريم555
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 30
نشاط [ أبو كريم555 ]
قوة السمعة:0
قديم 03-11-2017, 03:46 PM المشاركة 3   
افتراضي


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

أما لو تريد استخدام الميكرو فى وظائف أخرى و بعد انقضاء الوقت تنفذ الشرط
يمكنك هنا أن تفعل Timer من النوع 16 بت و تضع له prescale مع مصدر clock مناسب لتوفير هذا الوقت الطويل وهذا يعتمد أساسا على نوع الميكرو المستخدم ثم إما تختبر كل حين هل انتهى العد أو تستخدم خاصية المقاطعة وهى الأفضل
السلام عليكم
اذا تحقق الامر في المرة الاولى عند التشغيل فيعمل مباشرة يعني
كود:
motor=1;
واذا فصلت الكهرباء مثلا فلا يتحقق الامر الا اذا مرت اربع دقائق
يا ريت يا استاذ من فضلك لو تتكتب الكود هنا
مشكور


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


معذرة
كلامى كان واضح وردك لم تفيدنى بأى معلومة
أولا delay_ms() يمكنها أن تعطيك تأخير لعدة أيام وليس فقط 4 دقائق
عند انقطاع الكهرباء "مثلا" لا شيء فى البرمجة اسمه مثلا ولكن عند كذا يحدث كذا
انقطاع الكهرباء قد يكون عن الميكرو فتضع هذا الأمر عند البدء
أما لو انقطعت الكهرباء فى جزء من الدائرة و بقى الميكرو يعمل هنا تستخدم المقاطعة

و المقاطعة كما ذكرت
تعتمد على نوع الميكرو المستخدم


الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 10,061
نشاط [ حيدر علاج حسن ]
قوة السمعة:395
قديم 04-11-2017, 12:03 PM المشاركة 5   
افتراضي


فقط استخرج عبارة التاخير من داخل الشرط و ضعها بعد جملة الشرط مباشرة
كود:
if(portb.f0==0){
delay_ms(4000);
motor=1;}

حيدر علاج حسن

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 324
نشاط [ احمد شهيد جواد ]
قوة السمعة:0
قديم 06-11-2017, 02:44 PM المشاركة 6   
افتراضي


السلام عليكم ....

اخي الكريم استخدام تعليمة DELAY ليس صحيح . لأنها تسبب بتجميد المتحكم بعد فتره معينة , والافضل استخدام التايمر الداخلي للمتحكم .....

في هذا الكود جعلت التايمر زيرو يعد 10MS وجعلت المتغير الاول يعد 100 انتربت . اي 1S وبعدها يتم ارجاعه للصفر وزيادة المتغير الثاني ,,,

وفي الشرط جعلت عند تحقق الضغط على السويتش تصفير للمتغيرات السابقة حتى يتم عد 4 ثواني , وفي داخل اختبار الشرط جعلت شرط ثاني وهو مرور مدة 4 ثواني وبعدها انفذ ما اريد ,,,,




كود:
char timer1=0,timer2=0;


void InitTimer0(){
  OPTION_REG	 = 0x86;
  TMR0		 = 100;
  INTCON	 = 0xA0;
}

void Interrupt(){
  if (TMR0IF_bit){
    TMR0IF_bit	 = 0;
    TMR0		 = 100;
   timer1++;
   if(timer1==100){ timer1=0; timer2++;}
  }
}

void main()
{
  InitTimer0();
  trisa.f0=1;
  trisb.f=0;
  while(1)
  {
   if(porta.f0==1){ timer1=0; timer2=0; if(timer2==4){portb.f0=1;}}

  }

}


أبو كريم555
:: مهندس ::
تاريخ التسجيل: May 2016
المشاركات: 30
نشاط [ أبو كريم555 ]
قوة السمعة:0
قديم 08-12-2017, 09:31 AM المشاركة 7   
افتراضي


لسلام عليكم
اسف اخي الكريم على الرد المتأخر لاني كنت امر بفترة مرض و الحمدلله
اريد عند التشغيل الاول لا يوجد تأخير ولكن عند التشغيل الثاني اذا كان الزمن فرضا اقل من 2 دقيقة فلا يوجد خرج ,اما اذا كان الزمن اكبر من 2 دقيقة فالخرج يساوي 1 ,
هل يوجد register يعمل flag عند اعادة الكهرباء للدائرة من جديد ؟
مشكور أخي الكريم


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


لسلام عليكم
اسف اخي الكريم على الرد المتأخر لاني كنت امر بفترة مرض و الحمدلله
الحمد لله على السلامة
اريد عند التشغيل الاول لا يوجد تأخير ولكن عند التشغيل الثاني اذا كان الزمن فرضا اقل من 2 دقيقة فلا يوجد خرج ,اما اذا كان الزمن اكبر من 2 دقيقة فالخرج يساوي 1 ,
أرجو ان يكون استفسارك واضح
التشغيل الأول من ماذا؟؟؟؟
هل لديك loop تتكرر إذن فى أول مرة لا يحدث تأخير ثم يحدث بعد ذلك؟ أم ماذا تقصد بالضبط
هل يوجد register يعمل flag عند اعادة الكهرباء للدائرة من جديد ؟
مشكور أخي الكريم
لا يوجد شيء كهذا لكن يمكنك عمل متغير حتى من بت واحدة و تجعله بصفر عند بدء التشغيل
عندما يتحقق الشرط اجعله =1 وهكذا لا تكرر الأمر
إن أردت امساعدة الصحيحة يجب أن يكون شرحك واضحا

إضافة رد

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

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

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


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

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