【概要】
PICでハンドシェイク通信を行うためのプログラムを説明します。
ここではパラレル通信を制御するためのプログラムを説明し、
その使い方も説明します。基本的なサブルーチンとして構成
されているので、この通信プログラムを組み込んで任意の
プログラムを作ることが可能です。
【プログラムの構成】
ハンドシェイク通信のプログラムの流れは、前ページで説明した
タイミングチャートを満足するように構成します。
まず、全体は送信用プログラムと、受信用プログラムに分かれて
います。それぞれの大きな流れは下図のフローチャートの様に
なっています。
この流れは、まさにタイミングチャートと同じ流れとなっています。
また全体としては、非常に単純なプログラムとなっています。
《送信プログラム》
前に送信したデータの送信終了待ちも
兼用しています。
送信開始
《受信プログラム》
送信側が送信開始するまで待つ
受信開始
【プログラム】
上記構成で作成したプログラムソースは、下記となっています。
下記はいずれも基本的な構成で、ビジーやストローブを待つ
ところでは、永久待ちとなります。従って、これを回避するため
には。ウォッチドッグタイマなどによる回復策が別途必要と
なります。
《送信サブルーチン》
上記フローチャートに従った送信部のサブルーチンは下記の
様になります。
ストローブやビジーを待つ所では、いずれも3回確認するように
して、ノイズなどによる誤動作が無いようにしています。
;************************************
; Send 1 byte subroutine
; During send mode RA2=STORBE output
; and RA3=BUSY input,PORTB is output
;************************************
SNDSUB
;*** set PORTB mode to send
MOVWF TEMP ;save send data
BSF STATUS,RP0 ;Set Page 1
CLRF TRISB ;Set PORTB to all output
BCF STATUS,RP0 ;Set Page 0
;**** test busy ******
CKBSY
BTFSS PORTA,3 ;Test BUSY
GOTO CKBSY ;busy case
BTFSS PORTA,3 ;confirm
GOTO CKBSY
BTFSS PORTA,3
GOTO CKBSY
MOVF TEMP,W ;get send data
MOVWF PORTB ;data out
BCF PORTA,2 ;out strobe
WTBSY
BTFSC PORTA,3 ;test BUSY on
GOTO WTBSY
BTFSC PORTA,3 ;confirm
GOTO WTBSY
BTFSC PORTA,3
GOTO WTBSY
BSF PORTA,2 ;reset strobe
WTRDY
BTFSS PORTA,3 ;wait BUSY off
GOTO WTRDY
BTFSS PORTA,3
GOTO WTRDY
BTFSS PORTA,3
GOTO WTRDY
RETURN
《受信サブルーチン》
上記フローチャートに従った受信部のソースは下記のように
なります。
ビジーやストローブ信号を待つところでは、いずれも3回同じ
ことを確認し、また、データ入力部は2回同じデータが入力され
たとき、正常なデータとして取りこみます。
このようにすることで、ノイズなどによる誤動作を回避しています。
;*******************************************
; Receive Subroutine
; During receive mode RA2=BUSY output
; and RA3=STROBE input
;*******************************************
RECVSUB
;**** Set PORTB mode to receive ****
BSF STATUS,RP0 ;Set Page 1
MOVLW 0FFH ;get FF
MOVWF TRISB ;Set Portb to all input
BCF STATUS,RP0 ;Set Page 0
;**** wait STROBE *****
BTFSC PORTA,3 ;RA3 BUSY(strobe) input
GOTO MAINLP
BTFSC PORTA,3 ;confirm
GOTO MAINLP
BTFSC PORTA,3 ;confirm
GOTO MAINLP
RECV
BCF PORTA,2 ;set BUSY
MOVF PORTB,W ;get command data
MOVWF TEMP ;save
MOVF PORTB,W ;confirm
SUBWF TEMP,W
BTFSS STATUS,Z ;same data?
GOTO RECV ;retry
WTLP1
BTFSS PORTA,3 ;check STB is off?
GOTO WTLP1 ;wait loop
BTFSS PORTA,3 ;confirm
GOTO WTLP1
BTFSS PORTA,3
GOTO WTLP1
BSF PORTA,2 ;reset BUSY
MOVF TEMP ;get data
RETURN
《初期化ルーチン》
上記サブルーチンを使うためには、下記のようにPORT Aを
初期化でモード設定しておく必要があります。
;******************************************
; Initialize
; Port initilize
; PORT A RA1,2:output others:input
; PORT B all input/output changable
;******************************************
INIT
BSF STATUS,RP0 ;Set Page 1
MOVLW 019H ;Set PortA to initial mode
MOVWF TRISA
MOVLW 0FFH ;get FF
MOVWF TRISB ;Set Portb to all input
BCF STATUS,RP0 ;Set Page 0
BSF PORTA,2 ;reset strobe
GOTO MAINLP