PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第161回]
●PICUSBIO−03(110)EUSART(12)同期モード(5)送受信プログラム(2)マスター受信/スレーブ送信プログラム
前回は同期通信のテストを行いました。
マスターが送信でスレーブが受信です。
今回はその反対にマスターが受信でスレーブが送信のテストを行ないます。
マスターとスレーブが入れ替わりますがプログラムはそれほどは違わないと思います。
下が作成したテストプログラムです。
左側の画面が受信側(マスター)で右側の画面が送信側(スレーブ)です。
右側のPICUSBIO−03(スレーブ)からデータを送信してそれを左側のPICUSBIO−03(マスター)で受信します。
前回と異なるのはスレーブがデータを送信しますが同期クロックは前回と同様マスターが送信するという点です。
まずは左側のプログラム(マスター受信プログラム)について簡単に説明します。
プログラムの先頭でRCSTAをクリアしています(10行)。
フレーミングエラーやオーバーランエラーが発生したときのことを考えてそれらをクリアするためにRCSTAをクリアしています。
20行は確実にクリアしたことを確認するためのprint文です。
この部分は前回はスレーブ側の受信プログラムに入れました。
その次にPORTBを入力に設定します(30行)。
それからボーレートを決定します。
前回のテストでは1200ボーで通信できましたので今回も1200ボーでテストを行ないます。
この部分は前回と同じです。
SPBRGHには上位8ビット($27)をセットします(40行)。
SPBRGには下位8ビット($0F)をセットします(50行)。
BAUDCONレジスタに$08をセットします(60行)。
その次にTXSTAレジスタをセットします(70行)。
今回はTXSTAに$90をセットします。
bit7(CSRC=1)、bit6(TX9)=0、bit5(TXEN)=0、bit4(SYNC)=1です。
最後にRCSTAレジスタに$90をセットします(80行)。
bit7(SPEN)=1、bit6(RX9)=0、bit5(SREN)=0、bit4(CREN)=1です。
ここまでで初期設定は終わりです。
受信バッファ(RCREG)に受信データがあるときにPIR1レジスタのbit5(RCIF)がセットされます。
RCIFはリードオンリーです。
RCIFはRCREGの受信データを読むとクリアされます。
RCIFがセットされていたら(90行、110行、130行)、RCREGを読みます(100行、120行、140行)。
右側、送信側のプログラム(スレーブ送信プログラム)の説明です。
最初にPORTBを入力に設定します(10行)。
スレーブはマスターが送信するクロックを利用しますからボーレートの設定は不要です。
20行でTXSTAに$30を設定します。
bit7(CSRC=0)、bit6(TX9)=0、bit5(TXEN)=1、bit4(SYNC)=1です。
30行でRCSTAに$80を設定します。
bit7(SPEN)=1、bit6(RX9)=0、bit5(SREN)=0、bit4(CREN)=0です。
ここまでで初期設定は終わりです。
テストデータとして3文字を送信します。
’A’($41)、’B’($42)、’C’($43)を送ります。
最初の文字は初期設定直後なので送信バッファは空のはずですからいきなり送信できます(40行)。
TXREGレジスタに文字コードを書き込むだけでそのまま送信されます。
その次からは送信バッファが空になったことを確認してから(50行、70行)、データを送ります(60行、80行)。
送信バッファ(TXREG)が空のときにはPIR1レジスタのbit4(TXIF)がセットされます。
TXIFはリードオンリーです。
TXIFはTXREGに送信データを書き込むとクリアされます。
PIR1レジスタは[第73回]で説明しました。
先に右側のスレーブ送信プログラムを実行しました。
まだ左側、マスターの受信プログラムは実行していないのにいきなり’41’’42’の2文字分の文字コードが表示されました。
最初は、あれ?と思ったのですがすぐに「そういうことか」と納得しました。
ふつうは送信バッファTXREGレジスタに送信データを書くとそれはすぐに送信シフトレジスタTSRに送られ、マスターからクロックが出力されればそこからシフト出力されます。
しかしまだマスタープログラムは実行されていませんからクロックは出力されていません。
そこで最初のデータ’41’はTSRの中で待たされることになります。
このときTXREGは空になりますから次のデータ’42’がTXREGに書き込まれてそこで待たされることになります。
そこまで納得できましたから、左側のマスター送信プログラムを実行しました。
ここで想定外のことが起こりました。右側、スレーブの側では最後の’43’まで送信した「はず」なのに右側のマスター受信側では’41’’42’は受信されましたが’43’は受信されずに’FF’が表示されました。
何かがおかしいです。
何が起きたのか確認できないまま、とにかくもう一度右側のスレーブ送信プログラムを実行してみました。
すると今度はまだマスター側のプログラムを実行していないのに’41’〜’43’までが表示されてしまいました。
えっ?ということで続いてマスター側を実行したところ3文字とも’FF’になってしまいました。
これはおかしいです。
PIR1の値を確認してみると’00’ですから新たな受信はありません。
次にRCSTAレジスタを確認してみたところ’92’が表示されました。
RCSTAレジスタのbit1はOERR(オーバーランエラー)です。
スレーブはちゃんと送っているはずなのにマスターはそれを受け取っていなくて、しかもオーバーランエラーだなんて一体どういうことでしょう?
そもそもマスター側のプログラムはまだ2度目を実行していない段階でスレーブ側が3文字分全部を送信できてしまったのがおかしい。
それじゃまるでクロックが常時出力されているみたいじゃありませんか???
そこのところが気になったのでCPLDロジアナをつないでみましたら。
まさかのまさかでありました。
確かに。
クロックはずっと出っ放しでありました。
???
マスター側はオーバーランしているのにクロックだけが出っ放し?
まるで真冬の怪談であります。
次回に続きます。
PIC−USBIO using BASIC[第161回]
2023.1.20upload
前へ
次へ
ホームページトップへ戻る