さて、実際の1mS取り込みルーチンはこんな感じ…
void CALLBACK timerProc(UINT uTimerID, UINT uMsg,
DWORD dwUser, DWORD dummy1, DWORD dummy2){
//データ読込
nRet = DioInputDword(hDeviceHandle,
FBIDIO_IN1_32,&nBufw64[0]);//CH1-32を取り込む
nRet = DioInputDword(hDeviceHandle,
FBIDIO_IN33_64,&nBufw64[1]);//CH33-64を取り込む
…他の処理…
return;
}
このプログラムを入れる場所はMainView.cpp内の定義後すぐの位置、つまりグローバル変数エリアで登録します。
そして起動は
// タイマー割込の開始!!
MMRESULT timerID = timeSetEvent(1, // 間隔[ms]
0, // 分解能 0なら1mS
timerProc, // 割り込み関数
(DWORD)&count, // ユーザーパラメータ
TIME_PERIODIC | TIME_CALLBACK_FUNCTION // 動作フラグ
);//タイマスタートOn!
で開始されます。
この開始コマンド記載場所もグローバルMainView.cpp内の最初の方です。
コンパイル時にちょっと厄介なのは、デバイスドライバの認識です。
割込みルーチンの記述にはI/Oボードのアクセスがあります。
標準的なエクスプローラで作成されるスタンダードな関数内に括ってしまうとデバイスがオープン(初期化)されていないというエラーを出します。
プログラムコーティングシーケンスの順序についてもこのような考慮ポイントが存在しています。
void CALLBACK timerProc(UINT uTimerID, UINT uMsg,
DWORD dwUser, DWORD dummy1, DWORD dummy2){
//データ読込
nRet = DioInputDword(hDeviceHandle,
FBIDIO_IN1_32,&nBufw64[0]);//CH1-32を取り込む
nRet = DioInputDword(hDeviceHandle,
FBIDIO_IN33_64,&nBufw64[1]);//CH33-64を取り込む
…他の処理…
return;
}
このプログラムを入れる場所はMainView.cpp内の定義後すぐの位置、つまりグローバル変数エリアで登録します。
そして起動は
// タイマー割込の開始!!
MMRESULT timerID = timeSetEvent(1, // 間隔[ms]
0, // 分解能 0なら1mS
timerProc, // 割り込み関数
(DWORD)&count, // ユーザーパラメータ
TIME_PERIODIC | TIME_CALLBACK_FUNCTION // 動作フラグ
);//タイマスタートOn!
で開始されます。
この開始コマンド記載場所もグローバルMainView.cpp内の最初の方です。
コンパイル時にちょっと厄介なのは、デバイスドライバの認識です。
割込みルーチンの記述にはI/Oボードのアクセスがあります。
標準的なエクスプローラで作成されるスタンダードな関数内に括ってしまうとデバイスがオープン(初期化)されていないというエラーを出します。
プログラムコーティングシーケンスの順序についてもこのような考慮ポイントが存在しています。
PR