/**************************************************************** * SMT Hight-Low mode で、赤外線リモコンのパルス幅をus単位で * 測定し、EUSARTからUSB変換器経由でPCに送信する ****************************************************************/ #include "mcc_generated_files/mcc.h" #define maxdata 75 // 赤外線データー配列数 uint16_t PW[maxdata]; // Mark配列 int16_t PR[maxdata]; // Space配列 uint8_t p_PW; // Mark配列ポインタ uint8_t p_PR; // Space配列ポインタ void main(void) { uint8_t ird; // 赤外線データ uint8_t sbt; // ビットセット用シフトバイト uint8_t bct; // 有効ビットデータカウンタ SYSTEM_Initialize(); // デバイス初期化 INTERRUPT_GlobalInterruptEnable(); INTERRUPT_PeripheralInterruptEnable(); while (1) // 赤外線信号受信 繰り返し { p_PW = 0; // データポインタ初期化 p_PR = 0; SMT1PWAIF = 0; // フラグクリア SMT1PRAIF = 0; SMT1IF = 0; SMT1CON1bits.SMT1GO = 1; // 測定開始 printf("\r\nready\r\n"); // 準備完了メッセージ送信 // ---------- 赤外線信号を受信する -------- while((p_PR < maxdata)){ // バッファ満杯まで繰返 if(SMT1PWAIF){ // mark終了なら SMT1PWAIF = 0; // フラグクリア PW[p_PW++]=SMT1CPW; // High時間を保存 } if(SMT1PRAIF){ // space終了なら SMT1PRAIF = 0; // フラグクリア if(SMT1CPR < 10000){ // 10ms未満なら PR[p_PR++]=SMT1CPR; // そのままLow時間を保存 }else{ // 10ms以上なら PR[p_PR++]=-(SMT1CPR / 1000); // msに変換し負数で保存 } } if(SMT1IF){ // 無信号が100ms続いたら SMT1IF = 0; // フラグクリア PR[p_PR++]=0; // 無信号記号「0」を保存 break; } } //------------ 受信結果を送信する ------- SMT1CON1bits.SMT1GO = 0; // 測定終了 printf(" - mark space (us)\r\n"); // タイトル送信 ird = 0; sbt = 1; bct = 0; for(char i=0;i 0){ // 10ms未満なら printf(" %5d",PR[i]); // us単位で送信(改行を外す) if(PW[i] < 900){ // markが900未満なら if(PR[i]<2000){ // spaceが2000未満なら if(PR[i]>900){ // さらにspaceが900以上なら ird |= sbt; // シフトバイトを加える printf(" 1"); }else printf(" 0"); sbt <<= 1; // シフトバイトを左へシフト bct++; // 有効データ数を1増やす if((bct % 8) == 0){ // データ数が8の倍数なら printf(" >> %02XH",ird); // 16進数で送信(表示) ird = 0; // 赤外データをクリア sbt = 1; // シフトバイトも初期化 } } } printf("\r\n"); }else{ // 10ms超なら printf("%7d (ms)\r\n",-PR[i]); // ms単位で送信 } } if(p_PW >= maxdata){ // バッファ満杯なら printf("-- Buffer Full --\r\n"); // Buffer Full 送信 } } } /** End of File **/