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

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

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:0
قديم 10-02-2009, 01:15 AM المشاركة 1   
ha كيف اخرج من الانتربت بدون return? Twitter FaceBook Google+



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

لدى استفساران ارجوا الاجابة عليهما:

1-قمت بكتابة برنامج يحتوى على الانتربت وعند حدوث الانتربت ثم انتهاؤه اريد البرنامج يذهب الى مكان اخر غير الذى كان عنده قبل حدوث الانتربت."اى اننى لا اريد استخدام الامرreturn
2- الصورة التالية هى لبرنامج المحاكاة البروتس وتعرض السفن سجمنت الرقمين 2 و 1 ومن المفترض ان تعرض 5 و 1 وانا لا اعرف ما المشكلة ايضا من المفترض ان تقوم السفن سجمنت بالعد تنازلى من 15 الى صفر ولكنها ثابتة على الرقمين 2 و 1
لقد قمت بتجربة الكود على البيك سيميوليتر ونجح الامر ولكن البيك سيميوليتر به مشاكل مع الديلاى فحاولت ان اجربه على البروتس ولكن لا اعلم مالمشكلة





اعلانات

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 10-02-2009, 07:10 AM المشاركة 2   
افتراضي


إن شاء الله ستجد المساعدة ... ولكن وضح الأمر أكثر ؟

وما هي اللغة التي تستخدمها هل هي السي (أجدها في الصورة) أم الأسمبلي لاستخدامك الأمر RETURN ؟؟؟؟

ويفضل أن تضع الكود هنا لنحدد المشكلة بدقة ومن الأفضل أيضا أن ترفع الملف الخاص بالمحاكاه

وإن شاء الله نستطيع تحديد المشكلة جيدا وحلها .

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

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:0
قديم 10-02-2009, 04:35 PM المشاركة 3   
افتراضي


اللغة التى استخدمها هى لغة mikroC .
انا استخدم فى البرنامج الامر return فى نهاية النتربت حتى اجد الحل.
وهذا هو البرنامج كامل يحتوى على ملف المحاكاة اتمنى ان يكون واضحا بالنسبة لك حيث اننى لم اكمل البرنامج بعد وهناك اشياء قد تكون غير مرتبة نسبيا

http://up1.m5zn.com/download-2009-2-10-02-tskqmamco.rar


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 10-02-2009, 06:59 PM المشاركة 4   
افتراضي


أرجو أن تخبرني :: وظيفة البرنامج ؟؟ والهدف منه
ولماذا تستخدم الانتربت ؟؟

وربنا يسهل الأمور


زكي شاكر
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: المغرب
المشاركات: 3,062
نشاط [ زكي شاكر ]
قوة السمعة:183
قديم 10-02-2009, 07:23 PM المشاركة 5   
افتراضي


السلام عليكم
الرقم 1 ليس في مكانه المعتاد هو في الجانب القابل تماما ، ما يعطي الانطباع بان الرقم المعروض هو بالفعل 15 لكن بشكل مقلوب !


التعديل الأخير تم بواسطة : زكي شاكر بتاريخ 12-02-2009 الساعة 10:51 AM

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:0
قديم 10-02-2009, 09:35 PM المشاركة 6   
افتراضي


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

الاستاذ ahmad_s_f
وظيفة البرنامج:
يقوم البرنامج اذا كانت هذه اول مرة للتشغيل بعرض15 على السفنسجمنت ثم العد تنازلي الى صفر.ثم يعود الى 15 وهكذا .
RB0<<<<<interrupt switch
RA0>>>>>>upcount switch
RA1>>>>>>>>down count switch

عند حدوث الانتربت يتوقف العد على الرقم الذى هو موجود عليه ثم يتم زيادة او نقصانهذا الرقم بواسطة up\down switches وعند النتهاء من تحديد الرقم. يتم الضغط على الزر rb0 مرة اخرى لتسجيل هذا الرقم فى eeprom الاحاد فى الخانة صفر والعشرات فى الخانة 1فى الeeprom ثم يتم انهاء الانتربت ولكن لا يتم العودة الى المكان الذى كنت به قبل حدوث الانتربت بل يتم العد من الرقم الذى قمت بتحديده.
فى انتظار ردودكم وعلى فكرة البرنامج انا كنت عملته بالاسمبلى.
.................


m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:0
قديم 10-02-2009, 10:02 PM المشاركة 7   
افتراضي


نسيت ان اضيف اننى استطيع الخروج من الانتربت بدون return . والذهاب الى ال function التى اريد الذهاب اليها وهى count_down ولكن ذلك لا يعتبرخروجا بل يعتبر ذهاب الى دالة لتنفيذها .فاذا حدث ذلك مرات متتالية فان ال stack يمتلىء فيتوقف البرنامج.

void interrupt()
{
*
*
*
intcon=0x10;
eeprom_write(0x00,ones);
delay_ms(20);
eeprom_write(0x1,tens);
delay_ms(20);
intcon.f7=1;
count_down();
}

مشكلة اخرى غريبة:
هل يوجد مشكلة من الكتابة مرتين متتايتين فى ال eeprom حيث ان البرنامج احيانا وليس دائما يكتفى بكتابة الرقم الاول فى المخزن0 ولا يقوم بكتابة الرقم الثانى


الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 725
نشاط [ ahmad_s_f ]
قوة السمعة:80
قديم 11-02-2009, 12:32 AM المشاركة 8   
افتراضي


أخي الكريم m_mansour2005

الكود الذي كتبته به العديد من المشاكل ... حاولت إصلاح هذه المشاكل مع الحفاظ على نفس الفكر البرمجي التي تبرمج به أنت وبعد ثلاث ساعات من السهر تعبت ... فكلما أصلح مشكلة أجد مشكلة أخرى ظهرت ... فقررت أن أجعلك تسعادني قليلاً بعد إذنك ...

ولكن قبل أن تساعدني لابد أن أخبرك بشيء خطير ومهم وهو خطأ كبير تكرر في الكود الذي كتبته ... وربما يكون هو الذي جعل العداد لا يعمل هذا الخطأ هو كثرة استخدامك لجمل if التي تختبر قيمة البورت بشكل مباشر مثل
كود:
if(portc==0xf6) { portc=0xfe; delay_ms(1000);} if(portc==0xfe) { portc=0xe0;delay_ms(1000);} if(portc==0xe0) { portc=0xbe; delay_ms(1000);} if(portc==0xbe) { portc=0xb6;delay_ms(1000);} if(portc==0xb6) { portc=0x66;delay_ms(1000);} if(portc==0x66) { portc=0xf2;delay_ms(1000);} if(portc==0xf2) { portc=0xda;delay_ms(1000);} if(portc==0xda) { portc=0x60;delay_ms(1000);} if(portc==0x60) { portc=0xfc; delay_ms(1000);}
وأيضا

كود:
if(portb==0xfc ) وكذلك تجد في الكود أيضا if(portb==B[i]) و أيضا if(portc==B[i])

ولكن ما هو الحل الأمثل (من وجهة نظري)؟؟
إذا أردت أن تختبر قيمة البورت ( لكي تعرف الرقم الذي على السفن سيجمنت) عليك أن تنشئ متغير جديد وتضع داخل هذا المتغير قيمة البورت فعلى سبيل المثال لنختبر قيمة portc سنقوم بالخطوات التالية

كود:
أولا تعريف المتغير الذي سنضع بداخله القيمة الموجودة في البورت 
ليتسنى لنا بعد ذلك اختبار البورت عن طريق اختبار هذا المتغير .
char c1;

c1=portc;

وداخل الكود حينئذ يمكنني أن أكتب 

if(c1==0xf6)
فهذا الأمر سيختبر القيمة الموجودة في المتغير والتي هي نفسها الموجودة في بورت سي
 

وهذا هو الشيء الذي كنت أريد التنبيه إليه .

ولا أخفي عليك الطريقة البرمجية التي استخدمتها أنت في العداد أعتقد أنها تريد تحسين وتطوير ولا داعي لاستخدام هذا العدد الكبير من جملة If .

خلاصة الكلام :: (لأنني أنام حاليا وأنا أكتب ) ::

أولا : انتبه للخطأ السابق ..

ثانيا : البرنامج الذي تريد كتابته لا يعتبر صغير لذلك فأنا أنصحك بتجزيء البرنامج وتجزيء اختباره بمعنى أن البرنامج الآن يحتوي على عداد تنازلي والانتربت و كذلك الـ eeprom . لذلك عليك أن تقسم البرنامج على الأقل إلى ثلاث مراحل
1- مرحلة خاصة بإختبار العداد التنازلي
2- مرحلة خاصة بإختبار الانتربت والسويتشات
3- مرحلة خاصة بالذاكرة الدائمة eeprom

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

الخطوة العملية التي تليها هي أن نجعل العداد يعمل مع وجود خاصية السويتشات والانتربت .

الخطوة العملية الثالثة هي البرنامج الكامل (بإضافة الـ eeprom )

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

=======================================
عند حدوث الانتربت ثم انتهاؤه اريد البرنامج يذهب الى مكان اخر غير الذى كان عنده قبل حدوث الانتربت
الأمر بسيط .. اجعل في برنامجك متغير معين وليكن اسمه aa وقيمته صفر مثلا وفي الدالة الخاصة بالإنتربت والتي لن تنفذ إلا في حالة حدوث الانتربت اكتب أمر يجعل قيمة المتغير aa بواحد مثلا .
وفي الدالة الرئيسية وفي بداية برنامجك اختبر قيمة المتغير aa فإذا كان بواحد سيذهب لمكان معين تريده سواءا كان دالة أو goto كما تريد .. أرجو أن تكون فهمتني ....
---------------------------------------------------------
وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 15-02-2009 الساعة 09:53 PM
إضافة رد

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

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

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


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

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