PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第147回]
●PICUSBIO−03(96)I2Cモード(18)スレーブモード(6)送信プログラムの波形/WCOLビット
前回テストしたスレーブ送信の波形をCPLDロジアナで確認しました。
マスターが送出したSTARTコンディションです。
PROBE0はSCL(クロック)です。
PROBE1はSDA(データ)です。
SCLがHのときにSDAをHからLにするとSTARTコンディションになります。
上の波形はちょうどSDAがHからLになったときにスタートしています。
スレーブアドレス+R/Wビットの送信です。
アドレスは’0000000’でR/Wは’1’です。
9ビット目はスレーブが出力した’0’(ACK)です。
スレーブが受信のときはACKはMSSPモジュールによって8ビットの受信が終ると自動的に送信されますから間は空きません。
スレーブからの送信です。
最初のデータ(’01100001’=$61)です。
マスターの受信ではACKはソフトウェアによって出力されますから間か空いてしまいます。
マスターが送出したACKです。
データを受信してから約8msec後です。
これはpicout命令、picin関数の実行に時間がかかるためです([第129回]参照)。
スレーブからの2番目のデータの送信です。
’01100010’($62)です。
マスターが送出したNACKです。
データを受信してから16msec後です。
最後の受信データにはNACK(’1’)を送ります。
STOPコンディションです。
SCLがHのときにSDAをLからHにするとSTOPコンディションになります。
STARTコンディション、STOPコンディションはマスターがSSPCON2レジスタのbit0、bit2を’1’にすることで自動的に発行されます。
●WCOL
いろいろ試すことがあって[第144回]のプログラムを変形したりしてテストをしていましたら突然スレーブが受信しなくなってしまいました。
繰り返し実行してみたのですが全く反応無しの状態です。
最初はスレーブ側のプログラムを疑ったのですが特に問題はないようです。
スレーブ側のレジスタも確認したのですが異常なエラービットが立っているということもありません。
念のためにと思ってマスターのレジスタも確認してみたところWCOLビットが’1’になっていることがわかりました。
WCOLビットはSSPCON1のbit7です。
SSPCON1は[第130回]で説明をしています。
WCOLビットはI2Cラインがデータを出力できる状態になっていないときにSSPBUFにデータの書込みをしたときにセットされます。
それでやっと理解できました。
おそらくあれこれテストをしているうちにスレーブ側がクロックストレッチングを実行してSCLラインを強制的にLレベルにした状態でプログラムをブレークしてしまったのではないかと思われます。
そのことに気が付かないまま再度プログラムを実行したためにWCOLビットが’1’になってしまったのではないかと思います。
WCOLビットはプログラムでクリアしなければなりません。
うーん。
それは30行でクリアできているつもりだったのですが。
もう一度そのときのプログラム画面を下に表示します。
30行でpicout SSPCON1,$28を実行すればビット7は’0’なのでそれでWCOLはクリアできているはずと思ったのですがシリアルポートをイネーブルにするのと同時ではだめのようです(ちょっと疑問なのですが)。
上のプログラムに
15 picout SSPCON1,0
を追加したところ何事もなかったようにスレーブが再び受信できるようになりました。
マスター側は普通に送信したつもりだったのですがWCOLビットが’1’になっていたため実際には何も送信しない状態になっていたというのがことの真相だったようです。
実際のプログラムでは送信、受信の都度各フラグをチェックするべきなのですがそうするとテストプログラム(サンプルプログラム)が複雑なものになってしまいます。
できるだけ簡単なプログラムにするように考えた結果そういうところはかなり省いてあります。
今回はそれが裏目に出てしまいました。
PIC−USBIO using BASIC[第147回]
2023.1.5upload
前へ
次へ
ホームページトップへ戻る