وجدت فى هذا الرابط الموضوع بالتفصيل لكنه معقد بعض الشيئ .
جزاك الله كل الخير ولصاحب الموضوع.
|
السلام عليكم
أخي العزيز البرتوكول NEC يعمل كتالي
نبضه بدء 9ms ثم فاصل 4,5ms
ثم يرسل العنوان ثم معكوس العنوان ثم بيانات ثم معكوس البيانات
عند ارسال مثلا العنوان فأنه يتم ارسال بت بت وبتالي يوجد زمن بين ارسال واخر هو 560us
في حاله البت =1 فان زمن = 1680us وفي حاله بت=0 فأن زمن = 560us
هذا هو كود البرتوكول
كود:
/*******************************************************************************
* Function IR_Send(char IR_Address, char IR_COmmand)
* ------------------------------------------------------------------------------
* Overview: Functions sends address and command via IR NEC protocol
* Input: Address - address of the device
* Command - command for device
* Output: Nothing
*******************************************************************************/
void IR_Send(char IR_Address, char IR_COmmand)
{
char ir_byte[4];
char bitnum;
char bytenum;
ir_byte[3] = ~IR_COmmand;
ir_byte[2] = IR_COmmand;
ir_byte[1] = ~IR_Address;
ir_byte[0] = IR_Address;
// Delay_ms(100); // precaution to be certain of some dead time before message start
PWM1_Start(); // mark
led=1;
Delay_ms(9); // 9mS mark start bit
PWM1_Stop(); // space
led=0;
Delay_us(4500); // 4.5mS space ends start bit
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'
}
}
}
PWM1_Start(); // mark
Delay_us(560); // stop bit of '1'
PWM1_Stop(); // space
Delay_us(1680); // stop bit of 1
Delay_ms(200); // precaution to be certain of some dead time after message ends
}
طبعا زمن Delay_ms(200); في اخر الكود هي خاصه لضغطه سويج يعني لايوجد داعي ان نضع هذا زمن مع كل سويج لهذا سبب وضعتها في كود البرتوكول