INtimeドキュメンタリトップへ

PCIボードを検出しろ!!

10月16日・・・コーディング:アナログ入力ボード

先日の調査で、アナログボードに対する処理のシーケンスは、

初期化→サンプリング条件の設定→入力レンジの設定→LOOP[ サンプリング開始→入力データの取得 ]

であると確定しました。まずは初期化部分から取り掛かろう・・・ということで、またもやマニュアルを取り出し、初期化部について記述してある部分を開きます。


初期化処理
初期化設定
≪・・・・・・この箱はなんですか?outp( ADR + 8, 0 )というのは・・・・・?≫

outpをMSDNライブラリで検索してみると・・・:
_outp、_outpw、_outpd

     1 バイト (_outp 関数)、1 ワード (_outpw関数)、または 1 ダブルワード (_outpd )
     をポートに出力します。

   戻り値  出力したデータを返します。返すべきエラー値はありません。
   引  数  port        ポート番号
         databyte、dataword 出力する値
解説
指定した出力ポートにバイト、ワード、またはダブルワードを書き込みます。port では 0 から 65,535 の範囲の任意の符号なし整数を指定します。databyte では 0 から 255 の範囲の任意の整数、dataword では 0 から 65,535 の範囲の任意の値を指定します。

途中経過

≪ふむ、ふむということは・・・・・≫

「出力ポートベースアドレスのオフセット+08Hに対しBYTE値 0を出力する」という意味でしょう?

Microsoft Cではoutp( ADR + 8, 0 )ということは、INtime®ではどのような入出力関数があるのかを調査しなければいけないということですね。 マイクロネットHPINtime®のページや、INtime® Overview マニュアルから調査し、_outpはINtime®のリアルタイムCライブラリのyvals.hで以下のように宣言されていることが分かりました:


#ifdef __cplusplus
     extern "C" {
#endif

int _Cdecl             _outp( unsigned short port, int databyte );
    unsigned short _Cdecl  _outpw( unsigned short port, unsigned short dataword );

    int _Cdecl             _inp( unsigned short port );
    unsigned short _Cdecl  _inpw( unsigned short port );

#ifdef __cplusplus
        }
#endif

#pragma intrinsic( _outp, _outpw, _inp, _inpw )

#define outbyte(port,value) _outp((unsigned short)(port),  (int)(value) )
#define outhword(port,value)_outpw((unsigned short)(port), (unsigned short)(value))

#define inbyte(port)         (unsigned char )_inp(  (unsigned short)(port) )
#define inhword(port)        (unsigned short)_inpw( (unsigned short)(port) )
INtime®におけるポート入出力ライブラリ関数
   outbyte, outhword......出力
   inbyte, inhword........入力
ということで初期化処理では.... outbyte( ベースアドレス + 8, 0 ); となりました。

サンプリング条件の設定
サンプリング条件の設定
サンプリング条件の設定はまず「コマンドレジスタ( ベースアドレス+ 0x08H)に0x01を出力後、設定データ0レジスタにサンプリング条件を設定する」 サンプリング条件の設定について多少迷ったところがありました
サンプリング条件の設定について多少迷ったところがありました。
D3:Analog input Methodビット
                    シングルエンド     :0
                    差動入力           :1
D2:Channel Modeビット
                    シングルチャンネル :0
                    マルチチャンネル   :1
D1:サンプリングクロックソース
                    内部クロック       :0
                    外部クロック       :1
D0:サンプリングモード
                    ソフトウェアコマン :0
                    クロック           :1
今回は"シングルエンド"、"マルチチャンネル"、"内部クロック"、"ソフトウェア"という設定なため、 2進数で・・・0100 → 0x04を出力するということになりました。
/* サンプリング条件の設定 */
outbyte(analogBaseAdd + 0x08, 0x01); //コマンド0x01:サンプリング条件の設定
/* シングルエンド入力、マルチチャンネルモード、内部サンプリング、ソフトウェアモード */
outbyte(analogBaseAdd + 0x0C, 0x04); 

入力レンジの設定
入力レンジの設定
入力レンジの設定はまず「コマンドレジスタ( ベースアドレス+ 0x08H)に0x02を出力後、設定データ0レジスタ(ベースアドレス+ 0x0cH)にチャンネルを設定し、その後設定データ1レジスタ(ベースアドレス1+0x0dH)に設定レンジを出力します」

入力レンジの設定は仕様により±0~+10Vときまっていますので

/* 入力レンジの設定 0~10VとCH分指定する */
outbyte( analogBaseAdd + 0x08, 0x02 );
for( i = 0; i < CH_CNT ; i++){
      outbyte( analogBaseAdd + 0x0c, i );   // 各チャンネルを設定する 
       outbyte( analogBaseAdd + 0x0d, 0x04 ); // 0~10Vを設定する
} 
今回は0チャンネル~7チャンネルの全8チャンネル分の設定をするため、上記のようにしました。内部クロックは使用しないので、設定をしません。

割り込み要因の設定
割り込みを使用するため、割り込み要因の設定が必要になります。
割込み要因の設定
「使用する割り込み要因ビットに対して0を出力することによって割り込み要因を設定します。」・・・使用する割り込みは単純に言えば、「データの取得が可能です」という信号を表す要因です。この割り込み要因のそれぞれのビットは・・・:
割り込み要因ビット 割り込み要因種別
0x0ch D5 サンプリングクロックエラー
D4 サンプリングクロック入力
D2 データ上書きエラー
D1 データ読み込みOK
0x0dh D5 タイマ O/R ステータス
D4 タイマステータス
D3 外部トリガ O/Rステータス
D2 外部トリガステータス
上記の複数の割り込み要因の中で使用するのは、データ読み込みOKビット。つまり 0x0ch:D1のみ0を出力し、その他のビットにマスク出力(1)することになります。
outbyte( analogBaseAdd + 0x08, 0x04 ); 
outbyte( analogBaseAdd + 0x0c, 0xFE );
 //最終ビットのみ0その他をマスク処理 outbyte( analogBaseAdd + 0x0d, 0xFF ); //全ビットをマスク処理


※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.