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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 29-11-2013, 06:00 AM المشاركة 17   
افتراضي



على فكره هذا الشرح يخص البروتوكول NEC
ويمكن الاستفاده من كود الاستقبال اذا تم فهمه بشكل الصحيح

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 29-11-2013, 06:20 AM المشاركة 18   
افتراضي


السلام عليكم
نكمل الشرح الكود الاستقبال
وصلنا الى IR_State = 3 معناها نذهب الى case 3

للعلم الفكره هي نقرا نبضه نبضه ونقيس زمنها فأذا كان زمن صحيح نذهب الى مرحله اخرى وهكذا حتى نصل الى النهايه

الكود case 3
طبعا هنا ارسلنا نبضه 562us من ريموت الارسال والان نتوقع ان خرج عدسه الاستقبال هو 0 لهذا نحسب زمن هذه النبضه
كود:
if (ir_in == 0)              // we wait for 562us mark signal
                     IR_Timer_Count ++;        // increment timer counter
ولما يتوقف الارسال من ريموت يصبح خرج عدسه الاستقبال =1
اي
كود:
 if (ir_in == 1)
هنا لابد من أختبار زمن
كود:
if ((IR_Timer_Count > 3) && (IR_Timer_Count < 7))// 300us  and 700us
اذا كان زمن بين 300 و 700 اذن نبضه الاستلام صحيحه ولنذهب الى
كود:
 IR_State = 4;
وبالطبع لابد من تصفير عداد الوقت
كود:
IR_Timer_Count = 0;
ماذا يعني هذا الكود
كود:
if (IR_Received_Flag == 0xFF)
                                                {
                                                 IR_Received_Flag = 1;
                                                 IR_State = 0;       // we have received 4 bytes successfully!
                                                }
الاجابه ان نبضه 562us مشتركه في كل بت من غير معقول اني اضع لكل بت كود لهذا سيكون هذا الكود نرجع له كلما نريد فحص نبضه 562us ولهذا اذا استقبلنا البيانات بشكل نهائي سوف نعود الى هذا الكود وراح نختبر هل
IR_Received_Flag == 0xFF اذا صحيح خلي علم الاستقبال=1 وهنا راح ينفذ الاوامر الموجوده في القائمه الرئيسيه ليفحص الشفره وينفذ الاوامر على حسب ذلك




وطبعا بالتاكيد اذا لم يكن الزمن ضمن حيز مطلوب فسوف يتم توقيف العمليه وتصفير عداد الزمن والرجوع من البدايه
كود:
else{
                                         IR_State = 0;          // reset IR state because we did not got required 9ms mark
                                         IR_Timer_Count = 0;    // reset timer counter
                                         }
تلاحظون وجود أمر مهم بدونه لن تنجح العمليه وهو الامر break مافائده هذا الامر اذا كنت فهمت شرح بشكل صحيح ستعرف الجواب وسأترك لكم الجواب بذلك

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 29-11-2013, 07:17 AM المشاركة 19   
افتراضي


الان ناتي الى المرحله الاخيره وهي القراءه كل البيانات وهي ادريس وكومند command

طبعا قلنا اذا استلمنا نبضه 562us اذن ننقل الى case 4
كود:
if (ir_in == 1)              // we wait for space signal
                     IR_Timer_Count ++;        // increment timer counter
طبعا ريموت الارسال يرسل النبضه 562 وبعدها يتوقف وعندها خرج عدسه الاستقبال=1
وهنا يتم حساب زمن
ملاحظه طريقه هذا جزء من الكود الارسال الذي يخص الارسال بعد 562us
كود:
for(bytenum = 0; bytenum < 4; bytenum++)        // 4 bytes to send
           {
             for(bitnum = 0; bitnum < 8; bitnum++)    // 8 bits LSB first
                  {
                   PWM1_Start();                           // mark
                   led=1;
                   Delay_us(560);                          // 560uS mark for '0' or '1'
                   PWM1_Stop();                            // space
                   led=0;
                   if(ir_byte[bytenum] & (1 << bitnum))     // test bit <bitnum>
                       {
                         Delay_us(1680);                     // 1.68mS space for a '1'
                       }
                  else{
                       Delay_us(560);                      // 560uS space for a '0'
                     }
                  }
           }
واضح جدا مايقوم به مرسل لاحظ كود بلون احمر

للعلم وحسب كود المرسل انه بعد الارسال نبضه 560us ثم يتوقف لفتره 560us اذا كان بت=0 ويتوقف 1680us اذا كان بت=1
وبعدها يعيد ارسال نبضه من جديد لبت الاخر بنفس الاسلوب
ولهذا لما يصبح خرج عدسه=0 معناه انه ارسل نبضه ايضا علينا خزن بت الذي تم قراءته وهنا لابد ان تقرا بت اما 0 او 1
ولكن كيف يتم خزن البيانات ؟ هذا هو مهم

المرسل يرسل بت من الاول الى اخر بت وكذلك مستقبل يستقبل من اول بت الى اخر يعني مرسل يرسل بت ومستقبل يستقبله في ان واحد لاحظو بدقه كيف نحصل على 1 وعلى 0
هنا نختبر زمن لما مرسل متوقف
كود:
if (ir_in == 0)   if ((IR_Timer_Count > 3) && (IR_Timer_Count < 19))// between 300us  and 1900us
تلاحظون زمن نبضه بين 300us وبين 1900us لماذا ياريت ترجع الى الكود مرسل والموجود بلون احمر ستجد الجواب
فاذا تحقق الشرط سوف ينفذ مجموعه من الاوامر واذا لم يتحقق الشرط خلاص لابد من ايقاف العمليه والعوده من الجديد
كود:
else
                      {
                        IR_State = 0;          // reset IR state because we did not got required signal
                        IR_Timer_Count = 0;    // reset timer counter
                      }
                  break;
وهذه هي الاوامر التي سوف يتم تنفيذها لكل بت
كود:
IR_Received_byte[IR_Byte_Count] = (IR_Received_byte[IR_Byte_Count] >> 1);
                                             IR_Bit_Count ++;       // increment bit counter
                                             if (IR_Timer_Count > 8) IR_Received_byte[IR_Byte_Count] += 0x80;   // we have received "1"

                                             if (IR_Bit_Count == 8)
                                                     {
                                                      IR_Bit_Count = 0;   // reset bit count
                                                      IR_Byte_Count ++;   // increment byte count
                                                     }
                                            if (IR_Byte_Count == 4)  IR_Received_Flag = 0xFF;

                                            IR_State = 3;          // go to next state (wait for 562us mark)
                                            IR_Timer_Count = 0;    // reset timer counter
طبعا هذه الاوامر تم وصول اليها بعدما قرأنا نبضه 9ms و نبضه التوقف 4.5ms وكذلك نبضه الارسال 560us

كود:
IR_Received_byte[IR_Byte_Count] = (IR_Received_byte[IR_Byte_Count] >> 1);
هذا مهمته تزحيف كل بت الى يسار لماذا لاننا ارسلنا اول بت ومستقبل راح يقرا هذا البت وبعدين مرسل ارسل بت اخر واكيد مستقبل راح يستقبله ولكن هذا البت الثاني اذن لابد من تزحيف اول بت الى يسار حتى ياتي بت الثاني في محله وهكذا لبت 3 و4 و5 و6 و7
و8 ولكن من اين احصل على هذا البت
كود:
IR_Bit_Count ++;
عداد البتات

هذا هو كود الذي حصل منه على 1 ببساطه اختبر زمن اذا كان اكبر من 800us بالتاكيد هذا هو بت 1 واقل من ذلك هو 0
كود:
if (IR_Timer_Count > 8) IR_Received_byte[IR_Byte_Count] += 0x80;   // we have received "1"
لماذا جمعنا مع 0x80 لاني هذا بالبيانري=0b10000000 وبتالي راح اعمل له تزحيف الى يسار وبهذه الطريقه بعد تزحيف لكل بت قرأه سوف نحصل على بايت رقم 0

كود:
if (IR_Bit_Count == 8)
                                                     {
                                                      IR_Bit_Count = 0;   // reset bit count
                                                      IR_Byte_Count ++;   // increment byte count
                                                     }
طبعا عدد البتات لكل بايت هو 8 لهذا بعد كل 8 بت يتم زياده بايت بواحد وتصفير عداد البتات وتجري نفس العمليه

وطبعا بعد قراءه كل البايت سوف يتم خزنه في مصفوفه IR_Received_byte


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 14-07-2016, 05:26 AM المشاركة 20   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


الله يكرمك أخى " حسن هادى " مشكور جدااا على الشرح ..

انا بفضل الله ثم فضلك قربت جدااا لفهم كود الإستقبال .. ولكن ينقصنى بعض النقاط ..

كيف أجعل التايمر يقوم بعد عرض النبضه فى حالة الأستقبال .. وهو هنا هيكون IR =0 فولت .. ونختبر .. بأمر شرط .. ولكن المهم هو كيف أقوم بتصفير التايمر ... وأجراء عمليه العد استنادااا لسرعه التايمر وهى هنا = 100US مثلا عرض النبضه المراد قياسها = 600us وهنا التايمر يعد كل 100 us فكيف ااحسب زمن بدايه النبضه والى أن تنتهى .. هنا التايمر هيكون عد 6 مرات .. أى بمعنى استغرق فى عد عرض هذة النبضه 600us ... فكيف أخذ زمن عرض النبضه .. وخزنها فى مصفوفه ..


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

وشكراااا لك اخى على الشرح


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 27-07-2016, 01:00 PM المشاركة 21   
افتراضي


الله يكرمك أخى " حسن هادى " مشكور جدااا على الشرح ..

انا بفضل الله ثم فضلك قربت جدااا لفهم كود الإستقبال .. ولكن ينقصنى بعض النقاط ..

كيف أجعل التايمر يقوم بعد عرض النبضه فى حالة الأستقبال .. وهو هنا هيكون IR =0 فولت .. ونختبر .. بأمر شرط .. ولكن المهم هو كيف أقوم بتصفير التايمر ... وأجراء عمليه العد استنادااا لسرعه التايمر وهى هنا = 100US مثلا عرض النبضه المراد قياسها = 600us وهنا التايمر يعد كل 100 us فكيف ااحسب زمن بدايه النبضه والى أن تنتهى .. هنا التايمر هيكون عد 6 مرات .. أى بمعنى استغرق فى عد عرض هذة النبضه 600us ... فكيف أخذ زمن عرض النبضه .. وخزنها فى مصفوفه ..


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

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

فمكتبه هي تستخرج الكود وفق البرتوكول

حيث يتم أحتساب زمن حسب اشاره رسيرفر IR اي من تتغير حالته من 1 الى 0
حيث نبد باحتساب زمن بشكل تقريبي لحين تحول اشاره IR من 0 الى 1


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 27-07-2016 الساعة 01:03 PM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 28-07-2016, 06:23 AM المشاركة 22   
افتراضي


السلام عليكم
أعتذر أخي فانا جدا مشغول حاليا
عفو ا اخي لم أفهم ماتريده بالضبط

فمكتبه هي تستخرج الكود وفق البرتوكول

حيث يتم أحتساب زمن حسب اشاره رسيرفر IR اي من تتغير حالته من 1 الى 0
حيث نبد باحتساب زمن بشكل تقريبي لحين تحول اشاره IR من 0 الى 1
شكرااا جزيلا على الأهتمام ..

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

مشكور مرة أخرى أخى الكريم ...



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