前提・実現したいこと
マイコンであるdspicを利用し、UARTを用いて
①外部から'1'が受信されたら割り込み処理関数内のOnePoint()という関数が50msごとにループで動作し続ける
②'1'以外が受信されたらループが終了し、再度'1'が受信されるまで待機する
というプログラムを作成したい。
発生している問題・エラーメッセージ
プログラムは動作するのですが、スタートコマンドである'1'を外部から取得し、割り込み処理関数内のOnePoint();が動作すると取得波形に影響が及んでしまいます。
計測画面
割り込みのタイミングが問題なのではと推測しておりますが、対処法が分かりません。
一方、外部のプログラムを用いて50ms毎に'1'を連続的に送り続け、送られてくるタイミングごとにOnePoint();を動作させた際には波形に影響が出ませんでした。
しかし、外部から50ms毎に'1'を連続的に送り続けるシステムは時間精度が低いため、マイコン内部でOnePoint();を動かしたいです。
該当のソースコード(割り込み関数内でOnePoint();動作)
/***1point 関数***/ void OnePoint(void) { Red=0; WriteUART1((unsigned int)(0x02)); while(BusyUART1()); for(h=1; h<=2; h++) { WriteUART1((unsigned int)(0x41+((Vmin[h]>>12) & 0x000F))); while(BusyUART1()); WriteUART1((unsigned int)(0x41+((Vmin[h]>>8) & 0x000F))); while(BusyUART1()); WriteUART1((unsigned int)(0x41+((Vmin[h]>>4) & 0x000F))); while(BusyUART1()); WriteUART1((unsigned int)(0x41+((fmin[h]>>8) & 0x000F))); while(BusyUART1()); WriteUART1((unsigned int)(0x41+((fmin[h]>>4) & 0x000F))); while(BusyUART1()); WriteUART1((unsigned int)(0x41+((fmin[h]>>0) & 0x000F))); while(BusyUART1()); } WriteUART1((unsigned int)(0x03)); while(BusyUART1()); CRLF(); Red=1; } /*** タイマ1 割り込み処理関数 ***/ void __attribute__((__interrupt__, __shadow__))_T1Interrupt(void) { IFS0bits.T1IF=0;//割込みフラグクリア if(cmnd =='1') {OnePoint();}//1point送信 } /*** メイン関数 ***/ void main(void) { //初期設定省略 ///OnePoint();動作(0.05秒間隔) OpenTimer1(T1_ON & T1_GATE_OFF & T1_PS_1_256 & T1_SOURCE_INT , 5769);//50ms毎 ConfigIntTimer1(T1_INT_PRIOR_3 & T1_INT_ON); while(1) { while(!DataRdyUART1()); cmnd = ReadUART1(); } }
該当のソースコード('1'が取得されるごとにOnePoint();動作)
/*** メイン関数 ***/ void main(void) { //初期設定省略 while(1) { while(!DataRdyUART1()); cmnd = ReadUART1(); ///受信コマンドの処理 switch(cmnd) { case'1': ///1point measure OnePoint(); break; case'2': break; default : break; } } }
補足情報(FW/ツールのバージョンなど)
dsPIC
MPLAB
c言語
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。