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

   

almoflehy
:: مهندس جيد ::
تاريخ التسجيل: Apr 2007
الدولة: YEMEN
المشاركات: 252
نشاط [ almoflehy ]
قوة السمعة:
قديم 01-11-2010, 02:22 AM المشاركة 9   
افتراضي



السلام عليكم
بعد جهد جهيد وعدة محاولات تم حل المشكلة بعون الله
وكان الحل بحذف الامرين
كود:
UART1_Write(13);
    UART1_Write(10);
من المرسل.
والامر
كود:
for(n=4;n>=0;n--)
من المستقبل.

وصار البرنامج هكذا:
المرسل:
كود:
unsigned x=0;
unsigned y;
unsigned k;
int n;
void main()
{ TRISD=0xff;
  UART1_Init(9600);delay_ms(100);
  while(1)
  {
  if(PORTD.F1==0)
    { while(PORTD.F1==0){}
      x=x+9;
    }
  if(PORTD.F0==0)
   { while(PORTD.F0==0){}
    k=x;
    for(n=4;n>=0;n--)
    { y=k/pow(10,n);
      UART1_Write(48+y);
      k=k-(y*pow(10,n));
      if(n==0)break;
    }
   }
  }
}
والمستقبل:
كود:
void main() {
      unsigned x=0;
      unsigned w=0;
      int y;
      int n=5;
      char k;
      TRISC.f0=1;
      UART1_Init(9600);delay_ms(100);
      while(1)
      {
       if(UART1_Data_Ready()==1)
        { if(n==5){x=0;}
          n--;
          k=UART1_Read();
          UART1_Write(k);
          x=x+((k-48)*pow(10,n));
          if(n==0)n=5;
        }
         if(PORTC.f0==0)
           { while(PORTC.f0==0){}
               w=x;
               UART1_Write(13);
               UART1_Write(10);
              for(n=4;n>=0;n--)
               { y=w/pow(10,n);
                 UART1_Write(48+y);
                 w=w-(y*pow(10,n));
                 if(n==0){n=5; break;}
               }
           }
      }
}
ولقد اضفت مفتاح في المستقبل يعرض قيمة X التي هي القيمة الفعلية التي ارسلت (الرقم كامل اي بعد تجميع الارقام التي ارسلت...احاد ..وعشرات..ومئات........) لكي اتأكد ان عملية التجميع كانت صحيحة ام لا ، حيث انني استخدمت الامر
كود:
x=x+((k-48)*pow(10,n));
للتجميع.
ولكن فوجئت ان الناتج كان صحيحا فقط اذا كان العدد المرسل مكون من خانة الاحاد فقط(مثلا 00002 او 00007 او.....) وكان ناقصا بواحد اذا ارسل رقم به عدد واحد في خانة العشرات او المئات او...(اي اذا ارسل 00014 كان الناتج 00013 واذا ارسل 00208 كان الناتج 00207)، وكان ناقصا باثنين اذا ارسل رقم به عددان واحد في العشرات وواحد في المئات(اي اذا ارسل 00114 كان الناتج 00112 واذا ارسل 00288 كان الناتج 00286)
لم استطع ان اجد تفسير لهذه الحاله الغريبة رغم انني اعتقد ان الامر
كود:
x=x+((k-48)*pow(10,n));
صحيح 100%
لذلك قمت بتعديل كود المستقبل باستخدام الاوامر
كود:
if(n==4){x=x+((k-48)*10000);}
          if(n==3){x=x+((k-48)*1000);}
          if(n==2){x=x+((k-48)*100);}
          if(n==1){x=x+((k-48)*10);}
          if(n==0)x=x+((k-48)*1);
بدلا من الامر السابق
وصار كود المستقبل هكذا:
كود:
void main() {
      unsigned x=0;
      unsigned w=0;
      int y;
      int n=5;
      char k;
      TRISC.f0=1;
      UART1_Init(9600);delay_ms(100);
      while(1)
      {
       if(UART1_Data_Ready()==1)
        { if(n==5){x=0;}
          n--;
          k=UART1_Read();
          UART1_Write(k);
          if(n==4){x=x+((k-48)*10000);}
          if(n==3){x=x+((k-48)*1000);}
          if(n==2){x=x+((k-48)*100);}
          if(n==1){x=x+((k-48)*10);}
          if(n==0){x=x+((k-48)*1); n=5;}
        }
         if(PORTC.f0==0)
           { while(PORTC.f0==0){}
               w=x;
               UART1_Write(13);
               UART1_Write(10);
              for(n=4;n>=0;n--)
               { y=w/pow(10,n);
                 UART1_Write(48+y);
                 w=w-(y*pow(10,n));
                 if(n==0){n=5; break;}
               }
           }
      }
}
وقد عمل البرنامج بشكل صحيح وبدون مشاكل.
اذا كان هناك احد يفسر لنا ما صار لي او يرى ان هناك مشكلة قد عملتها وان لا ادري ان يوضحها لنا لتعم الفائدة
او ان احد لديه طريقة اخرى لارسال رقم من بيك الى اخر كما بهذا البرنامج ان يتكرم بوضعها لكي يستفيد الكل وكل من يتطلع الى تعلم البرمجة وزيادة مهارته فيها.
ودمتم في رعاية الله وحفظه.
اخوكم المفلحي.

اعلانات

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,484
نشاط [ wleed antar ]
قوة السمعة:
قديم 01-11-2010, 01:36 PM المشاركة 10   
افتراضي


السلام عليكم ورحمة الله وبركاته
اساتذتي واخواني في القرية
اريد ان ارسل رقم وليكن مثلا 200 او 350 او..... الرقم متغير يعني قيمته تتغير بشروط محددة
المهم اني اريد ان ارسله من بيك الى بيك اخر واريد كيفية ارساله
هل استخدم Serial Communication RS232 او ان هناك طريقة افضل
من وجد عنده الحل ارجو ان يتكرم بوضع برنامج توضيحي لكي تعم الفائدة للجميع ويا حبذا لو كان في لغة الميكروسي وله جزيل الشكر والتقدير.

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

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


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