PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第160回]
●PICUSBIO−03(109)EUSART(11)同期モード(4)送受信プログラム(1)マスター送信/スレーブ受信プログラム
[第154回]で非同期通信の送受信プログラムを作ってテストを行ないました。
今回は同じことを同期通信で行ないます。
非同期通信はマスターとスレーブの区別がなく全二重(双方向)通信でしたから送信プログラムと受信プログラムはそれぞれ同じものを使うことができました。
一方今回の同期通信はマスターとスレーブの別があってマスターとスレーブの間で通信を行ないます。
マスターの送信プログラムとスレーブの送信プログラムは異なります。
またマスターの受信プログラムとスレーブの受信プログラムも異なります。
今回はマスターが送信してスレーブがそれを受信するプログラムを作ってテストをします。
下が接続図です。
マスターとスレーブの別があってクロックラインとデータラインによる半二重通信ということから非同期通信よりもI2C通信のプログラムのほうが近いかもしれません([第144回]参照)。
実際に今回のプログラムの作成にあたってはI2C通信のテストのために作ったプログラムを参考にするかたちで作成しました。
下がそのようにして作成したテストプログラムです。
左側の画面が送信側(マスター)で右側の画面が受信側(スレーブ)です。
左側のPICUSBIO−03(マスター)からデータを送信してそれを右側のPICUSBIO−03(スレーブ)で受信します。
まずは左側のプログラム(マスター送信プログラム)について簡単に説明します。
最初にPORTBを入力に設定します(10行)。
次にボーレートを決定します。
非同期通信のテストの結果1200ボーでもなんとか通信できましたので今回も1200ボーでテストを行ないます。
ボーレートについては[第153回]で説明しました。
そこで説明した表は2つありますが同期通信で使えるのは下の表のみです(SYNC=1、BRG16=1)。
SPBRGH:SPBRGに設定する値は9999です。
16進数に直すと$270Fになります。
SPBRGHには上位8ビットをセットします(20行)。
SPBRGには下位8ビットをセットします(30行)。
次にBAUDCONレジスタをセットします(40行)。
BAUDCONレジスタも[第153回]で説明しました。
bit3(BRG16)のみ’1’にしますから$08です。
その次にTXSTAレジスタをセットします(50行)。
TXSTAレジスタとRCSTAレジスタは[第150回]で説明しました。
TXSTAには$B0をセットします。
bit7(CSRC=1)、bit6(TX9)=0、bit5(TXEN)=1、bit4(SYNC)=1です。
最後にRCSTAレジスタに$80をセットします(60行)。
bit7(SPEN)=1、bit6(RX9)=0、bit5(SREN)=0、bit4(CREN)=0です。
ここまでで初期設定は終わりです。
テストデータとして3文字を送信します。
’A’($41)、’B’($42)、’C’($43)を送ります。
最初の文字は初期設定直後なので送信バッファは空のはずですからいきなり送信できます(70行)。
TXREGレジスタに文字コードを書き込むだけでそのまま送信されます。
その次からは送信バッファが空になったことを確認してから(80行、100行)、データを送ります(90行、110行)。
送信バッファ(TXREG)が空のときにはPIR1レジスタのbit4(TXIF)がセットされます。
TXIFはリードオンリーです。
TXIFはTXREGに送信データを書き込むとクリアされます。
PIR1レジスタは[第73回]で説明しました。
右側、受信側のプログラム(スレーブ受信プログラム)の説明です。
プログラムの先頭でRCSTAをクリアしています(10行)。
フレーミングエラーやオーバーランエラーが発生したときのことを考えてそれらをクリアするためにRCSTAをクリアしています。
20行は確実にクリアしたことを確認するためのprint文です。
最初にPORTBを入力に設定します(30行)。
スレーブはマスターが送信するクロックを利用しますからボーレートの設定は不要です。
40行でTXSTAに$10を設定します。
bit7(CSRC=0)、bit6(TX9)=0、bit5(TXEN)=0、bit4(SYNC)=1です。
50行でRCSTAに$90を設定します。
bit7(SPEN)=1、bit6(RX9)=0、bit5(SREN)=0、bit4(CREN)=1です。
ここまでで初期設定は終わりです。
受信バッファ(RCREG)に受信データがあるときにPIR1レジスタのbit5(RCIF)がセットされます。
RCIFはリードオンリーです。
RCIFはRCREGの受信データを読むとクリアされます。
RCIFがセットされていたら(60行、80行、100行)、RCREGを読みます(70行、90行、110行)。
先に右側のスレーブ受信プログラムを実行しました。
次に左側のマスター送信プログラムを実行しました。
とりあえずは受信できたのですがデータがずれてしまいました。
1ビットずれているようです。
もう一度実行したところ今度は正しく受信できました。
このときはたまたま何かの不具合でもあってこういうことがおきたのだろうと考えてそれ以上深く考えなかったのですが後になってこの問題が確定的に発生することによって原因を追求しなければならないことになりました。
それについては後日書くことにいたします。
下はCPLDロジアナで記録した波形です(正しく受信できたときの波形です)。
PROBE0はTX/CKです。
PROBE1はRX/DTです。
同期通信はスタートビット、ストップビットなしでデータビットのみ送ります。
最下位ビットから先に送ります。
データビットはクロックの立ち上がりに合わせて送出されます。
上の波形は最初のデータ’41’(01000001)ですが最下位ビットから送出されますからビット並びは逆の100000010になります。
2番目のデータ’42’です。
01000010ですが波形はそれとは逆になります。
今回のデータは逆でも同じ並びになっています。
最後のデータ’43’です。
01000011ですが波形はそれとは逆の11000010になります。
PIC−USBIO using BASIC[第160回]
2023.1.19upload
前へ
次へ
ホームページトップへ戻る