الان ناتي الى المرحله الاخيره وهي القراءه كل البيانات وهي ادريس وكومند 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 ولكن من اين احصل على هذا البت
عداد البتات
هذا هو كود الذي حصل منه على 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