PIC側プログラム

【概要】

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





    次のページへ       Topページへ