パラレルインタフェース接続回路&実験
- パラレルインターフェース
パラレルインターフェースとは複数の入力信号を並列(パラレル)に読み取る接続形態です。これに対し、シリアルインターフェースは1本の信号線から時系列のデータを直列(シリアル)に読み出す方法で、信号線は少ないのですがデータの送受信方法が複雑になります。パソコンの場合、モデムやマウスなどはシリアルで接続し、プリンタはパラレルで接続する例が多いようです。
- 利用パソコン
- パソコン
実験室の備品である日立製のノートパソコン Flora270SX を利用します。これは、イーサネット、PCカードによる接続が可能です。
OSはwindowsNTでなく98です(これは、データ収集装置 NR-350 がNTに対応していないためです)。利用法はNTとあまり変わりませんが保護機能が弱いので、注意が必要です。また、システムの設定は変更してはいけません。
ファイルは、ドライブCのフォルダhomeに自分の学籍番号のフォルダを作成し、そこに記録してください。homeフォルダがない場合、ドライブCに作成してください。
- REX-5055:パラレルインターフェースカード
ここでは、パラレルインターフェースを行うPCカードを利用して、ノートパソコンと実験回路を接続します。PCカードはRATOC社のREX-5055を利用します。これは、合計16本の信号を入力または出力として利用できます
左前方にPCカードのスロットがあります。ここにPCカードREX-5055を差し込みます。ドライバーの追加を要求されたら、付属のFDDを挿入します。
- 接続回路
- 実験回路
実験回路は、先に作成した2進4桁の計数器を利用します。ただし、クリアはプログラムで行いますから、FFのクリア端子をまとめて、外部端子CLRに接続します。
- PCとの接続
- 接続
セントロニクス・コネクタのGND(黒/13p:下段の右端)をロジックボードのGNDに接続します。これで、PCと実験回路の回路の電位が共通になります。次に実験回路のCLRとCLKをPCカードのPIO8(黄色/18P:下段右から6番)とPIO9(6P:上段右から6番)に接続します。また、カウンタの4桁の出力をPIO0(青色/下段の左端)..PIO3(上段左から2番)に接続します。
- 信号線
PCカードからは24ピンのセントロニクス(社名でよく利用されます)型のコネクタで接続しています。ピン番号は、外形が上に広がるように見て、右上が1P(ピン)で左上が12P,右下が13Pで左下が24Pになります。GNDは右下の13ピンです。
- 信号線の電気的特性
信号線は負論理(プログラムで1を設定すると信号線はL:GNDレベルになる)で、TTL互換(実験で利用しているICと同じ特性)です(正確には出力はオープンコレクタです)。
- 接続図
- 注意
セントロニクスコネクタに青色の半田付け端子のコネクタを差込んで接続しますが、このコネクタははずさないこと。外れていた場合、このコネクタは上下を逆にしても接続できるので注意して差し込むこと。雌側の金属コネクタは上が広くなっている。青色の半田端子のコネクタも、これに合わせて(右上を1番ピンにする)差し込むこと。
- 実験回路
- プログラム
- 目的
ボタンで外部の実験回路の計数器のクリア、計数を行い、現在の計数器の値を読み込み表示します。計数器のクリアはパソコン側のソフトで行います。プロジェクトはホームページからダウンロードします。
- ダイアログベースプログラム(Rex55COUNT)
- ライブラリ
このカードを利用するライブラリが提供されています。DIO32.H、DIO32.LIB、DIO32LIB.DLL を作成するプロジェクトのフォルダにおきます。
- コントロールと変数
クリア(CLR)と計数ボタン(COUNT)、自動計数を行うSTARTボタンを用意します。また、計数値を読み込むエディットボックスを用意します。
m_InpにPCカードから読み取った値を、m_OutにPCカードに出力する値を、MyIOBaseにPCカードの番地を記録します
- 使用する関数
以下の関数は、DIO32.H、DIO32.LIB に定義されています。
- GetMyCardResource
使用するウインドウとPCのカード名から、カードの先頭I/Oアドレスと割り込み番号を取得します。
GetMyCardResource( GetSafeHwnd(), MyCardName, sizeof(MyCardName),SlotNo,
&MyIOBase, &MyIrqNo );
- StartHWIntMyVxD
下位バイトを入力、上位バイトを出力に設定し、PIO7を割り込みポートに利用します(割り込みは今回の実験では使用しません)。
StartHWIntMyVxD( GetSafeHwnd(), MyIOBase, MyIrqNo,0,1, 7, 1, 0, MaxCount
) ;
- OutPort
上位バイト(PIO15..8)にm_outを出力します。
OutPort(MyIOBase+3,m_Out);
- InPort
下位バイト(PIO7..0)から入力し関数値として返します。
InPort(MyIOBase+2))
- プログラム
- 初期設定
OnInitDialog()で初期設定を行います。GetMyCardResource()でPCカードのIOアドレスをMyIOBaseに取得します。次に、StartHWIntMyVxD()でPIO7..0の下位バイトを入力、PIO15..7の上位バイトを出力に設定します。
- BOOL CRex55Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
....
// TODO: 特別な初期化を行う時はこの場所に追加してください。
WORD SlotNo=0;
BOOL status;
status = GetMyCardResource( GetSafeHwnd(), MyCardName, sizeof(MyCardName),
SlotNo, &MyIOBase, &MyIrqNo );
TRACE("%d %d \n",MyIOBase, MyIrqNo);
int MaxCount=100;
//下位は入力、上位は出力、7ポートで割り込み
StartHWIntMyVxD( GetSafeHwnd(), MyIOBase, MyIrqNo,0,
1, 7, 1, 0, MaxCount ) ;
m_Out=0;
OutPort(MyIOBase+3,m_Out);
Busy=FALSE;
return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
- OnCheck:入力
接続したPio3..0の4本の信号を読み取り(入力し)ます。(MyIOBase+2)が読み取り用のPCレジスタの番地になります。~ は、入力が負論理で0,1が変転しているため、読み取り値を反転(NOT)する演算です。&はAND演算で、接続していない信号線の値を0にします。UpdateData(FALSE);で読み取った値をダイアログに表示します。
- void CRex55Dlg::OnCheck()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_Inp=(~InPort(MyIOBase+2))&0x0F;
UpdateData(FALSE);
}
- OnClr() :クリア
CLR(クリア)ボタンを押した時の処理を指定します。クリアといっても、出力ポートのPIO8にパルスを送るだけで、実際のクリア動作は外付けの計数回路が行います。他のビットの値を変更しないよう、m_Out
^ 0x01 で第0ビットのみを1に反転して出力し、次に再び0に戻して出力します。OutPort(MyIOBase+3,m_Out);は、出力用レジスタ MyIOBase+3 に、データm_Outを送り出します。終了後、OnCheck()を呼び出し、更新した計数器の値を読み込み表示します。
- void CRex55Dlg::OnClr()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_Out=m_Out ^ 0x01;
OutPort(MyIOBase+3,m_Out);
m_Out=m_Out ^ 0x01;
OutPort(MyIOBase+3,m_Out);
OnCheck();
// TRACE("OnCLr %d\n",m_Out);
}
- OnCount():計数
COUNT(計数)ボタンを押した時の処理を指定します。計数信号は、出力ポートのPIO9を使用します。これは、出力レジスタの第1ビットの相当します。ビット番号が異なるだけで、処理は同じです。
- void CRex55Dlg::OnCount()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_Out=m_Out ^ 0x02;
OutPort(MyIOBase+3,m_Out);
m_Out=m_Out ^ 0x02;
OutPort(MyIOBase+3,m_Out);
OnCheck();
}
- OnStart():自動計数
Startボタンを押したときの処理です。タイマーを利用し、指定時間間隔で計数器を増します。計数値が10になったら、計数器をクリアします。OnTimer()では、タイマーのセット、削除を行います。
- void CRex55Dlg::OnStart()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
if(!Busy){
SetTimer(1,200,NULL);
Busy=TRUE;
}
else {
KillTimer(1);
Busy=FALSE;
}
}
- void CRex55Dlg::OnTimer(UINT nIDEvent)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
OnCount();
if (m_Out==10)OnClr();
OnCheck();
CDialog::OnTimer(nIDEvent);
}
- 実験
- 確認
HomeフォルダにあるRexCounterを実行する。CLRボタンを押して計数器のクリア、COUNTボタンを押して計数が進むことを確認する。STARTボタンを押すと、10進計数器として動作する。
- 変更
12進で自動計数するよう、プログラムを変更しなさい。
- 課題
プログラムを変更して、12進カウンタにするには、プログラムをどのように変更したらよいか説明しなさい。
- 補足
- サンプルプログラム
Rex55に添付されたソース付きのサンプルプログラムがあります。実行し、PIO制御で実行モードを切り替えます。LEDオンオフ制御で上位バイト出力(ビット設定可能)、入力監視で下位バイト入力、割り込み制御でメッセージ割り込み、高速割り込み、の実験が可能です。
- MFCで利用する場合のDiolib32.hの変更
MFC(ダイアログ)で使用する場合、Diolib32.hのDllImport宣言を、extern "C" で括る必要があります。詳細はDiolib32.hに説明があります。
- 割り込み
割り込み信号を用いると、割り込み信号が入ったとき、予め設定した関数を実行できます。この機能を利用すると、外部のセンサーで検知したタイミングで計数したり、音を出したり、特定の信号を出力できます。
割り込みメッセージは WM_XVDEVENT で定義されています。
- ダウンロード
このプロジェクトをダウンロードできます。次の行をクリックして、*.exeファイルを適当なフォルダに保存します。
ダウンロード開始
このファイルは自己解凍型の圧縮ファイルです。このファイルを実行すると同じフォルダにサーバーとクライアントのプロジェクトのファイルを展開します。
トップに戻る