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


PIC−USBIO using BASIC

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

[第162回]



●PICUSBIO−03(111)EUSART(13)同期モード(6)送受信プログラム(3)マスター受信/スレーブ送信プログラム(2)

前回からの続きです。
前回起きた悩ましい事柄についてよくよく落ち着いて考えてみました。
その結果わかってきたことがあります。
どうやら私は同期マスター受信のオーバーランエラーについて誤解していたようです。
同期マスター受信のオーバーランエラーは[第158回]で書きました。
そのとき引用した原文を下に再掲します。


[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

上から6行目に
The two characters in the FIFO buffer can be read,however,no additional characters will be received until the error is cleared.
と書いてあります。
私はここを「受信できない」と読んだのですですけれど。
しかしどうやら前回の結果やこの文の前にある Previous data in the FIFO will not be overwritten. という文と合わせて考えてみると、ここは「受信できない」のではなくて「受信してもFIFOが一杯なので入れられない」ということのようです。
なぜオーバーランエラーが起きるのか、を考えてみればわかることでした。
どうやら同期マスター受信モードはFIFOの状態に関係なくひたすら受信動作を続ける仕組みのようです(なんてことだ!)。
そうでなければFIFOが一杯になった時点でスレーブに対してクロックを送信するのを止めればオーバランは起きない理屈です。
オーバーランが起きるということは受信動作は止められないということを意味します。
とそのときは考えたのですが止める方法はありました(後述)。
思考やテストを重ねていくとだんだんと正解に近付いていきます。
しかし正解に至る過程にも必要な事柄があります。
当記事は私自身の備忘録、製作ノートを兼ねていますのでできるだけ試行錯誤の過程もはしょらないで書いていきたいと思っています。
気長なお付き合いをお願いいたします。

わかったことは。
1)同期マスター受信モードは一旦動作するようになると受信のためのクロックは勝手に送信されるようになる。
2)マスター側の受信プログラムが終了してもそのクロックは出力されたままになる。
3)そのクロックは絶え間なく出力されるので1200ボーの場合BASICではとても追いつかない。

このうち2)についてはとりあえずテストに入る前にマスター側でpicout TXSTA,0を実行してEUSARTを停止させておくことにしました(暫定的対策)。
3)についてはこれもとりあえずは1200ボーではなくて300ボーでテストをしてみることにしました。
(なにしろこのままではマスター受信:スレーブ送信のテストができませんから)

前回のテストプログラムのボーレートを300ボーに直しました。

左側のプログラムのみ変更します。
変更するのは40行のSPBRGHと50行のSPBRGの値のみです。
同期モード(SYNC=1)では300ボーの設定値は39999(16進数では$9C3F)です([第153回]参照)。
SPBRGHに上位8ビット$9Cをセットします(40行)。
SPBRGには下位8ビット$3Fをセットします(50行)。

先に右側のスレーブ受信プログラムを実行しました。
41と42を表示してそこで止まっています。
ここまで前回通りです。

次に左側のマスター送信プログラムを実行しました。

あれ?
やっぱり駄目?
そうでした。プログラムを変更する前のテストでEUSARTが動いたままになっていました。
その状態でスレーブ側のプログラムを実行しましたからやっぱりまともに受信できません。
ここは一旦EUSARTを停止させるためにpicout TXSTA,0を実行しなければいけません。

picusb TXSTA,0をダイレクトモードで実行してからスレーブ側のプログラムを実行しました。

この画面では実行順序はわかりませんが先に左側でpicout TXSTA,0を実行してから次に右側のrunを実行しています。
右側(スレーブ側)は41と42を表示して止まりました。

そこで左側(マスター)のプログラムを実行しました。

やった!
今度はうまく受信できました。

が。
もう一度やってみると。

やっぱりエラーになってしまいました。
そうでした。
300ボーでもマスター側は受信を続けているので勝手に’FF’を受信しておそらくオーバーランになってしまっています。
毎回EUSARTを停止させる必要があるようです。

先ほどと同じことをやりました。
先に左側でpicout TXSTA,0を実行してから次に右側のrunを実行しました。
右側(スレーブ側)は41と42を表示して止まりました。

左側(マスター側)のプログラムを実行しました。

今度はうまくいきました。

うまくいきましたけれど。
ぎりぎり合格点です。
このままでは300ボーでしか使えませんし、毎回実行前にEUSARTをリセットする必要があります。
そこのところを何とかしなければなりません。

次回に続きます。

PIC−USBIO using BASIC[第162回]
2023.1.21upload

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