/*赤外線リモコン解析装置 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で送信
        
    }
}