PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第149回]
●PICUSBIO−03(98)I2Cモード(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.”と表示されます。
これで少しはらしいプログラムになったと思います。
やっと今回でI2Cモードが終りました
次回からはEUSARTです。
PIC−USBIO using BASIC[第149回]
2023.1.7upload
前へ
次へ
ホームページトップへ戻る