おもちゃ、家電、もろもろの修理の足跡と備忘録

色々と忘れるので、趣味のメモ

電圧・電流・電力計にシリアル出力をつける(V2.0)

2021-02-13 13:37:42 | その他工作

前の備忘録に、電圧・電流計の数値をシリアル出力したくなる、と書きました。
で、やってみました。

・PICは16F88、シリアル通信用の機能がある
・一応、回路図には将来用として、Serial-OUTのピンを取ってある
で、あとはソフトを作成すればよいか、と思っていました。

 今回、出力だけなので、TXだけ活かせると思って、Serial-OUT(pin11)を確保していましたが、動かすとLCDに何も表示されない。色々調べてゆくと、16F88のシリアルの機能を活かす(SPEN: SerialPortENableをON)とSerial-IN(pin8:RX)まで生きちゃうんですね。悪いことにpin8:RXはLCDのDataBusの一本になっていて、LCDに適切なデータが設定できず、結果表示ができなかったようです。
 じゃぁ、信号線の場所を変えるか、と思ったのですが、LCDのライブラリは、RA、RBの連続上か下の4bitを使うようになっていて、RAはアナログ入力系や、Vrefなどを入れるPinがあって、空けられないことがわかって呆然。じゃ、できないじゃん。
 使っているLCDライブラリの制約にPICのハードは適合しないけれど何か手は無いか、と考えて、LCDのライブラリを覗いたら、設定をしてやれば他の信号線に信号を出せそうな感じなので、RB2としてLCD用に使っていたpin8をSerial-INに明け渡して(使わないのでopen)、代わりに空いているpin(今回はRA6:pin15)に変更しました。(以下の回路図参照)


 あとはソフト。こちらは、LCDlib2.cでは、LCDを4bitモードで動かしているので、下から3bit目のデータをRA6に反映させる処理を追加しました。このライブラリは、下位4bitにデータが入っている前提で引き継いで来て、このライブラリの中で、上位4bit/下位4bitのbit shiftをさせる記述があります(#ifdef)ので、その判断の前で、強制的に下から3bit目のデータをRA6に反映させる処理をいれました。その後の、従来からあった連続4bitの書き込み処理はそのままにしてあります。多分16F88の最終段でInとOutの切り替えをしているだろうという仮説?で。やってみたところ、思惑通りの動作をしてくれました。

 そもそもの、PICのSerialの設定は、送信側の設定とStatusのTXSTAと受信側の設定とStatusのRCSTA、ボーレートの係数を設定するSPBRGを設定すれば良いことがわかりましたので、適切なデータを設定します(SourceCode参照)。
// serial initial set   2021/2/11 added
    TXSTA = 0x24;           //Set High Baud rate
    RCSTA = 0x80;           //RX do not use
    SPBRG = 51;             //clock:8MHz, 9600bps, ={8000000/(16*9600)}-1
 今回問題になった、SPENは、受信側のRCSTAの7bit目がそれで、受信はしないから、と適当に設定したのですが、それがいけなかったようです。SPENはSerial通信のENablerなので、これを設定しないと動かないし、動かすと、TXもRXも動いてしまう、ということです。お気をつけください。(通常ペアで使うのでしょうね。片側だけ使う、という使い方のほうが普通じゃない、のだと思います、、、)
 後の変更点は、PICの内蔵クロックを当初1MHzで動かしていましたが、このクロックがシリアルにも使われて、SPBRGの値で設定するのですが、1MHzで計算をすると非常に小さい値になるので誤差が広がるのではと思い、内蔵クロックを8MHzに上げました。(上記のSPBRGは8MHz、HighBaudRateとして設定してあります)

 結果ですが、mVとmAで、そのままカンマで区切って、9600bpsで送信すると、秒10回ほどのVとAのペアのデータが出てきました。(写真参照)
まぁ、私の用途には十分なデータなので、とりあえず、これで良いかなと思います。デリミタはLineFeedが良いのか、CaridgeReternが良いのかよくわかりませんが、CRだと同じ場所で書いてくれるので、そうしてあります。

 PICのSerialからは、TTL?レベルの信号が出てきますので、このままPCのRS-232Cに食わせても動きません。私は、TTL/RS-232Cというか、TTL/USBの変換ケーブル(大陸からで数百円位)を持っていたので、それで接続、動作確認をしました。(以前購入した簡易オシロのデータダウンロードとかにも使っています)

 写真は、PICkit3を接続してSoftwareをダウンロード、計測する電源からこの装置を経由して、以前作った電子負荷装置へ接続、Serialは、作成した基板からTTL/USB変換ケーブルを経由して、PCのSerial通信用モニタソフトで実際のデータをチェック、という系になっています。

 これで、自動計測ができるようになったので、ようやくバッテリーの検査?ができるようになりました。
 ソフトウェアの詳細は、長くなるので記載しません。もし、ご所望の方がいらっしゃいましたら、ご連絡ください。
→BUGがあったので、こちらで修正しています。(2021/2/16追記)

環境は、MPLAB-X IDE v5.35 XC8/PICkit3 C99 PIC16F88 です。VC2.0.x


最新の画像もっと見る

コメントを投稿