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

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

منى حسين
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2011
المشاركات: 97
نشاط [ منى حسين ]
قوة السمعة:0
قديم 20-10-2018, 11:43 PM المشاركة 1   
افتراضي مساعدة فى برنامج Twitter FaceBook Google+



اخوانى
هذا برنامج يستخدم البيك 16f84A يتم وضع مفتاح على PORT B= 7(دخل ) ويتم وضع ليد على طرف
PORTB=0
PORTB=1
اى البورت كخرج
بالضغط على المفتاح يضىء الليد الاول
بالضغط على المفتاح مرة ثانية يطفاء الليد الاول
بالضغط على المفتاح مرة ثالثة يضىء الليد رقم واحد ثم ينتظر 1500 ثانية ويضىء الليد الثانى مع بقاء الاول مضاء
وبالضغط على المفتاح رابعا يطفاء الجميع يعنى الاول والثانى

كود:
int X =0; void main() { TRISB=128; PORTB=0; while(1){ if(PORTB.F7==1){ X++; delay_ms(250); } if(X==1){ PORTB=1;delay_ms(250);} if(X==2){ PORTB=0;delay_ms(250);} if(X==3){ PORTB=2;delay_ms(1500); PORTB=3; X=4;delay_ms(250);} if(X==5){ PORTB=0; X=0;delay_ms(250); } } }
وتم عمل هذه الدائرة وتعمل بكفاءة على ارض الواقع


وتم تعديل هذا البرنامج كالاتى:
كود:
int X =0; void main() { TRISB=128; PORTB=0; while(1){ if(PORTB.F7==1){ X++; delay_ms(1000); } if(X==1){ PORTB.F0=1;} if(X==2){ PORTB.F0=0;} if(X==3){ PORTB.F1=1; delay_ms(1500); PORTB.F0=1; X=4; } if(X==5){ PORTB=0; X=0; } }
الا انه يعمل بالمحاكاه ولا يعمل اطـــــلاقا على ارض الواقع



ارجو المساعدة لماذا لا يعمل البرنامج المعدل فى الطبيعة ويعمل فى المحاكاه


التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 21-10-2018 الساعة 05:58 AM السبب: إدراج تنسيق "كود" لتسهيل القراءة
اعلانات

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


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

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

منى حسين
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2011
المشاركات: 97
نشاط [ منى حسين ]
قوة السمعة:0
قديم 22-10-2018, 05:08 PM المشاركة 3   
افتراضي


شكرا على الرد والاهتمام استاذ ماجد
البرنامج الاول والثانى يعمل بدون اى مشاكل فى المحاكاه لكن البرنامج الثانى فى الواقع العملى لا يعمل اطلاقا .... بمعنى اننى حرقت البرنامج الاول على بيك 16F84A فعمل فى المحاكاه وفى العملى
وحرقت البرنامج الثانى على بيك 16F84A اخـــر فعمل فى المحاكاة بامتياز ولكنه عند تطبيقه فى العملى لم يعمل
الدائرة التى تم تنفيذها استخدمتها فى الحالتين بمعنى اننى قمت بتغيير البيك فقط
وشكرا على الرد والتعليق


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 23-10-2018, 05:41 AM المشاركة 4   
افتراضي


رجاء مراجعة ردى السابق بدقه
قلت السبب انك فى الأول وضعتى تأخير ربع ثانية مع كل شرط و حذفتيه فى التعديل
المحاكاة لا تحدث فى الوقت الحقيقى فسرعة التنفيذ تعتمد على سرعة الهاردوير فى الحاسوب أولا ثم يلى ذلك الويندوز المستخدم و كم يخصص من وقت البروسيسور لتنفيذ برنامج المحاكاة وسط عشرات من البرامج التى تجرى فى الخلفية و بعد ذلك سرعة برنامج المحاكاة فى تقليد تصرف الدائرة و أخيرا سرعة تطبيق البرنامج المستخدم فى الميكرو و تحويله من هكسا إلى خطوات يفهمها البروسيسور وفى الواقع جمع رقمين هو أمر واحد 4 نبضات أما فى المحاكاة جمع عادى ثم نفحص أى Flag سيتأثر نتيجة ذلك و نعدل شبيهه فى المحاكاة طبقا للنتائج ....الخ وهو أمر آخر تماما - قصة طويلة لمحاكاة كل أمر بسيط
بينما فى الواقع فلو على اسوأ الفرضيات استخدمتى كريستال 1 ميجا و ليس 4 ميجا أو 8 أو 20 ميجا ، فستكون سرعة البيك هى 1 ميجا على 4 أى 250 ألف تعليمة فى الثانية أى سيتمم تنفيذ كل البرنامج المكتوب فى أقل من مللى ثانية و أقل زمن للضغط على الزر بالسرعة البشرية هى 0.1 ثانية أى 100 مرة أطول من زمن البرنامج
هذه قصة معروفة لكل من يستخدم أى ميكرو مع أزرار فإما تستخدمى التأخير كما فى البرنامج الأول أو تستخدمى الأمر
Button
وهو موجود فى المكتبة مع ميكروسى
أما نصيحتى باستخدام الأمر switch فكان فقط لتحسين البرنامج switch ........case ولم أقصد به أى علاقة بالازرار

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

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


اكتب جملة الشرط بهذا الشكل
كود:
 if(PORTB.F7==1){while(portb.f7){}
                 X++; 
                }
بهذه الطريقة سيعمل الكود بشكل طبيعي مهما طال زمن الضغط على المفتاح

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

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 24-10-2018, 02:59 PM المشاركة 6   
افتراضي


اخوانى
هذا برنامج يستخدم البيك 16f84A يتم وضع مفتاح على PORT B= 7(دخل ) ويتم وضع ليد على طرف
PORTB=0
PORTB=1
اى البورت كخرج
بالضغط على المفتاح يضىء الليد الاول
بالضغط على المفتاح مرة ثانية يطفاء الليد الاول
بالضغط على المفتاح مرة ثالثة يضىء الليد رقم واحد ثم ينتظر 1500 ثانية ويضىء الليد الثانى مع بقاء الاول مضاء
وبالضغط على المفتاح رابعا يطفاء الجميع يعنى الاول والثانى

كود:
int X =0; void main() { TRISB=128; PORTB=0; while(1){ if(PORTB.F7==1){ X++; delay_ms(250); } if(X==1){ PORTB=1;delay_ms(250);} if(X==2){ PORTB=0;delay_ms(250);} if(X==3){ PORTB=2;delay_ms(1500); PORTB=3; X=4;delay_ms(250);} if(X==5){ PORTB=0; X=0;delay_ms(250); } } }
وتم عمل هذه الدائرة وتعمل بكفاءة على ارض الواقع


وتم تعديل هذا البرنامج كالاتى:
كود:
int X =0; void main() { TRISB=128; PORTB=0; while(1){ if(PORTB.F7==1){ X++; delay_ms(1000); } if(X==1){ PORTB.F0=1;} if(X==2){ PORTB.F0=0;} if(X==3){ PORTB.F1=1; delay_ms(1500); PORTB.F0=1; X=4; } if(X==5){ PORTB=0; X=0; } }
الا انه يعمل بالمحاكاه ولا يعمل اطـــــلاقا على ارض الواقع

ارجو المساعدة لماذا لا يعمل البرنامج المعدل فى الطبيعة ويعمل فى المحاكاه
أعتذر بشدة عن ردودى السابقة فلغة السى وحدها مربكة بالقدر الكافى لجعل تتبعها مشقة و ميكرو سى جعلها أسوأ
على ما أظن أن التعليمة التى يمكنها التعامل مع بت واحدة هى
كود:
PORTB0_bit=0
وليست 
PORTB.0=0
وهذا الاسلوب موجود فى ملفات المساعدة

عموما نصيحة مع الميكرو سى يفضل دوما تعريف كل بت باسم فلو كتبت فى الأول
sbit LED1 at rb0_bit ;
سيعطي رسالة خطأ لو لم تكن التسمية صحيحة و لو كانت صحيحة سيقبلها لاحقا لكى تكون =0 أو =1
لكن فى هذه الحالة portb.1 لا يعطى رسالة خطأ ولا يولد لها كود صحيح

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

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

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

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


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

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