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

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

الصورة الرمزية avip
avip
:: مهندس متواجد ::
تاريخ التسجيل: Oct 2010
المشاركات: 199
نشاط [ avip ]
قوة السمعة:0
قديم 29-11-2012, 10:55 PM المشاركة 1   
ha كتابة برنامج بلغة السي Twitter FaceBook Google+



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

ارجو المساعدة في كتابة برنامج بلغة السي
كيف اقوم بجعل المتحكم ينفذ كود معين اثناء قيامه بوظيفة وذلك عن طريق الضغط علي زر فمثلاَ
قد صممت برنامج بسيط لانارة 4 لدات كالتالي
كود:
[void main() { char x=35; trisa=1; trisb=0; portb=0; for (;;) { portb=0b00000000; delay_ms(20); portb=0b00000001; vdelay_ms(x); portb=0b00000010; vdelay_ms(x); portb=0b00000100; vdelay_ms(x); portb=0b00001000; vdelay_ms(x); } }
نلاحظ انه يتم تكرار البرنامج عدد لانهئي من المرات
فكيف اقوم بوضع كود اضافي اذا تم ضفط زر متصل بالمتحكم يتم تنفيذه
كاضافة زر كلما تم الضغط عليه يتم زيادة المتغير x بقيمة معينه


كما انني احتاج الي كتاب يقوم بشرح لغة السي فهل اجده عندكم
ولكم جزيل الشكر وفائق الاحترام

اعلانات

الصورة الرمزية اكترونى بشري
اكترونى بشري
:: مهندس جيد ::
تاريخ التسجيل: Apr 2010
الدولة: libya-tripoli
المشاركات: 201
نشاط [ اكترونى بشري ]
قوة السمعة:0
قديم 30-11-2012, 11:09 AM المشاركة 2   
افتراضي


اخى اسف على الرد السريع والمقتضب لكن عل حسب مافهمتك انك تريد
ان تضيف زر يعمل عند لضغط عليه اذا كان قهمى صحيح فهذا الكود ان شاء الله
مثلا نريد عند الضغط على الزر يزيد متغير الــx بقيمة متلا 1 تانية
كود:
if (porta.b0==0)x+100;
طبعا الزر يكون فى اوب بن للبورت a
ويكون توصيلته على طريقة البول اب ريسستور
هذه الطريقة ياختصار اخى اى استفسار انا تحت امرك

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

الصورة الرمزية avip
avip
:: مهندس متواجد ::
تاريخ التسجيل: Oct 2010
المشاركات: 199
نشاط [ avip ]
قوة السمعة:0
قديم 30-11-2012, 01:09 PM المشاركة 3   
ha


شكرا لاهتمامك اخي الكريم

وقمت بتنفيذ الكود الذي قمت بوضعه ولكن لا يعمل اخي الفاضل لان البرنامج يدخل في حلقة تكرارية مفتوحة فلا يستقبل الاشارة من المفتاح
وسؤال هو كيف اجعل الباك يستقبل الاشارة من المفتاح اثناء تنفيذه للعمليات المطلوبه منه

ولك جزيل الشكر


الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 10,061
نشاط [ حيدر علاج حسن ]
قوة السمعة:394
قديم 30-11-2012, 02:28 PM المشاركة 4   
افتراضي


اكتب الجملة الخاصة بالمفتاح داخل اللوب ...

كود:
if(porta.f0==0){while(porta.f0==0){} x++;}
في هذه الجملة عند الضغط على المفتاح يبقى المتحكم ينتظر رفع اليد من المفتاح ...
بعد ذلك يزيد المتغير X بواحد بعد كل ضغطة ...
جرب واعطنا النتيجة ...


الصورة الرمزية avip
avip
:: مهندس متواجد ::
تاريخ التسجيل: Oct 2010
المشاركات: 199
نشاط [ avip ]
قوة السمعة:0
قديم 07-12-2012, 07:28 PM المشاركة 5   
ha شكرا جزيلاَ


اخي الفاضل ااسف عن تاخري في الرد بسبب انقطاع النت لدي وانشغالي في الدراسة

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

اتمني المساعدة واعتذر مرة اخري عن التاخر في الرد


الصورة الرمزية اكترونى بشري
اكترونى بشري
:: مهندس جيد ::
تاريخ التسجيل: Apr 2010
الدولة: libya-tripoli
المشاركات: 201
نشاط [ اكترونى بشري ]
قوة السمعة:0
قديم 07-12-2012, 08:21 PM المشاركة 6   
افتراضي


طيب اخى ممكن توضح لى كم الزيادة فى كل ضغطة يعنى كم تانية وموفق ان شاء الله


الصورة الرمزية avip
avip
:: مهندس متواجد ::
تاريخ التسجيل: Oct 2010
المشاركات: 199
نشاط [ avip ]
قوة السمعة:0
قديم 08-12-2012, 10:36 AM المشاركة 7   
افتراضي


تكون الزيادة بمقدار 50 ملي ثانية مثلا


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


طبعا هذه الطريقة ليس عملية لان الزمن بين كل ليد لو اصبح مثلا واحد ثانية فيتوجب عليك ان تمسك المفتاح اكثر من 4 ثواني لتحقيق الشرط ....
اي ان زمن امساك المفتاح = عدد الليدات × زمن اشتغال كل ليد ....
لذلك من الافضل استخدام مقاومة متغيرة يتم ادخالها على المنفذ التناظري للتحكم بسرعة الاشتغال ....
عموما هذا هو مخطط الدائرة و الكود ...



كود:
int y=1,i=0;
int x;
void on(char x)
 {
  portb=1;
  vdelay_ms(x*500);
  for(i=1;I<4;I++){
                      portb=2*portb;
                      vdelay_ms(x*500);
                      if(portb>8)portb=1;
                      }

 }

void main() 
{cmcon=7;
trisa=0xff;trisb=0;portb=0;
while(1)
        {
        if(porta.f1==0){while(porta.f1==0){on(y);}y++;}
        if(porta.f0==0){while(porta.f0==0){on(y);}y--;}
        if(y<1)y=1;
        else if(y>10)y=10;
        on(y);
        }
}

انا جعلت اقل زمن هو نصف ثانية و اعلى زمن 5 ثواني بمعدل زيادة نصف ثانية زيادة او نقصان مع كل ضغطة على مفتاح الزيادة او على مفتاح النقصان ...

يمكنك استخدام المذبذب الداخلي للبك ...

إضافة رد

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

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

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


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

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