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

   

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:
قديم 12-02-2009, 07:13 AM المشاركة 9   
افتراضي



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

1- بالنسبة لاستخدام ال PORTC OR PORTB انا اعتبر اننى اتعامل مع ريجيستر عادى فما المشكلة فى ذلك.انا لست متاكدا ان هذا صحيح لكنه يعمل معى بشكل سليم فهل توجد اخطاء ما انا اجهلها بشان استخدام ال PORT ارجوا توضيحك.

2- بالنسبة للعداد ارجوا افادتى اذا كان لديك طريقة افضل من استخدام هذا العدد من جملة IF مع العلم انك لا تعلم باى رقم فى الأحاد ستبدأ هل هو 9او 8 او 7 ..........
ومن هذا الرقم ستبدا فى العد التنازلى.اذا كان لديك طريقة افضل اوفكرة افضل بشان العداد ارجوا ان تعرضها

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

ولكن فى النهاية احب ان اشكرك على مجهودك الوفير واهتمامك وتعبك هذا.
ومنتظر تعليقك.........

اعلانات

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


أخي الكريم ///

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

===============================
وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع

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

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

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:
قديم 15-02-2009, 05:44 AM المشاركة 11   
افتراضي


بسم الله الرحمن الرحيم
بالنسبة لتأخرك فى الرد المهم انك تكون بخير
انا كنت منتظر ردك علشان ابعت الجزء الأول فى الكود.
وده كود العد التنازلى :
هو المفروض انه هيبد من رقم غير معروف (من 1 : 99) ثم يبدأ فى العد التنازلى الى الصفر(سبب كثرة جمل if)
ولكن فى هذا الكود انا سأبدأ بالعد من الرقم 15 الى الصفر
ويمكنك تغييره كما تشاء عن طريق الأمرين
portb=0x60;
portc=0xb6;
المصفوفة Bهى مصفوفة عرض الأرقام على السفنجمنت من 0 الى 9
كود:
unsigned char B[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsigned char ones , tens;
  unsigned char i;
void main()
{  //portc is الأحاد
trisb=0;
trisc=0;
start:
portb=0x60;
portc=0xb6;


   continu:
  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 ){
   goto start;   }
  else
     {
        for(i=0;i<=9;i++)
         {
           if(portb==B[i])
            { porta.f6=1; portb=B[i-1];
           portc=0xf6;
           goto continu;
           }
         }
     }
اتمنى ان يكون فى هذا الكود الأخطاء التى قد أكون وقعت بها لتخبرنى بها وأتجنبها لاحقا.. ولكن ...
من ناحية تنفيذ البرنامج البرنامج يعمل كما أريد ببرنامج المحاكاة pic simulator (لا تنسى الغاء الديلاى فى حالة تجربة البرنامج)
اما برنامج proteus لا أعلم لماذا لا يعمل
فهو يكتفى بعرض الرقمين الإبتدائيين فقط 1 و 5
واليك ملف هذا الجزء من البرنامج وموجود به ملف المحاكاة بال proteus أيضا
[
URL="http://up1.m5zn.com/download-2009-2-14-11-v3iecjo3k.rar"][/URL]



الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 15-02-2009, 12:09 PM المشاركة 12   
افتراضي


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

=========================================
ملاحظاتي على الكود الذي كتبته

1- استخدام عدد كبير من جملة if وليس هناك حاجة لذلك
2من الأفضل أن لا تفعل ذلك بشكل مباشر (تختبر قيمة البورت ) ولكن ضع القيمة الموجودة في البورت في متغير معين
ثم اختبر قيمة هذا المتغير . ومن ثم نفذ الأوامر التي تريدها على البورت بجعل
هناك علاقة ما بين البورت وبين المتغير .

==========================================
أخي الكريم انتهيت والحمد لله من كتابة هذا الجزء من الكود أرجو أن تعجبك فكرته وأن تستفيد منه .

هو المفروض انه هيبد من رقم غير معروف (من 1 : 99) ثم يبدأ فى العد التنازلى الى الصفر(سبب كثرة جمل if)
ولكن فى هذا الكود انا سأبدأ بالعد من الرقم 15 الى الصفر
جعلت البرنامج يؤدي هذه الوظيفة التي تذكرها أنت . ولكن دون استخدام هذا العدد من جملة if
ولكن هنا في هذا البرنامج لتغيير القيمة التي سيبدأ البك العد منها ستغير القيمة الموجودة في الآحاد والعشرات
أي ستغير قيمة كل من المتغيرين الخاصين بالآحاد والعشرات وهما ones و tens

كود:
tens=1; ones=5;
وإليك الكود الذي كتبته

كود:
unsigned char B[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; unsigned char ones,tens; void show(){portb=B[tens]; portc=B[ones]; delay_ms(1000);} void main() { start: trisb=0;trisc=0; tens=1; ones=5; m: show(); //show ones and tens on seven segments if(ones==0&&tens==0){goto start;} //if two seven_segment=0 goto starting of program if(ones==0){tens--;ones=9;show();} //if ones =0 make ones=9 and subtract one from tens ones--; //count down goto m; }
==========================================

وإليك شرح الطريقة التي كتبت بها الكود ::-

أولا : سيقوم البرنامج بتوظيف الدخل والخرج عن طريق trisb,trisc

==========================================

ثانيا: بوضع قمية ابتدائية للآحاد والعشرات والتي سيبدأ البك العد التنازلي من هذه القيمة ( وتم وضع هذه القيم في متغيرين هما ones للآحاد و tens للعشرات )

==========================================

ثالثا:سيقوم البرنامج باستدعاء دالة اسمها show وظيفة هذه الدالة هي عرض القيمة الخاصة بالآحاد والعشرات على السفن سيجمنت .

==========================================

رابعا: يقوم البرنامج بالعد التنازلي حيث ينقص من قيمة الآحاد (في كل مرة ينقص واحد) عن طريق الأمر
كود:
ones--;
==========================================

خامسا : ليقوم البرنامج بالعد التنازلي بشكل سليم نستخدم جملة if تختبر هل وصلت قيمة الآحاد إلى صفر .. فإذا حدث ذلك تقوم بتنقيص واحد من العشرات . عن طريق الأمر ;--tens
وذلك عن طريق الأوامر التالية
كود:
if(ones==0){tens--;ones=9;show();}
==========================================

سادسا : ميزة إضافية في برنامج العداد وهي بدء العد من جديد إذا كانت قيمة الآحاد والعشرات كلاهما بصفر. وذلك عن طريق الأوامر التالية
كود:
if(ones==0&&tens==0){goto start;}
==========================================

وإذا واجهتك صعوبة في فهم أي جزء من الكود أخبرني وأنا تحت أمرك ..

==========================================

وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع
والسلام عليكم ورحمة الله وبركاته


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 16-02-2009 الساعة 01:50 AM

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 16-02-2009, 01:37 AM المشاركة 13   
افتراضي


(أرجو السماح)
أخي الكريم // أتأسف إليك فقد كتبت معلومة خاطئة بخصوص اختبار البورت بي أو سي وقولت أننا نستطيع أن ننفذ عملية الاختبار تلك شرط أن يكون البورت دخل لتستطيع استخدام معه جملة If لتختبر القيمة الموجودة فيه .... هذه المعلومة خاطئة (والتصحيح: يمكنك اختبار القيمة مباشرة سواءا كان البورت دخل أو خرج) .. لذلك عدلت المشاركة السابقة

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


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 16-02-2009 الساعة 02:16 AM

m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:
قديم 16-02-2009, 02:10 AM المشاركة 14   
افتراضي


testing.....................


m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:
قديم 16-02-2009, 07:53 AM المشاركة 15   
افتراضي


بسم الله الرحمن الرحيم
شكرا يا أستاذ أحمد على هذا المجهود العظيم .
كود أفضل:
سهل - بسيط - بدون استخدام loop (لأنه يرهق ال cpu)و بعدد قليل من جمل if

وكمان اشتغل كويس على برنامج proteus

شكرااااا جزيلا وجارى تحضير الجزء القادم


m_mansour2005
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
المشاركات: 80
نشاط [ m_mansour2005 ]
قوة السمعة:
قديم 16-02-2009, 10:01 AM المشاركة 16   
افتراضي


بسم الله الرحمن الرحيم
أولا أحب اشكر الأستاّ أحمد على مجهوداته الرائعة.

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

بعض الملاحظات:
-هذا الكود للجزأين الأول والثانى(قمت بربطهما) .
-الكود يعمل بكفاءة جيدة وأقوم بعرضه ليس لخطأ.ولكن من أجل الوصول لصيغة جيدة فى كتابة الكود كما فى الجزأالسابق.
-هناك جزأ داخل الإنتربت لم أكمله وتركته للجزأالتالى نتيجة لبعض المشكلات
كود:
unsigned char B[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsigned char ones,tens;
void show()
{
  portb=B[tens];
  portc=B[ones];
  delay_ms(1000);
}
void interrupt()
{
 while(portb.f0){}         //   debounce
begin:
 if(porta.f0)
 {     porta.f2=1;
      if(ones!=9) {porta.f3=1; ones++;}

       else
       {
          if (tens==9) {tens=0xff;}
            ones=0; tens++;
       }
       show();
 }
 else if (porta.f1)
 {
       if(ones!=0) {ones--;}
       else
       {
       if(tens==0){tens=10;}
        ones=9; tens--;
       }
        show();
 }
 else if (portb.f0)
 {

 }
 else {goto begin;}
}
void main()
{
intcon.f7=1; intcon.INTE=1;  //rb0 interrupt
adcon1=0x06;  trisa=0x03;    // porta 0,1 as switches
trisb=0x01; trisc=0;
start:
 tens=1;
 ones=5;
 test:
    show();
 if(tens==0 && ones==0) {goto start;}
 if(ones==0) {tens--;  ones=9 ;goto test;}
 ones--;
 goto test;
}



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