أخي الكريم 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 كما تريد .. أرجو أن تكون فهمتني ....
---------------------------------------------------------
وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع