#ifndef __GidADC_H #define __GidADC_H //==================================================================== // Gid-ADC interface 16/32bitMode 数理設計研究所 1997/5/5 //==================================================================== #pragma hdrstop #include /*==============================================*/ //Win32 でコンパイルするときには //io32.cpp を外部で必要とするので tasm32.exe を必要とする //代わりに io32.obj をリンクしてもよい #ifdef __WIN32__ #include "io32.h" #endif //__WIN32__ /*==============================================*/ /* 機種固有の設定 */ #define PCAT //#define PC98 /*==============================================*/ /* PCAT ハードウェア */ #ifdef PCAT #define COM1_BASE 0x3f8 #define COM2_BASE 0x2f8 #define COM3_BASE 0x3e8 #define COM4_BASE 0x2e8 #define SIO_MDM 4 /* rw modem control */ #define SIO_MDM_RTS 0x02 /* RTS */ #define SIO_MDM_DTR 0x01 /* DTR */ #define SIO_MSR 6 /* rw modem status */ #define SIO_MDMS_RLSD 0x80 /* RLSD */ #define SIO_LCR 3 /* rw line contorlo */ #define SIO_BRK 0x40 /* break data send */ #endif /* PCAT */ /*------------------------*/ #ifdef PC98 #define SIO_RES 0x40 /* リセットコマンド */ #define SIO_8N 0x4e /* 8bit non parity 16clk */ /* 8251 command */ #define SIO_TX_EN 0x01 /* 0=送信禁止 1=送信許可 */ #define SIO_DTR 0x02 /* 負論理DTR */ #define SIO_RX_EN 0x04 /* 0=受信禁止 1=受信許可 */ #define SIO_BRK 0x08 /* 0=ノーマル 1=ブレーク(送信状態=0)*/ #define SIO_ECL 0x10 /* 0=nop 1=エラーフラグクリア */ #define SIO_RTS 0x20 /* 負論理RTS */ #define SIO_SRES 0x40 /* 0=nop 1=リセット */ #define SIO_EH 0x80 /* 0=nop 1=ハントフェーズに入る */ /* 8251 status */ #define SIO_TX_RDY 0x01 /* 0=送信バッファフル 1=空 */ #define SIO_RX_RDY 0x02 /* 0=受信データ無し 1=受信データあり */ #define SIO_TX_EMP 0x04 /* 0=送信中データあり 1=送信中ではない */ #define SIO_PE 0x08 /* 0=パリテイエラーなし 1=エラー */ #define SIO_OVE 0x10 /* 0=オーバーランエラーなし 1=エラー */ #define SIO_FE 0x20 /* 0=フレーミングエラーなし 1=エラー */ #define SIO_SYNC_BRK 0x40 /* 0/1=ブレーク検出 */ #define SIO_DSR 0x80 /* 負論理DSRの状態 */ /*; 8251a 2-12-1*/ #define SIOD 0x30 #define SIOC 0x32 #define PPI1B 0x33 /* ; pb0 calender read line ; pb1 external ram parity error detecter ; pb2 none ; pb3 crt type 1=high, 0=normal ; pb4 int3(HD) ; pb5 CD carrier detect(negative) ; pb6 CTS (negative) ; pb7 CI (rs232c ?) */ #define DSR_MASK 0x10 /* 8251 MSB をここにもってくる */ #define CD_MASK 0x20 #define CTS_MASK 0x40 #define CI_MASK 0x80 #endif /* for PC98 */ //================================================ class GidADC { private: int Comport; //RS232C COMポート番号 1〜4(PCAT) 1(PC98) #define UNIPOLA 0x08 #define BIPOLA 0 int Pola; //アナログ変換モード UNIPOLA=0〜4095mV BIPOLA=±2047mV int Ch; //アナログ入力チャンネル 0〜7 #define Diff 0 #define Singl 0x04 int SglDif; //アナログ入力モード Diff=差動入力 Single=普通の入力 //GetNTCnv() のトリガモード int TrigaPola; //1=負から正へ、-1=正から負へ int TrigaAuto; //0=none, 1=Auto、2=Normal int CliMode; //ブロック変換のときに割り込みを禁止するフラグ int TxStat; //Txの制御状態記憶 unsigned char ComMem, ComMem2; //Txの制御状態記憶補助 PC98のみで使われる public: GidADC(void) { Init(); } //コンストラクタ、内部メモリのイニシャルだけ //完全初期化、コンストラクタで呼び出されるので普通は呼び出す必要が無い void Init(void); //信号線を設定して電源を供給する、ポート番号は1から始まる番号 void InitPower(int ComNum); void SetCh(int ch); //アナログ入力チャンネル番号(0〜7)以後の操作を指定する //変換モードの指定 void SetUnipola(void){ Pola = UNIPOLA; } //0〜4095mV void SetBipola(void) { Pola = BIPOLA; } //±2047mV void SetSingle(void) { SglDif = Singl; } //ノーマル void SetDiff(void) { SglDif = Diff; } //差動 //トリガモードの指定 ブロックモードでデータ変換するばあいに使われる enum { TNone, TAuto, TNormal }; void SetTrigaNone(void) { TrigaAuto = TNone; } //トリガ無し void SetTrigaAuto(void) { TrigaAuto = TAuto; } //自動 void SetTrigaNormal(void){ TrigaAuto = TNormal;} //トリガがあるまで待つ void SetTrigaPlus(void) { TrigaPola = 1; } //正極性 void SetTrigaMinus(void) { TrigaPola = -1; } //負極性 //タイミング指定 クロック、ストローブ、1データごとの待ちループ回数の指定 void SetClkWait(long t) { ClkW = t; if(ClkW <=0) ClkW=1;} long GetClkWait(void) { return ClkW; } void SetStbWait(long t) { StbW = t; if(StbW <=0) StbW=1;} long GetStbWait(void) { return StbW; } void SetBlkWait(long t) { BlkW = t; if(BlkW <=0) BlkW=1;} long GetBlkWait(void) { return BlkW; } //ポートコントロール void SetTx(int i); //Txポートを(1/0)制御する void SetTxPulse(long t); //tループ時間(PC依拠)だけTx信号を1にする //現在設定されているアナログチャンネルを読み出しながらdataを超えるまでTxを //1にする。設定値を超えたら0に戻して帰ってくる。最初にデータ取得して試験する //のでパルスを出さない場合もある。 void GidADC::SetTxPulseWait(int d); //1サンプルデータ取得 int GetCnv(void); //規定数のデータ取得 n個のデータを取り込む int GetNCnv(int n, int *buf); //規定数のデータ取得マルチチャンネル版 //n個のデータを取り込む buf[x]がNULL=0ポインタなら取り込まない int GetMCnv(int n, int *buf[8]); //規定数のデータ取得、トリガつき //wnはnの整数倍を指示 2 なら2倍、自動モードならこの倍数だけトリガを待つ //帰り引数 0なら成功、それ以外ならトリガが失敗したがデータは取得 //変換中の割り込みは SetCliMode() による int GetNTCnv(int v, int n, int wn, int *buf); //PCシステム割り込みを GetNCnv() GetNTCnv() //について禁止する設定 他のモードでは禁止されない //モード設定するとデータ取得間隔はきっちりと規定されるが副作用として //PCの時間が遅れる、時間遅れは再起動すれば元に戻る。 void SetCliMode(int i = 1) { CliMode = i; } //引数無しならCLIモード void ReSetCliMode(void) { CliMode = 0; } //解除 //時間関数 //GetN(T)Cnv の1データあたりの時間を秒単位で調べる double GetNCnvTime(void); //秒単位 double NCnvTime; //結果を保存しているので後で読み出すこともできる //ここから下は非公開 private: long ClkW; //クロック待ちループの設定  既定値=1 long StbW; //ストローブ待ちループの設定 既定値=1 long BlkW; //GetN(T)Cnv データ間待ちループの設定  既定値=1 void ClkWait(void); void StbWait(void); void BlkWait(void); void SCLK(int Dout); //DATA out Only CLK int SCLKD(void); //データ読み出しCLK int DOut(int Command); //1bit DOUT void SetTxE(void); //Txeポートのコントロール void SetComport(int c); //1から始まるCOMボート番号 }; //=============================================== #endif /* __GidADC_H */