第 5 章 アナログ入力 37
5.4 チュートリアル
5.4.3 割り込み処理
5.4.3 割り込み処理
// サンプリングデータの取得
int GetData(int dnum, unsigned long ChCount , unsigned long ulSmplNum) {
int ret;
unsigned long i;
unsigned long GetDatalNum = ulSmplNum;
// サンプリングデータの取得
ret = AdGetSamplingData(dnum, wSmplData, &GetDatalNum);
if (ret) {
printf("AdGetSamplingData error: ret=%Xh¥n", ret);
return -1;
}
// サンプリングデータの表示 for (i = 0; i < ulSmplNum; i++) { printf("%04Xh ", wSmplData[i][0]);
printf("%04Xh ", wSmplData[i][1]);
printf("%04Xh ", wSmplData[i][2]);
printf("%04Xh ", wSmplData[i][3]);
printf("%04Xh ", wSmplData[i][4]);
printf("%04Xh ", wSmplData[i][5]);
printf("%04Xh ", wSmplData[i][6]);
printf("%04Xh ", wSmplData[i][7]);
printf(“%¥n”);
} }
int main(void) {
int ret, dnum;
unsigned long ulSmplNum; // Number of the sampling data acquisition unsigned long i;
// Open a device.
ret = AdOpen(dnum);
if(ret){
printf("Open error: ret=%Xh¥n", ret);
return -1;
}
// コールバック関数の登録
ret = AdSetBoardConfig( dnum, 0, event_proc, 0);
if(ret){
printf("AdSetBoardConfig error: ret=%Xh¥n", ret);
AdClose(dnum);
return -1;
}
// サンプリング情報の設定 ret = SetConfig ( dnum, 8 );
return -1;
}
flag = 1;
// サンプリングスタート.
ret = AdStartSampling(dnum, FLAG_ASYNC);
if (ret) {
AdClose(dnum);
return -1;
}
// コールバック関数が呼び出されるまで待機.
while(flag);
// サンプリングデータの取得
ret = GetData(dnum, wSmplData, &ulSmplNum);
if (ret) {
AdClose(dnum);
return -1;
}
// デバイスのクローズ AdClose(dnum);
return 0;
}
Makefileの作成
下記ソースを「Makefile」という名前で、ソースファイルと同一のディレクトリに保存してください。
INCLUDE = /usr/X11R6/include LIB = /usr/X11R6/lib
CC = gcc all: adevent adevent: adevent.o
$(CC) adevent.o -o adevent –lgpg3100 -lpthread adevent.o: adevent.c
$(CC) -Wall -c adevent.c -o adevent.o clean:
rm -f *.o ¥#* *~ adevent
Step2 コンパイル/実行
ソースコード・Makefileを保存したディレクトリに移動し、コマンドラインから下記コマンドを実行します。
make
コンパイルが成功すると、オブジェクトファイル「adevent.o」と実行ファイル「adevent」が作られます。
※ErrorやWarningが表示された場合はコードの記述に誤りがありますので内容を見直してください。
プログラムを実行するには、以下のコマンドを実行します。
./adevent
プログラムの実行に成功すれば、以下のようにチャンネル1~8までのデータが件数分の出力が行なわれます。
下記に表示しているデータは例となります。実際には入力されているデータが取得されます。
The sampling is successfully completed.
1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h 1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h :
1111h 2222h 3333h 4444h 5555h 6666h 7777h 8888h
Step3 プログラムの解説
サンプリングの基本的な処理については、「5.4.2 サンプリング」で解説しているため省略します。
ここでは割り込み機能を使用するために追加したソースコード部分について説明します。
まず、割り込み機能を使用するためには、AdSetBoadConfig関数でコールバック関数を登録する必要があります。
コールバック関数とは、割り込みが発生した場合に呼び出される関数となります。
AdSetBoadConfig関数の書式は下記になります。
int AdSetBoardConfig(
int nDevice, /* デバイス番号 */
int nReserved1, /* 予約 */
PLPADCALLBACK pEventProc, /* ユーザ・コールバック関数 */
int uData /* ユーザデータ */
);
引数名 内 容
nDevice オープンするデバイス番号を指定します。
nReserved1 予約です
pEventProc コールバック関数を指定します。
uData コールバック関数へ渡すユーザデータを指定します。
コールバック関数の登録としては、第三引数にて、呼び出したいコールバック関数を指定します。
プログラムでは、「event_proc」という関数を呼び出すように設定しています。
コールバック関数の書式は、下記である必要があります。
void CallbackProc(
int uData /* ユーザ・データ */
);
ユーザデータは、AdSetBoardConfig関数の第四引数で指定します。
ユーザデータは、コールバック関数の第一引数に値がそのまま渡されます。
どういった場合に使用するかは、複数のデバイスで割り込みを登録した場合、どのデバイスに対する割り込みかを判 別するときに使用します。
本プログラムで、サンプリングが終了した場合に、コールバック関数が呼び出されるため、コールバック関数内で、「The
sampling is successfully completed.」という文字を出力し、サンプリングを終了しているかのフラグとして使用しているグ
ローバル変数のflagを0にしています。
本プログラムでは、AdStartSampling関数で非同期サンプリングとして実行し、while文でコールバック関数がコールされ るまで待機するように作成しています。
コールバック関数が発生すると、サンプリングデータの取得を行い、画面にサンプリングデータを出力するようになって います。