--- pic16f886-ir-transmitter.c +++ wakeup-code_pic16f886-ir-transmitter.c @@ -99,6 +99,7 @@ #define OUTSTATUS_END 0x04 /* 出力状態 終了 */ #define OUTSTATUS_2ND_READER_CODE 0x08 /* 出力状態 2ndリーダコード */ #define OUTSTATUS_2ND_DATA_CODE 0x10 /* 出力状態 2ndデータコード */ +#define OUTSTATUS_PRE_DATA_CODE 0x12 /* 出力状態 リーダコード出力とデータ出力の中間(この前のステータスでウェークアップコードを出力した場合は、ここでリーダコードを出力する */ #define OUTBUFFER_READER_SIZE 1 /* 出力バッファサイズ リーダコード(1byte) */ #define OUTBUFFER_DATA_SIZE 6 /* 出力バッファサイズ データ(6byte) */ #define OUTBUFFER_SIZE OUTBUFFER_READER_SIZE+OUTBUFFER_DATA_SIZE /* 出力バッファサイズ リーダコード(1byte) + データ(6byte) */ @@ -378,6 +379,7 @@ unsigned char uc_receive_pos = 0; unsigned char cUART_char; +unsigned char uc_wu_flg = 0; /**************************** INITIALIZE ROUTINE ******************************/ @@ -694,6 +696,22 @@ /* 出力状態でない */ if( 0 >= ui_out_on_time && 0 >= ui_out_off_time ) { + + if( uc_out_status == OUTSTATUS_PRE_DATA_CODE ) + { + uc_out_status = OUTSTATUS_DATA_CODE; + if(uc_wu_flg) // ウェークアップコードを出力した場合 + { + CCPR1L = 0; // PWMオフ + T1CONbits.TMR1ON = 0; // TMR1オフ + __delay_ms(50); // ウェークアップコードOFF時間50msを確保する + ui_out_on_time = READERCODE_ON_KADEN; // この後リーダーコードを出力する + ui_out_off_time = READERCODE_OFF_KADEN; + T1CONbits.TMR1ON = 1; // TMR1オン + return ret_code; + } + } + /* 出力待ち */ if( uc_out_status == OUTSTATUS_OUTPUT_WAIT ) { @@ -708,7 +726,8 @@ if( format_type != FORMATCODE_UNKNOWN ) { /* 次の状態へ */ - uc_out_status = OUTSTATUS_DATA_CODE; +// uc_out_status = OUTSTATUS_DATA_CODE; + uc_out_status = OUTSTATUS_PRE_DATA_CODE; /* データサイズ設定(bit) */ ui_send_bit_size = uc_out_buff[1]; uc_send_bit_size_2nd_data = uc_out_buff[2]; @@ -748,6 +767,14 @@ uc_out_data0_off = DATA0_OFF_KADEN; uc_out_data1_on = DATA1_ON_KADEN; uc_out_data1_off = DATA1_OFF_KADEN; + + if((format_type == FORMATCODE_HITACH_AC) && (ui_send_bit_size > 8)) + { + uc_wu_flg = 1; + ui_out_on_time = 255; // ウェークアップコードON時間30ms + ui_out_off_time = 0; + } + } /* TMYフォーマット(家電協フォーマット亜種) */ else if( format_type == FORMATCODE_TMY )