【概要】
パソコンのプリンタインターフェースを使って、ハンドシェイク通信を
行う基本的な機能をテストするプログラムです。
パソコン側で、パラレル通信を制御する、Dynamic Link Library
(DLL)形式のプログラムは前章のものをそのまま使います。
テストをするためのプログラムは、PIC側はアセンブラーで、パソコン
側は、Visual BASIC で作ります。
【プログラムの機能】
テストをするために基本的な機能として下記 5種類のテストを用意
しました。
パソコン側から見たときのテストとして
(1) イニシャライズ
パソコン側のストローブを強制リセットし、表示エリアを消去する。
その後、パソコン側のステータスレジスタの値を読んで表示する。
このテストではPIC側は何もしません。
(2)イニシャライズコマンド
PICに対してコマンド「0」を送り、PIC側の初期化を行う。そして
パソコン側のステータスレジスタの値を読んで表示する。
PIC側は、コマンド「0」を受信したら、入出力モードを初期化し
受信待ち状態とします。
(3)1バイト転送
PICに対してコマンド「1」を送信し、折り返し1バイトのデータを
受信し表示する。(データは0x12)
PIC側は、コマンド「1」を受信したら、データ「0x12」を送信データ
として、1バイトのデータを送信し、完了したら受信待ち状態とします。
(4)1ワード転送
PICに対してコマンド「2」を送信し、折り返し1ワード(2バイト)の
データを受信し表示する。(データは0x5634)
PIC側は、コマンド「2」を受信したら、2バイトのデータを順次送信
します。まず、「0x34」を送信し、次に「0x56」を送信します。
(5)256バイト連続転送
PICに対してコマンド「3」を送信し、折り返し連続256バイトの
データを受信し表示する。また、受信データをCSVファイルとして
保存する。受信データが「0」だったら終了する。
PIC側は、コマンド「3」を受信したら、1から0までの1バイト毎の
データを順次カウントアップして送信し、送信完了したら受信待ち
状態に戻ります。
この機能を果たすフォームは下図の様にしています。
下図は各々のテストを実行した結果が表示エリアに表示された状態
です。
【パソコン側プログラム】
実際のプログラムを説明します。
まずパソコン側のアプリケーションプログラムはVisual BASIC Ver5.0で作成
しています。
下記がプログラムコードの部分です。
−−−−− 共通定義部
Private Declare Function RecvD Lib "hndshk" (ByVal port As Integer) As Integer
Private Declare Function SendD Lib "hndshk" (ByVal port As Integer, ByVal databyte As Integer) As Integer
Private Declare Sub OutB Lib "hndshk" (ByVal port As Integer, ByVal databyte As Integer)
Private Declare Function InpB Lib "hndshk" (ByVal port As Integer) As Integer
Dim ret As Integer
Dim result As Integer
Dim send_data As Integer
Dim recv_up As Integer
Dim recv_low As Integer
Dim recv_data As Integer
−−−− イニシャライズコマンドテスト
Private Sub Command3_Click()
send_data = &H0
result = SendD(&H378, send_data)
If result <> 0 Then
Picture1.Print Hex(result)
ret = MsgBox("Send error", vbExclamation, "send error")
End If
End Sub
−−−−− 1バイト転送コマンドテスト
Private Sub Command4_Click()
send_data = &H1
result = SendD(&H378, send_data)
If result <> 0 Then
ret = MsgBox("送信エラーです。やり直して下さい!", vbExclamation, "送信エラー")
End If
recv_data = RecvD(&H378)
If recv_data < 0 Then
ret = MsgBox("Receive error Retry once more", vbExclamation, "Receive error!")
End If
Picture1.Print Hex(recv_data)
End Sub
−−−−− 1ワード転送コマンドテスト
Private Sub Command5_Click()
send_data = &H2
result = SendD(&H378, send_data)
If result <> 0 Then
ret = MsgBox("Send error,Retry once more", vbExclamation, "Send Error!")
End If
recv_low = RecvD(&H378)
If recv_up < 0 Then
ret = MsgBox("Receive error! Retry once more!", vbExclamation, "Receive error")
Picture1.Print "Error upper"
Else
recv_up = RecvD(&H378)
If recv_low < 0 Then
ret = MsgBox("Receive error! Retry once more!", vbExclamation, "Receive error")
Picture1.Print "Error lower"
Else
recv_data = recv_up * 256 + recv_low
Picture1.Print Hex(recv_data)
End If
End If
End Sub
−−−−− 256バイト連続転送テスト
Private Sub Command6_Click()
Open "handshake.csv" For Output As #1
send_data = &H3
result = SendD(&H378, send_data)
If result <> 0 Then
ret = MsgBox("Send error,Retry once more", vbExclamation, "Send Error!")
End If
Do While recv_data <> 0
For i = 0 To 31
recv_data = RecvD(&H378)
If recv_data < 0 Then
ret = MsgBox("Receive error! Retry once more!", vbExclamation, "Receive error")
Write #1, -1
Exit Do
Else
Write #1, recv_data
Picture1.Print Hex(recv_data) & " ";
End If
Next i
Picture1.Print
Loop
Picture1.Print
Close #1
End Sub
−−−−− イニシャライズテスト
Private Sub Command7_Click()
Picture1.Cls
OutB &H37A, 0
recv_data = InpB(&H379)
If recv_data < 0 Then
ret = MsgBox("Receive error! Retry once more!", vbExclamation, "Receive error")
End If
Picture1.Print Hex(recv_data)
End Sub
Private Sub Picture1_Click()
End Sub
【PIC側プログラム】
PIC側のプログラムは、できるだけ汎用に作る目的で、機能ブロック毎に
独立しています。
全体の構成は下図のようなフローになっており、まず、受信状態で待ちます。
受信したデータをコマンドとして解析し、0〜3までのそれぞれに従った処理
を実行したあと、再び受信待ちとします。
ここで、データの送信、受信はサブルーチンとなっており、前章で説明した
ものと同じものとなっています。
今回のプログラムは、ビジー信号やストローブ信号の確認部分は、永久
ループとなる可能性があるので、本来でしたら、ウォッチドッグタイマなどで
永久ループになったときの対策をしておくことが必要ですが、実験用という
ことで省略しています。
下記がPIC側のプログラムリストです。ダウンロードして、MPLABでお使い
下さい。
★ ハンドシェイク通信テストプログラム(hndshkasm.lzh)