/*  タイマーWのインプットキャプチャで モーター回転数カウト(周波数カウター オーバーフローで0.025s間隔を作り それをCNTTM回のカウント その間の入力パルス数をインプットキャプチャ機能でカウントする インプットキャプチャは立ち上がりをカウント 入力ピンは インプットキャプチャD(P84) 測定時間間隔ごとに PCへrpmを送信 */ #include<3664.h> #include "myfunc.h" #define TMW_S0025 15535 // オーバーフローで0.025s間隔のタイマW初期値 #define CNTTM 40 //(0.025s)×CNTTM → 1秒間 ループ値<4の倍数=0.1s単位にする> short cnt,twcnt; unsigned char txb[10], rxb[10] ; unsigned char tx_data[10]; //通信用 void PC_send(short data){ tx_data[0]=data/10000 + 0x30; data%=10000; tx_data[1]=data/1000 + 0x30; data%=1000; tx_data[2]=data/100 + 0x30; data%=100; tx_data[3]=data/10 + 0x30; data%=10; tx_data[4]=data + 0x30; // tx_data[5]='u'; // tx_data[6]='S'; tx_data[5]='\r'; tx_data[6]='\n'; tx_data[7]='\0'; SCI3_OUT_STRING (tx_data); //文字列送信 } void int_timerw (void){ //オーバーフロー割り込みの場合 0.025s毎 if(TW.TSRW.BIT.OVF == 1){ TW.TCNT = TMW_S0025; if(twcnt ==CNTTM){ PC_send(cnt*(2400/CNTTM)); //1分間(RMP)換算カウント値PC表示 cnt=0; //カウント初期化 twcnt=0; }else{ twcnt++; TW.TSRW.BIT.OVF =0;// 検知フラグを戻して再開 } } //インプットキャプチャD割り込みの場合 if(TW.TSRW.BIT.IMFD == 1){ cnt++; TW.TSRW.BIT.IMFD = 0; // 検知フラグを戻して再開 } } int main(void){ DI; //TmrW設定 TW.TCRW.BYTE=0x30; // カウンタクリアなし、内部クロックの1/8( 2MHz ) FTIOBの初期値は0 TW.TIERW.BYTE=0x88; //1000 1000 オーバーフロー割り込み & インプットキャプチャ割り込みD TW.TIOR1.BYTE=0x40; //0100 0000 D:インプットキャプチャ、立ち上がりエッジ TW.TCNT=15535; // TCNの初期化 TW.TMRW.BIT.CTS=1; // TCNTカウンタスタート cnt=0; //カウント初期化 twcnt=0; LCD_init( 16 ); //LCD初期化 EI; //通信用初期化 SCI3_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb)); EI; SCI3_OUT_STRING ("\n数値転送\n"); //送信前表示 while (1); }