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


PIC−USBIO using BASIC

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

[第154回]



●PICUSBIO−03(103)EUSART(5)非同期モード(4)送受信プログラム

今回は非同期モードの送信プログラムと受信プログラムを作成して実際にそのプログラムを使って通信のテストをします。
その方法としてはPICUSBIO−03を2台使って一方から送信したデータをもう一方が受信します(下図)。


PICUSBIO−03を2台接続して送受信を行なうというテストはSPI通信で行いました([第127回]
またICモードでも行ないました([第144回])。
いずれも一方がマスターでもう一方がスレーブというように通信を行なう2台は別の役割を担います。
そしてマスターが送出するクロックに合わせてデータを送信します。
それに対して今回の非同期通信ではクロックは出力しません。
それが大きな特徴です。
送信側と受信側でそれぞれ内蔵するボーレートジェネレータで同じボーレートのクロックを使って送信し受信します。
そのままだとクロックは同じでも送信側と受信側の同期をとることができません。
その同期をとるために1文字ごとにスタートビットとストップビットでデータをはさんで送信します。
クロック信号を送信しないため送信側と受信側は対等でどちらがマスターでどちらがスレーブというような区別はありません。
上の図のようにそれぞれの送信出力と受信入力を相手側の受信入力と送信出力ラインにクロスするように接続します。
そして信号レベルを合わせるために両方のGNDを接続します。
RS232Cは送信と受信を直結しないで間に電圧変換回路を入れて通信ラインを±12V程度の電圧に変換して送受信を行ないます。
ここではRS232Cの動作を確認することが目的ではなくてそのもとになっている非同期通信の動作を確認することが目的ですから上図のように送信と受信はそのまま直接接続します。

下は作成したテストプログラムです。

左側の画面が送信側で右側の画面が受信側です。
とりあえずは左側のPICUSBIO−03からデータを送信してそれを右側のPICUSBIO−03で受信するテストを行ないますが初期設定はどちらもそのままで右側から送信して左側で受信することもできます。
また全二重通信ですからプログラムをうまく作れば送信と受信を同時に行なうこともできます。
全二重とは電話の通話のように送信と受信を同時に行なうことができる通信方式です。
これに対して半二重とは同時には送信か受信の一方しか通信できない方式です。
右側はプログラムの先頭でRCSTAをクリアしています(10行)。
いろいろテストをしたのでフレーミングエラーやオーバーランエラーが発生してしまいました。
それらをクリアするためにRCSTAをクリアしています。
20行は確実にクリアしたことを確認するためのprint文です。
その次の行からpicout RCSTA,$90の行までが初期設定で左右で行番号は異なっていますが同じことをしています。
左側のプログラムで簡単に説明します。
最初にPORTBを入力に設定します(10行)。
次にボーレートを決定します。
PICUSBIO用のBASICインタプリタのPICOUT命令、PICIN関数は実行に時間がかかるのでボーレートが高い通信では受信側がオーバーフローしてしまう可能性があります。
そうしないための工夫が送信側に必要になるのですが今回はできるだけ簡単なサンプルプログラムにしたいと思いますのでうんとゆっくりしたボーレートでテストを行ないます。
ボーレートについては前回説明しました。
そこで説明した表のなかで一番低いボーレートは300ボーです。
ボーレートの表は2つあります。
どちらでも使えますが今回は上側の表を使います(SYNC=0、BRGH=0、BRG16=1)。
SPBRGH:SPBRGに設定する値は9999です。
16進数に直すと$270Fになります。
SPBRGHには上位8ビットをセットします(20行)。
SPBRGには下位8ビットをセットします(30行)。
次にBAUDCONレジスタをセットします(40行)。
BAUDCONレジスタは前回説明しました。
bit3(BRG16)のみ’1’にしますから$08です。
その次にTXSTAレジスタをセットします(50行)。
TXSTAレジスタとRCSTAレジスタは[第150回]で説明しました。
TXSTAには$20をセットします。
bit6(TX9)=0、bit5(TXEN)=1、bit4(SYNC)=0、bit2(BRGH)=0です。
最後にRCSTAレジスタに$90をセットします(60行)。
bit7(SPEN)=1、bit6(RX9)=0、bit4(CREN)=1です。
ここまでで初期設定は終わりです。
テストデータとして3文字を送信します。
’A’($41)、’B’($42)、’C’($43)を送ります。
最初の文字は初期設定直後なので送信バッファは空のはずですからいきなり送信できます(70行)。
TXREGレジスタに文字コードを書き込むだけでそのまま送信されます。
その次からは送信バッファが空になったことを確認してから(80行、100行)、データを送ります(90行、110行)。
送信バッファ(TXREG)が空のときにはPIR1レジスタのbit4(TXIF)がセットされます。
TXIFはリードオンリーです。
TXIFはTXREGに送信データを書き込むとクリアされます。
PIR1レジスタは[第73回]で説明しました。
120行から後ろはテストのためのPRINT文です。
本来は不要です。
この部分の説明は後でします。

受信側のプログラムの説明です。
受信バッファ(RCREG)に受信データがあるときにPIR1レジスタのbit5(RCIF)がセットされます。
RCIFはリードオンリーです。
RCIFはRCREGの受信データを読むとクリアされます。
RCIFがセットされていたら(90行、110行、130行)、RCREGを読みます(100行、120行、140行)。

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

最初に受信側を実行しました。

次に送信側を実行しました。

左側(送信側)が送った3文字のデータが右側(受信側)で受信されました。
左側の120行から後ろのプログラムの意味です。
すべてTXSTAの値を表示しています。
プログラムを実行すると最初は’20’が表示され途中から’22’が表示されています。
途中からbit1が’1’になっていることがわかります。
TXSTAレジスタのbit1はTRMTです。
TXSTAレジスタは[第150回]で説明しました。
TRMTビットは送信シフトレジスタ(TSR)が完全に空になったときにセットされます。
TRMTビットはリードオンリーです。
TRMTビットはTSRにデータが残っている間クリアされています。
最後にTXREGに送信データを書き込んだ後、7回’20’が読み出されています。
7回PICINが実行される間TSRに送信データがあったことを示しています。
300ボーは300ビット/秒の送信速度です。
1文字の送信は前後にスタートビットとストップビットが加わりますから10ビットを送信することになります。
すると1文字を送信するには1/30秒≒33msecかかることになります。
PICIN関数の実行時間は通常は6〜8msecです。
6msecだとすると6X7=42msec、8msecでは56msecですからちょっと送信に時間がかかっているように思えます。
これは次のように考えられます。
一つ前のデータ(’B’)がTXREGからTSR(送信シフトレジスタ)に送られるとすぐにTXIFがセットされます(100行)。
そこで次のデータ(’C’)をTXREGに書き込みますが(110行)このときはまだ’B’の送信の途中です。
そこからTSRが完全に空になってTRMTビットがセットされるまでには最大で60msec以上かかることになります。

CPLDロジアナでTX−RXラインをモニタしました。

PROBE0が送受信データです。
300ボーの1ビットは1/300秒≒3.3msecです。
スタートビットは’0’でストップビットは’1’です。
8ビットのデータは最下位ビットから送られます。
最初のデータは
0−10000010−1($41)最初はスタートビット’0’、最後はストップビット’1’です。
続いて
0−01000010−1($42)
最後は
0−11000010−1($43)
です。

2番目のデータ(’B’、$42)のスタートビットは34msecあたりにあります。
3番目のデータ(’C’、$43)のストップビットの終わりはちょうど100msecのあたりです。
するとその間の時間は66msecですからさきほどの計算と一致します。

PIC−USBIO using BASIC[第154回]
2023.1.13upload

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