PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第140回]
●PICUSBIO−03(89)I2Cモード(11)マスターモード(10)DS1307受信プログラム(4)
前回からの続きです。
DS1307のData SheetにはDS1307からデータを受信する場合には最後のデータを受信したときにはACKではなくてNACKを返すことと書いてありました。
それで受信プログラムをそのように直したところなるほどプログラムを繰り返し実行しても正しく受信できるようになりました。
しかしなんとなくすっきりしないものが残ります。
確かにDS1307のData Sheetにはそのように書いてあります。
しかしPIC18F13K50のData Sheetにはそんなことは書かれていないようです。
ちょいと納得がいかない気持ちです。
実際に受信するときの波形を見てみれば何かがわかるかもしれません。
そこでプログラムを変更したあとのプログラムと変更する前のプログラムを実行してその両方の波形をCPLDロジアナで観測してみました。
すると最後のSTOPコンディションのところの波形に異変がおきていました。
こちらはプログラム変更後の最後のデータ受信部分の波形です。
見えている部分ではクロック数は8クロックで最後の9クロック目がありません。
PICUSBIO用のBASICインタプリタのPICOUT、PICINは実行するのに時間がかかります([第129回]参照)。
NACKは8ビットの受信データをPICIN関数で読んだあとでPICOUT命令でSSPCON2に値をセットすることで送信されますからPICIN+PICOUTの時間がかかります。
約9msec後に9番目のクロックが出力されています。
PROBE0がSCL(クロック)でPROBE1がSDA(データ)です。
NACKは’1’ですから9番目のクロックの前後で’H’になっています。
そしてこちらが’STOP’です。
PIC18F13K50のData Sheetの説明の通りクロックが立ち上がる少し前にSDAが一旦’L’になったあとクロックが立ち上がったあとで’H’になっています。
間違いなくこれはSTOPコンディションです。
さてそれでは変更前のプログラムの波形を見てみます。
最後の受信データのところはさきほどの波形と同じです。
変更前のプログラムではデータの受信後は全てACKを送出しています。
最後のデータの受信後もACKです。
ACKは’0’です。
9番目のクロックのところで’0’(L)を出力しています。
ここで「あれ?」と思いました。
なんだかSDLがずっと’L’のままのように見えます。
うむむむ?
ACK、NACKの送出後はラインは開放されるのじゃなかったか?
ラインを開放するとハイインピーダンスになってプルアップ抵抗のせいで’H’になるはず…。
なんだか「出力」が’L’のままになっているみたいです。
ちょいといやな予感です。
STOPコンディションのはずなのですが。
やっぱり。
SDAはずっと’L’のままでした。
これではSTOPコンディションにはなりません。
これがその後に受信プログラムが正しく実行できなくなってしまう原因のようです。
しかしなぜこんなことがおきてしまうのか?
これはI2Cのルールなのか?
きっとそうに違いない…。
しかししかし。
それならばなぜこのこと(最後のデータの受信後はNACKを送る)がDS1307のData Sheetに明記されているのにPIC18F13K50のData Sheetにはそれらしき記述がないのか?(書いてありました!後の回で説明します)
もっとおかしなことにはこの現象から抜け出すには一旦PICUSBIO−03とDS1307の電源を切って(具体的にはUSBケーブルを外して)BASICも終了したのち再度BASICを起動してUSB接続をしなければならないという点です。
I2Cに関係するレジスタをクリアしてもだめ、割込みフラグをクリアしてもだめ、一度 I2Cモードを無効にしてから再度送信プログラムからやり直しても一旦前回のような状態になってしまうともう正常な通信はできません。
そんなおかしなことってあるのか?
謎はかえって深まるばかりでありました。
このあと私は思い違いをしていたことにやっと気がつくことになります。
しっかり「先入観」に支配されていたのでありました。
次回に続きます。
PIC−USBIO using BASIC[第140回]
2022.12.28upload
前へ
次へ
ホームページトップへ戻る