PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第163回]
●PICUSBIO−03(112)EUSART(14)同期モード(7)送受信プログラム(4)マスター受信/スレーブ送信プログラム(3)
前回は一応マスター受信:スレーブ送信プログラムが動作するようになりました。
しかし満足がいく出来ではありません。
まだ問題点は残ったままです。
1)一旦マスター側の受信プログラムを実行するとその後はクロックが出力されたままになるので多分そこでオーバーランエラーになってしまう。
それをクリアするには毎回EUSARTをリセットしなければならない。
2)300ボーでしか使えない。
おおそうか!
1)と2)を同時にクリアする対策を思いつきました。
やっぱりとことん考えてみるべきです。
途中で諦めてしまってはいけません。
問題は同期マスター受信の場合受信が「連続して」行なわれてしまうからいけないのでした。
メインプログラムが制御して1文字ずつ受信できれば問題は解決します。
そんな都合の良いことができるのか?
そう。
そんな都合の良いことができるのでした。
RCSTAのbit5(SREN)をセット(同時にbit4のCRENをクリア)すればよかったのでした([第158回]参照)。
当初Data Sheetのその部分を読んだときにはおかしな機能だなあと思ったのでしたがこういう使い道があったのでした。
今までのプログラムのようにCRENをセットすると、クロックパルスが連続して出力されます(clocks are continuously generated)。
CRENをクリアしてSRENをセットするとクロックパルスは1文字分だけ(single character)出力されます。
マスター側のプログラムをそのように変更しました。
80行のRCSTAの設定のところを$90から$A0に変更しました(bit5=1、bit4=0)。
これなら1200ボーでもいけるはず、と考えてSPBRGH=$27、SPBRG=$0Fに直しました(40行、50行)
SRENビットは1文字を受信するとクリアされてしまいます。
ですから受信する前に毎回SRENビット(RCSTAのbit5)をセットしなければなりません(105行、125行)。
今までと同様、先に右側(スレーブ側)の送信プログラムを実行しました。
次に左側のマスター受信プログラムを実行しました。
うまくいきました。
念のためもう一度。
スレーブ送信プログラムを実行しました。
マスター受信プログラムを実行しました。
あれ?
受信エラー???
繰り返し実行してみましたが結果は同じです。
世の中というものはなかなかに思うようにはなってくれないものであります
一体何がどうなっているのか確認してみなければなりません。
ここはCPLDロジアナの出番です。
PROBE0がクロックラインでPROBE1がデータラインです。
マスター受信プログラムがスタートしてEUSARTが所定の設定によって動き出すまではクロックは出力されていません。
最初のデータ(’41’)の受信です。
あれ?
1ビットずれているような?
10000010(下位ビットから送信されますから、逆に読むと01000001です)のはずが00000100(逆に読むと00100000)のように見えます。
マスター側はこれを’20’として受信してしまったようです。
’42’の送信です。
スレーブは1つ前のクロックで最下位ビットを送信しているようです。
マスター側はそれを10000101(逆に読むと10100001)、つまり’A1’として受信してしまったようです。
’43’の送信です。
ここでもスレーブは1つ前のクロックで最下位ビットを送信しているようです。
マスター側はそれを10000101(逆に読むと10100001)、つまり’A1’として受信してしまったようです。
現象は確認できました。
なぜこのようなズレが発生してしまったのでしょうか?
今度はその原因と対策を考えなければなりません。
なかなかに悩ましいことです。
次回に続きます。
PIC−USBIO using BASIC[第163回]
2023.1.22upload
前へ
次へ
ホームページトップへ戻る