/*赤外線リモコン解析装置 2014.5.2 7M4MON*/ /*赤外線センサが変化した時の割り込みカウントを送信する*/ // A0 input // A1 LED // A2 TX // A3 RX // A4,A5 CLK #include <12f675.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOMCLR,NOWDT #use delay(CLOCK = 20000000) //20MHz #use rs232(baud=115200,xmit=PIN_A2,rcv=PIN_A3) #define MAX_COUNT 255 //サンプリング周期の設定 //44.1kHz(22.6us)のときは175だった。 // 20MHz -> 143, 10MHz -> 199, 12MHz -> 188, 4MHz -> 233, 2MHz -> 245 #define SAMPLING_CYCLE 189 //48kHzバージョンに変更ついでに //UART送信時の初期値を入れることにする。 //測定したら68uSだった。 #define UART_TX_TIME 5; short status; int counter; /* sampling_timeは最初は配列にしてまとめて送ろうとしたが、 バッファを確保できないので逐次送ることにする */ #INT_RTCC //タイマ0割込みの指定 void rtcc_isr() { //タイマ0割込み処理関数 set_rtcc(SAMPLING_CYCLE); if(input(PIN_A0) == status){ //状態が変わってなかったら counter++; }else{ status = ~status; putc(counter); counter = UART_TX_TIME; //カウンタのリセット } output_toggle(PIN_A1); } void main(){ while(true){ output_high(PIN_A1); //LED counter = 1; status = 0; setup_counters(RTCC_INTERNAL , RTCC_DIV_1); while(input(PIN_A0)){} //入力があるまで待つ //タイマスタート set_rtcc(SAMPLING_CYCLE); enable_interrupts(INT_TIMER0); //タイマ0割込み許可 enable_interrupts(GLOBAL); //グローバル割込み許可 while(counter < MAX_COUNT){} //タイマ割り込みのみで動いている。 //タイマを停止 //setup_counters(RTCC_OFF); disable_interrupts(INT_TIMER0); //タイマ0割込み停止 disable_interrupts(GLOBAL); //グローバル割込み停止 putc(counter); //UARTで送信 } }