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

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

احب اتعلم
:: مهندس ::
تاريخ التسجيل: Jun 2012
المشاركات: 5
نشاط [ احب اتعلم ]
قوة السمعة:0
قديم 26-06-2012, 01:54 PM المشاركة 1   
افتراضي مشكلة عند ادخال البيانات للمتحكم بواسطة مفاتيح Twitter FaceBook Google+



المطلوب:
عند ضغط المفتاح نفذ الامر الفلاني

وكل محاولاتي فاشله , وجربت اكواد كثيرة

وكذلك جربت اكواد المهندس احمد سمير جزاة الله كل خير , لكن نفس المشكلة
http://www.qariya.com/vb/showpost.ph...4&postcount=68


المشكلة التي تواجهني يتم تنفيذ الاكواد سواء كان المفتاح مضغوط او لا

ملاحظه: الهاردوير سليم 100% ولا يوجد اي خطا
الخطا في السوفت وير ( بسبب خطوط حمراء في الكود موضحها بالاسفل بالصورة التالية )

توضيح:
المنفذ B: مخرج
المنفذ C: مخرج
المنفذ D: مخرج
المنفذ A: مدخل
المنفذ E: مدخل

نوع المتحكم
PIC 16F877A

اعتقد الخطا بسبب الخطوط الحمراء كما بالصورة التالي








void main() { trisb=0; trisa=0xff; loop: if(porta.f0==0) { portb.f0=1; delay_ms(1000); portb.f0=0; delay_ms(1000); } if(porta.f1==1) { portb.f0=1; delay_ms(3000); portb.f0=0; delay_ms(5000); } goto loop; }

ارجوا افادتي

اعلانات

احب اتعلم
:: مهندس ::
تاريخ التسجيل: Jun 2012
المشاركات: 5
نشاط [ احب اتعلم ]
قوة السمعة:0
قديم 26-06-2012, 01:57 PM المشاركة 2   
افتراضي


كود:
void main()
{
char 
trisb=0;
for(x=0;x<10;x++)
{
portb.f7=1;
delay_ms(1000);
portb.f7=0;
delay_ms(1000);
}
for(x=0;x<5;x++)
{

portb.f3=1;
delay_ms(1000);
portb.f3=0;
delay_ms(1000);
}

}

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

الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:92
قديم 26-06-2012, 02:56 PM المشاركة 3   
افتراضي


بسم الله الرحمن الرحيم
اخى
الكود الى فى الرد الاول غير الكود الى فى الرد الثانى دة اية ودة اية ؟؟
وفى اخطاء كثيرة

عموما انا شايف انك فاتح اكثر من مشروع فى الميكروسى
وللعم يمكن ان تكون فاتح مشروع ومشروع ثانى هو الى بيتعملة معالجة
يعنى انت عمال تكتب فى الصفحة دى واصلا الى بيتنفذ منه ملف هكس صفحة تانية فامهما عدلت واحد

وبردوة الكود دة ان شاء الله يشتغل معاك


كود:
void main()
 {
  trisa=255;
  trisb=0;
  portb=0;
while(1){
if (porta.f0==0){portb.f0=1;delay_ms(1000);portb.f0=0;delay_ms(1000);}
if (porta.f1==1){portb.f0=1;delay_ms(3000);portb.f0=0;delay_ms(5000);}
}
}
دة يكافىء الكود الى فى الصورة

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


احب اتعلم
:: مهندس ::
تاريخ التسجيل: Jun 2012
المشاركات: 5
نشاط [ احب اتعلم ]
قوة السمعة:0
قديم 26-06-2012, 03:44 PM المشاركة 4   
افتراضي


بسم الله الرحمن الرحيم
اخى
الكود الى فى الرد الاول غير الكود الى فى الرد الثانى دة اية ودة اية ؟؟
وفى اخطاء كثيرة

عموما انا شايف انك فاتح اكثر من مشروع فى الميكروسى
وللعم يمكن ان تكون فاتح مشروع ومشروع ثانى هو الى بيتعملة معالجة
يعنى انت عمال تكتب فى الصفحة دى واصلا الى بيتنفذ منه ملف هكس صفحة تانية فامهما عدلت واحد

وبردوة الكود دة ان شاء الله يشتغل معاك


كود:
void main()
 {
  trisa=255;
  trisb=0;
  portb=0;
while(1){
if (porta.f0==0){portb.f0=1;delay_ms(1000);portb.f0=0;delay_ms(1000);}
if (porta.f1==1){portb.f0=1;delay_ms(3000);portb.f0=0;delay_ms(5000);}
}
}
دة يكافىء الكود الى فى الصورة

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

نفس المشكلة

وجربته على الهاردوير وايضا على البروتوس

يتم تنفيذ الكود دون النظر للمفتاح

مايتم تنفيذه هو ( يضي الليد ثم يطفي بتكرار , سواء كان المفتاح مضغوط او لا )

والله تعبت جربت اكواد كثيرة

وغيرت الاصدار ونفس المشكلة

ياترى ماهو الحل ؟؟


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:92
قديم 26-06-2012, 04:40 PM المشاركة 5   
افتراضي


بسم الله الرحمن الرحيم

اعذرنى الكود فية غلطة بسيطة اسف مختش بالى

هذا هو الكود الصحيح


كود:
void main()
 {
  trisa=255;
  trisb=0;
  portb=0;
  ADCON1=6;

while(1){
if (porta.f0==0){portb.f0=1;delay_ms(1000);portb.f0=0;delay_ms(1000);}
if (porta.f1==1){portb.f0=1;delay_ms(3000);portb.f0=0;delay_ms(5000);}
}
}
والغلطة كانت عدم ادراج هذا الامر


ADCON1=6;

وهو يجعل كل اطارف بورت a تعمل كا ديجتال

جربة كدة وباذن الله هيشتغل

ملحوظة انت مخلى الطرف porta.f1 يعمل عندما قيمته تساوى 1 اى عكس porta.f0


احب اتعلم
:: مهندس ::
تاريخ التسجيل: Jun 2012
المشاركات: 5
نشاط [ احب اتعلم ]
قوة السمعة:0
قديم 26-06-2012, 07:41 PM المشاركة 6   
افتراضي


بسم الله الرحمن الرحيم

اعذرنى الكود فية غلطة بسيطة اسف مختش بالى

هذا هو الكود الصحيح


كود:
void main()
 {
  trisa=255;
  trisb=0;
  portb=0;
  ADCON1=6;

while(1){
if (porta.f0==0){portb.f0=1;delay_ms(1000);portb.f0=0;delay_ms(1000);}
if (porta.f1==1){portb.f0=1;delay_ms(3000);portb.f0=0;delay_ms(5000);}
}
}
والغلطة كانت عدم ادراج هذا الامر


ADCON1=6;

وهو يجعل كل اطارف بورت a تعمل كا ديجتال

جربة كدة وباذن الله هيشتغل

ملحوظة انت مخلى الطرف porta.f1 يعمل عندما قيمته تساوى 1 اى عكس porta.f0
يا سلام عليك يابطل , هات راسك ابوسه

وربي فرحت كثير , واخيرا


عندي استفسار بخصوص هذا الامر ADCON1=6;

ماذا لو أردت كافة اطراف C ديجتال بدلا من A , كيف يصبح شكل الامر؟ ADCON1=6;



------
كود:
void main()
 {
  trisa=255;
  trisb=0;
  portb=0;
  ADCON1=6;

while(1){
if (porta.f0==0){portb.f0=1;delay_ms(1000);portb.f0=0;delay_ms(100);}


if (porta.f1==0){portb.f1=1;delay_ms(1000);portb.f1=0;delay_ms(100);}

}
}
ملاحظه:
عند ضغط مفتاح A0 يتم تنفيذ الامر
عند ضغط مفتاح A1 لن يتم تنفيذ الامر حتى ينتهي من تنفيذ الامر الاول
بمعنى اخر : لا تستطيع ضغط المفتاحين معا بنفس اللحظه

---
على فكرة مازالت الخطوط الحمراء موجوده , والبرنامج يعمل بنجاح , ياترى كيف ازيل الخطوط الحمراء لأنها تحوي بأن هنالك خطا , اعتقد بسبب الاصدار , لأنها لم تظهر معي في الاصدار الجديد 5.61 لكن لا املك المفتاح

واكرر شكري لسعادتكم


الصورة الرمزية funky112233
funky112233
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2009
المشاركات: 666
نشاط [ funky112233 ]
قوة السمعة:92
قديم 26-06-2012, 09:46 PM المشاركة 7   
افتراضي


ههههههههههههههههههه شكرا يا اخى

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

والامر ادكون يستعمل للبورت اية فقط

اما موضوع تنفيذ الاوامر ببطء وتشغيل الزرارين مع بعضهم البعض

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

الطريقة الاولى

وهى تنفيذ الاوامر بتاعت الانتظار على فترات بسيطة ومع التكرار فى الاختبارت للزرار

مثال علشان الفهم يوضح ويزيد ان شاء الله

كود:
while(1){

if (portc.f0==0){loop1:portb.f0=1;for (x=0;x<100;x++){if (portc.f1==0){goto loop2;}delay_ms(10);}portb.f0=0;for (x=0;x<100;x++){if (portc.f1==0){goto loop;}}}
if (portc.f1==0){loop2:portb.f0=1;for (x=0;x<300;x++){if (portc.f1==0){goto loop1;}delay_ms(10);}portb.f0=0;for (x=0;x<500;x++){if (portc.f1==0){goto loop1;}delay_ms(10);}}
}
هذا هو نفس الكود بتاعك ولكن بعد التعديل علية لجعله اكثر سرعه فى الاستجابة للزرار
وهى جعل جملة التكرار for تعمل لحسب اوامر الانظار الى انت عايزها يعنى فى المثال انت عايز تنور البورت b رقم صفر لمدة ثانية اى 1000 مللى ثانية
ااقسم الالف على 10 تديك 100 هذا هو عدد التكرار وجعل امر الانتظار 10 مللى ثانية فقط
وعملا الختبار داخل جملة for

يعنى الخلاصة هو بيختبر الزراير كل 10 مللى ثانية وفى نفس الوقت بينتظر ثانية كاملة يعنى كدة قسمنا الثانية وفى كل جزء بنختبر هل تم الضغط على الزرار ام لا

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

فى طريقة ثانية
وهى الانتربت او المقاطعه ودى عايزة موضوع للشرح وهتلاقية هنا
http://www.qariya.com/vb/showthread.php?t=46338
ودى عمليا جدااااااا

وفى طرق تانى بس معقدة شوية عن كدة


احب اتعلم
:: مهندس ::
تاريخ التسجيل: Jun 2012
المشاركات: 5
نشاط [ احب اتعلم ]
قوة السمعة:0
قديم 27-06-2012, 10:29 AM المشاركة 8   
افتراضي


ههههههههههههههههههه شكرا يا اخى

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

والامر ادكون يستعمل للبورت اية فقط

اما موضوع تنفيذ الاوامر ببطء وتشغيل الزرارين مع بعضهم البعض

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

الطريقة الاولى

وهى تنفيذ الاوامر بتاعت الانتظار على فترات بسيطة ومع التكرار فى الاختبارت للزرار

مثال علشان الفهم يوضح ويزيد ان شاء الله

كود:
while(1){

if (portc.f0==0){loop1:portb.f0=1;for (x=0;x<100;x++){if (portc.f1==0){goto loop2;}delay_ms(10);}portb.f0=0;for (x=0;x<100;x++){if (portc.f1==0){goto loop;}}}
if (portc.f1==0){loop2:portb.f0=1;for (x=0;x<300;x++){if (portc.f1==0){goto loop1;}delay_ms(10);}portb.f0=0;for (x=0;x<500;x++){if (portc.f1==0){goto loop1;}delay_ms(10);}}
}
هذا هو نفس الكود بتاعك ولكن بعد التعديل علية لجعله اكثر سرعه فى الاستجابة للزرار
وهى جعل جملة التكرار for تعمل لحسب اوامر الانظار الى انت عايزها يعنى فى المثال انت عايز تنور البورت b رقم صفر لمدة ثانية اى 1000 مللى ثانية
ااقسم الالف على 10 تديك 100 هذا هو عدد التكرار وجعل امر الانتظار 10 مللى ثانية فقط
وعملا الختبار داخل جملة for

يعنى الخلاصة هو بيختبر الزراير كل 10 مللى ثانية وفى نفس الوقت بينتظر ثانية كاملة يعنى كدة قسمنا الثانية وفى كل جزء بنختبر هل تم الضغط على الزرار ام لا

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

فى طريقة ثانية
وهى الانتربت او المقاطعه ودى عايزة موضوع للشرح وهتلاقية هنا
http://www.qariya.com/vb/showthread.php?t=46338
ودى عمليا جدااااااا

وفى طرق تانى بس معقدة شوية عن كدة
يا سلام عليك على الشرح الحلو

استفدت كثيرا

وجاري الدخول في عالم المقاطاعات

بارك الله فيك وكثر من امثالك

وشكرا لك

تقبل تحياتي

إضافة رد

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

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

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


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

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