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


PIC−USBIO using BASIC

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

[第155回]



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

前回は300ボーで送受信のテストを行ないました。
今回は前回と同じことを1200ボーで行なってみます。
高いボーレートになるとそれだけ早く送信が完了するため受信側が遅いと受信が間に合わなくてオーバーフローしてしまう可能性があります。
そうならないようにボーレートが高いときは送信側で送信と次の送信の間にダミーループを入れて適切な送信間隔を保つようにします。
正規のRS232C通信ではRTS/CTSなどの信号線を付加してハードウェアで通信制御を行ないます。
しかしPIC18F13K50の場合にはTX、RX以外のコントロール信号を使う機能はありません。
ですからデータを正しく送受信するためにはソフトウェアで必要な対策をとります。
そのような通信方法を俗に「タレ流し式」などと言います。
BASICプログラムは遅いのですが実際に1文字分の送信/受信を行なう部分はハードウェアが受け持ちますから高いボーレートでも受信側が取りこぼさない程度の間隔で送信する限りは受信エラーになることはありません。
しかし1文字分のボーレートは高くなっても文字と文字との間の送信/受信間隔はBASICプログラムの実行速度に従ってゆっくりとしたものになってしまいますからボーレートを高くしても全体での通信速度が速くなるとは限りません。

下は前回のプログラムのボーレートを1200ボーに変更したプログラムです。

ボーレートについては[第153回]で説明しました。
ボーレートの表は2つあります。
PICUSBIO−03のPIC18F13K50のFoscは48MHzですから表の一番左を使います。
表をよく見ると上側の表の300ボーの設定値が9999(16進数の$270F)で下側の表の1200ボーも同じ9999になっています。
下側の表の1200ボーを使えばSPBRGH:SPBRGの設定値は前回のプログラムのまま利用できます。
すると変更するのはTXSTAのみでよいことになります。
TXSTAのbit2(BRGH)を’1’にします(左側50行、右側40行)。
送信速度が300ボーの4倍になりますからテストのために送信側のプログラムの最後に入れたprint文の行数を減らしました。
そのほかはもとのプログラムのままです。
プログラムの受信側(右側)を先に実行しました。

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

送信側(左側)が送出したデータ41、42、43が受信側(右側)で正しく受信されました。
今回は送信側のプログラムの終わりにいれたTXSTAの値を表示するところは最初から’26’が表示されました。
前回は最初は’20’で途中から’22’になりました。
今回はTXSTAのbit2(BRGH)を’1’にしましたからそこが前回とは異なっています。
TXSTAレジスタのbit1はTRMTです。
TRMTビットは送信シフトレジスタ(TSR)が完全に空になったときにセットされます。
今回のボーレートは1200です。
スタートビットとストップビットを含めた1文字の送信時間は1/120秒(約8.3msec)です。
前回と同じように考えると1回は’24’が表示されてもよいように思われますが今回は最初のpicin(TXSTA)の実行時までに送信が完了したと思われます。

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

PROBE0が送受信データです。
1200ボーの1ビットは1/1200秒≒0.83msecです。
スタートビットは’0’でストップビットは’1’です。
8ビットのデータは最下位ビットから送られます。
最初のデータは
0−10000010−1($41)最初はスタートビット’0’、最後はストップビット’1’です。

次のデータは12msecの少し前から始まっています。

0−01000010−1($42)です。

最後のデータは23.5msecあたりから始まっています。

0−11000010−1($43)
です。
送信が完了するのは32msecのあたりです。

2番目のデータ(’B’)の送信が開始されたのは12msecのあたりですがそのときにTXREGは空になってTXIFがセットされます。
それを100行のところで確認して次のデータ(’C’)をTXREGに書き込む(110行)までには(picin、picoutを実行するので)少なくとも10msecはかかります。
TSRのデータ(’B’)が送出されてTSRが完全に空になるまでに8msecほどしかかかりません。
ということは100行でTXREGが空であることが確認できたときにはすでにTSRも空になっていることになります。
すると次のデータ(’C’)がTXREGに書き込まれるとすぐにTSRに転送されてTXラインに送出されることになります。
’C’のスタートビットは23.5msecあたりから始まっています。
送信が完了するのは8.5msec後です。
そこでTRMTビットがセットされます。
120行でTXSTAを読むのに約8msecかかったとすると多分TRMTビットがセットされた直後の値を読んだと思われます。
1200ボーの場合BASICの実行速度よりもデータの送信速度のほうが速いと考えられます。

ところで今回はボーレートを1200ボーにして送信側は連続でデータを送信したのですがさきほどのプログラムを実行したときの画像では受信側は問題なく正しく受信できています。
受信時に毎回picin(PIR1)を実行していることから考えるとぎりぎりのタイミングかと思われます。
それでもうまく受信できたのはおそらく2文字分の受信FIFOがあるおかげかと考えられます。

PIC−USBIO using BASIC[第155回]
2023.1.14upload

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