2023.1.7
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第149回]



●PICUSBIO−03(98)ICモード(20)送受信プログラム(2)

前回はマスターが送信してそれをスレーブが受信するプログラムと、スレーブが送信してマスターが受信するプログラムを1本のプログラムにまとめてそれを実行しました。
テストプログラムとしてはそれで終ってもよかったのですけれど。
せっかくそこまで作ったのですからもう少し「色」をつけて、もう少しだけ「らしい」プログラムにしてみたいと思いました。
そのように考えて前回のプログラムに一味加えてみました。
まずはマスター側のプログラムです。
   10 s$="How are you?"
   20 l=len(s$)
   30 picout TRISB,$ff
   40 picout SSPCON1,0
   50 picout SSPSTAT,$80
   60 picout SSPCON1,$28
   70 picout SSPADD,$77
   80 picout SSPCON2,1:'START
   90 picout SSPBUF,$00:'address write
  100 for n=1 to l
  110 ss$=mid$(s$,n,1)
  120 c=asc(ss$)
  130 if and(picin(SSPSTAT),1)=1 goto 130
  140 picout SSPBUF,c
  150 next n
  160 if and(picin(SSPSTAT),1)=1 goto 160
  170 picout SSPBUF,3:'etx
  180 if and(picin(SSPSTAT),1)=1 goto 180
  190 picout SSPCON2,4:'STOP
  200 'stop
  210 d=picin(SSPSTAT):'dummy
  220 d=picin(SSPCON1):'dummy
  230 d=picin(SSPCON2):'dummy
  240 picout SSPCON2,$01:'START
  250 picout SSPBUF,$01:'READ
  260 if and(picin(SSPSTAT),1)=1 goto 260
  270 picout SSPCON2,8:'renceive enable
  280 if and(picin(SSPSTAT),1)=0 goto 280
  290 d=picin(SSPBUF)
  300 if d#3 picout SSPCON2,$10:print chr$(d);:goto 270
  310 picout SSPCON2,$30:'NACK
  320 if and(picin(SSPSTAT),1)=1 goto 320
  330 picout SSPCON2,4:'STOP
  340 print

やっていることは前回のプログラムと変わりません。
前回は単純にテストデータ(8ビットの文字コード)を送受信しただけでしたがそこのところを意味のある文字列の送受信に変えました。
10行から200行までがマスターが送信してスレーブがそれを受信するモードでのマスター側のプログラムです。
10行で文字変数s$に文字列を定義します。
110行でその文字列の先頭から順に1文字を切り出します。
MID$は文字列から任意の文字列を切り出す関数です。
120行でその1文字を8ビットの文字コードに変換します。
ASC()は1文字を1バイトの文字コードに変換する関数です。
140行でその文字コードを送信します。
データ列を送信し終わったところでエンドコード(03)を送ります(170行)。
データの終わりを示す方法は他にもありますがこれが簡便な方法です。
エンドコード03(ETX)は昔から送信文字列の終わりを示すコードとして用いられています。
240行から340行までが後半部分です。
ここはスレーブが送信してマスターが受信するモードのマスター側のプログラムです。
290行で受信データを変数dに入れます。
300行でdの値を文字に変換してprint文で表示します。
CHR$()は1バイトのコードを文字コードとみなして対応する文字に変換する関数です。
300行では同時にデータ列の終わりの検出も行なっています。
’#’は’ノット イコール’です。
普通のBASICでは<>を使うものが多いと思います。

下はスレーブ側のプログラムです。
   10 s$="I'm fine."
   20 l=len(s$)
   30 picout TRISB,$ff
   40 picout SSPCON1,0
   50 picout SSPSTAT,$80
   60 picout SSPCON1,$26
   70 picout SSPCON2,$81
   80 if and(picin(SSPSTAT),1)=0 goto 80
   90 d=picin(SSPBUF)
  100 picout SSPCON1,$36:'CKP=1
  110 if and(picin(SSPSTAT),1)=0 goto 110
  120 d=picin(SSPBUF)
  130 if d#3 print chr$(d);:goto 100
  140 print
  150 picout SSPCON1,$36:'CKP=1
  160 if and(picin(SSPSTAT),$10)=0 goto 160
  170 picout SSPCON1,$36:'CKP=1
  180 if and(picin(SSPSTAT),1)=0 goto 180
  190 d=picin(SSPBUF):'address
  200 for n=1 to l
  210 ss$=mid$(s$,n,1)
  220 c=asc(ss$)
  230 if and(picin(SSPCON1),$10)=$10 goto 230
  240 picout SSPBUF,c
  250 picout SSPCON1,$36:'CKP=1
  260 next n
  270 if and(picin(SSPCON1),$10)=$10 goto 270
  280 picout SSPBUF,3:'etx
  290 picout SSPCON1,$36:'CKP=1
  300 if and(picin(SSPSTAT),$10)=0 goto 300:'STOP

マスター側のプログラムとは送信受信の順序が逆になっているだけでやっていることは同じです。
10行から140行までがマスターが送信してスレーブがそれを受信するモードでのスレーブ側のプログラムです。
150行から300行までが後半部分です。
ここはスレーブが送信してマスターが受信するモードのスレーブ側のプログラムです。

プログラムを実行しました。

プログラムは瞬時に実行されて見た目には左側の画面と右側の画面に同時に文字列が表示されたように見えます。
実際は先に右側に”How are you?”と表示された後で左側に”I’m fine.”と表示されます。
これで少しはらしいプログラムになったと思います。

やっと今回でICモードが終りました
次回からはEUSARTです。

PIC−USBIO using BASIC[第149回]
2023.1.7upload

前へ
次へ
ホームページトップへ戻る