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


PIC−USBIO using BASIC

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

[第137回]



●PICUSBIO−03(86)ICモード(8)マスターモード(7)DS1307受信プログラム

今回はDS1307に書き込んだ日時データを受信モードで読み出してみることにします。
下が作成した受信プログラムです。

Cマスターモードでは受信モードのときも最初にスレーブに対してスレーブアドレスを送るため送信モードにします。
スレーブによってはDS1307のように続いてデータを読み書きするためのレジスタアドレスなどを送信します。
またスレーブ側の装置によってはいろいろなパラメータなども送らなければならないかもしれません。
そのように最初は送信モードにして必要なアドレス/データを送信したあとで受信モードに切り換えてデータを受信します。
プログラムの10行から80行までは最初の送信部分です。
ここは[第135回]の送信プログラムと同じです。
そのときの送信プログラムでは70行でPIR1の値を読んでそれを表示しましたがそれはテストのためにそうしたので必須ではありませんから今回の受信プログラムでは削除しました。
そのために70行から後ろは送信プログラムとは行番号が違ってきますが同じことをやっています。
90行で一旦STOPコンディションにします。
このあと受信モードに切り換えるためです。
100行からが本当の「受信モード」のプログラムです。
100行でSTARTコンディションを出力します。
110行でDS1307のアドレスおよびR/Wビットを送信します。
70行でもDS1307のアドレスおよびR/Wビットを送信しますがそれはDS1307にデータを送信するモードですからR/Wビットは’0’にします。
110行はデータを受信するモードですからR/Wビットは’1’にします。
そのあとはDS1307からデータを受信する部分です。
ここは「基本的に」同じことの繰り返しですからFOR NEXT文を実行します。
実はこのプログラムはそのFOR NEXTのところに間違いがあるのですがこの時点ではこれでよいと思っていました。
130行でSSPCON2に08Hを出力してからSSPBUFを読み込んでその値を表示し、そのあとでSSPCON2に10Hを出力します。
SSPCON2は[第130回]で説明しました。
SSPCON2のbit3はRCEN(受信イネーブル)です。
このビットを1にすると受信が可能になります。
RCENビットはデータの8ビット目の受信の終わりにクリアされるためデータの受信の都度セットする必要があります([第133回])。
SSPCON2のbit4はACKEN(ACKビット出力イネーブル)です。
このビットを1にすると1バイトの受信の終わりの9ビット目のときにACKデータビット(SSPCON2のbit5)の値を送信します。
本来は8ビットのデータがエラーなく受信されたことを確認してからその結果によってACKまたはNACKを送信すべきですがここではそれを簡略化してACKを送信します(ここのところが後で問題になりました)。
最後の150行でSTOPコンディションを出力します。

プログラムを実行しました。

時刻日付データが正しく受信されました。
「めでたしめでたし」のはずだったのですが。
このあと思ってもみなかった事態が発生したのでありました。
その顛末については次回にて。

PIC−USBIO using BASIC[第137回]
2022.12.24upload

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