PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第164回]
●PICUSBIO−03(113)EUSART(15)同期モード(8)送受信プログラム(5)マスター受信/スレーブ送信プログラム(4)
前回からの続きです。
なぜ1ビットずれて受信されてしまうのか?
この現象については[第160回]で書いています。
そのときはマスターが送信でスレーブが受信でしたがそのあとも時々プログラムの動作テストのときに発生しました。
今まではしっかり追及しないままで来てしまいましたが、そこには何かそうなるわけがありそうです。
そこで前回のロジアナ波形を見ながら考えてみました。
すると。
おおそうか!
やっと核心に当たりました。
スレーブ側のプログラムがスタートしたときのクロックラインの状態に問題の原因がありました。
その前に同じ同期通信の動作テストをしていればクロックラインはアイドル=Lのはずです。
スレーブ側のプログラムが起動して、そのあとマスター側の受信プログラムが起動すると30行のpicout TRISB,$FFの実行で一旦クロックラインは入力になってその結果ラインはHになります。
スレーブはこれをクロックの立ち上がりパルスと誤認して最下位ビットを出力してしまいます。
その後にマスター側でEUSART受信モードの設定が完了するとまずはクロックラインがアイドル=Lになったあと正規のクロックを出力することになると考えられます。
そのために送信側と受信側でデータのズレが起きてしまうと考えられます。
こういう問題は今回の同期通信に限らず汎用のI/Oポートなどでも最初の初期設定のときとか入力と出力を切り替える設定を行なうときなどに出力ラインが本来想定していないクロックパルスを出してしまう結果となってシステムが誤動作してしまうことがよくあります。
そういうための対策はとくに最初の電源投入時などはなかなかにむつかしいものがあります。
この問題をクリアするのはちょいとホネだと思ったのですが。
問題を整理してみることで解決策がみつかりました。
それとこのところData Sheetをいやになるほど読んでいたことも役に立ちました。
問題はスレーブ側がスタートしたときにクロックラインがLだと発生します。
マスター側のプログラムが起動してTRISBに$FFが設定されることでクロックラインがHになります。
するとそれをスレーブはクロックの立ち上がりエッジだと誤認してしまいます。
最初からクロックラインがHならばこの問題は起きません。
データのズレが起きたり起きなかったりしたのはそこに理由があったと考えられます。
それならば先にマスター側のプログラムを実行してクロックラインを正規の状態にしてからそこでスレーブ側のプログラムが実行されるまでダミーループを作るなどして待つか一旦ブレイクしてスレーブが起動してからGOTO文で続きを実行するという方法もないわけではありません。
しかしそれはいかにももたもたした方法です。
できればもう少しスマートに行きたいものです。
スマートな解決策はData Sheetの中にありました。
クロックラインのロジックを負論理にすれば解決するはずです。
その場合にはデータはクロックの下がりエッジで出力されます。
クロックラインを負論理にするとクロックのアイドル状態はHになります。
負論理の場合、クロックはアイドルの状態(H)からLになることでスタートするのですが、クロック出力が開始される以前のTRISBがセットされてI/Oポートが入力になった時点からクロックラインはHになっていますからそこからクロックが出力されるまでの間はずっとシームレスにH状態になるはずです。
付言するとPICUSBIO−03のTX/CK端子は起動時はHレベルなのでそのときからクロックが出力される時までの間はずっとHレベルのままだということが言えます。
そして同期マスター受信プログラムがもしクロックを負論理に設定した状態で起動されればプログラムを終了したあとはクロックラインがアイドル(H)になりますから次にプログラムが実行されたときも最初にクロックが出力されるまでの間はやっぱりシームレスにHになっているはずです。
仮に何らかの理由でマスタープログラムが実行される前のクロックラインがLだったとしてもプログラムが実行されることでクロックラインはまずLからHになります。
正論理ならばスレーブはそのとき最初のビットデータを出力してしまいますがスレーブも負論理に設定されていればデータを送出するのはクロックの下がりエッジになりますからデータは送出されません。
TX/CK出力はBAUDCONレジスタのbit4(CKTXP)を’1’にすることで負論理になります([第157回]参照)。
マスタープログラムとスレーブプログラムのTX/CKのクロック極性を負論理に設定しました。
左側(マスター)の60行の設定値を$18(bit4=1)にしました。
右側(スレーブ)はクロックの設定は本来は不要だったのですが今回はクロックを負論理にするために15行を追加しました。
今までと同様に右側のスレーブ側から先にプログラムを実行しました。
それから左側のマスター受信プログラムを実行しました。
ここまではうまくいきました。
念のためもう一度実行してみます。
先に右のスレーブ側から実行しました。
それから左側のマスタープログラムを実行しました。
うまく受信できました。
下はこのときのCPLDロジアナの画像です。
データはクロックの下がりエッジで変化しています。
’10000010’なので逆にすると’01000001’(’41’)になります。
2番目のデータです。
’01000010’は逆にしても変わりません。
’42’です。
3番目のデータです。
’11000010’なので逆にすると’01000011’(’43’)になります。
やっとこれで。
一件落着です。
PIC−USBIO using BASIC[第164回]
2023.1.23upload
前へ
次へ
ホームページトップへ戻る