1wireデジタル温度センサーをPICで制御する


入力装置: 1wireデジタル温度センサー DS18B20+  ‐55℃から+125℃
出力装置: 超小型LCDキャラクタディスプレイモジュール
演算装置: PIC16F88

ポイント:

ハード設計
【デジタル温度センサー DS18B20+】
データの送受信はRA1で行う
パラサイト(p5図4)で使用しCONVERTT時の電流補充(p5 1.5mA)はRA2より供給


【超小型LCDキャラクタディスプレイモジュール】

【電源sw、電源ランプ】上下の電源ラインを接続する

【完成例】

ソフト設計:もちろん全部自分で設計してもOK
               MPLAB IDEでビルド済みのデータはこちら

【LCD関連】今回は作成済を使用する。 ビルド済みデータ内の(lcd_rb_h.cとlcd.h)参照

メインフローを考える

DS18B20のマニュアルp12図11ROMコマンド・フローチャートとp13図12機能コマンド・フローチャートを参考に以下の条件で検討。
条件:①DSは1個のみ②分解能はデフォルトの12bit(p3)③データの読込み(READ SCRATCHPAD)では温度データ(Byte0,1)を読む(p11、p7図7)
図11と図12 流れを色鉛筆などでなぞってみる。


2.温度測定の流れ
①温度センサーのリセット                         何度も使うので関数w1inisub()とでもしよう
②スキップROMコマンドの実行                  p10スキップROMコマンド値0xccをDSに書込む
                                                            関数w1sendbyte()としよう
③温度データ変換指示コマンドの実行          0x44の書込み、p5変換中の電流1.5mA確保
④変換時間                                             p7表2  750ms以上なので約1秒に
⑤変換中の電流1.5mAを元に戻す
⑥温度センサーのリセット                           図12最下部図11に戻ってください
⑦スキップROMコマンドの実行
⑧リードスクラッチコマンドの実行              p11 READ SCRATCHPAD 0xbeの書き込み
⑨Byte0,1を読み込む                                関数w1readbyte()としよう
⑩温度センサーのリセット                           p11 Byte2~読込まずに読込み終了
⑪データから符号・温度計算                       関数keisansub()としよう

LCDへの表示関数lcdsub()は作成ずみ

3.関数(サブルーチン)を考える
3-1.温度センサーのリセット
p14図13初期化のタイミング参照

この図の意味:

実際の記述例:
w1inisub()                                       //関数の名前、後ろに;は要らない
{
TRISA1 = 0;                                    //RA1を出力に
RA1=1;                                            //RA1を1に
RA1=0;                                            //RA1を0に
__delay_us(500);                             // 480us以上LOWを維持
TRISA1 = 1;                                    //RA1を入力に
__delay_us(100);                             //60us>でDSのLOWをチェック
__delay_us(400);                             // 100+400=480us以上待機、まとめて500usでも可 
} 

3-2.読み込み・書き込みも同様
書き込みは例:スキップROM 0xccをDSに送信する

読込みの考え方
温度データはp7図7のByte0とByte1に格納されp10のREAD SCRATCHPADの説明によりByte0の下位bitから始まりByte8まで続くがリセットを出すことにより終了させることができる。
そこで

1bitの読込み:
図14に従い読込みbit15に代入する
①値が1ならbit15のみを1に                                    temp |= 0x8000;
②値が0ならbit15のみを0に                                    temp &= ~0x8000;


3-3.計算
p4表1のように温度が-の時には補数で表示される。具体的にはデジタル出力上位にbit11からbit15が1で出力される。
①デジタル出力が負か正かを調べる                            if (temp>0x8000) 少なくともbit15は1
②負なら符号判定変数に値を変更                                fugou=1;
③負ならデジタル出力値を補数から戻す                     temp=(~temp)+1; 初級シスアド講座 10進数と2進数の相互変換参照
④整数部計算用変数thにデジタル出力値セット         th=temp;
⑤整数部bit4~bit10以外を0に                                 th &= ~0xf80f;
⑥thの値を温度に換算する                                         th=th/16; p4表1のデジタル出力値と温度を比較
⑦小数部計算用変数tllにデジタル出力値セット         tll=temp;
⑧小数部bit0~bit3以外を0に                                   tll &= ~0xfff0;
⑨小数点部の2桁を整数化し温度に                            tll=tll*100/16;

プログラムが正常に動いたら16進数や2進数配置など色々な形式でLCDに
表示してみよう。

参考:MPLAB IDE 8.73a  書き込 PicKit3
・Project Wizard
Device画面

Toolsuite

Add existin files  maincとlcd_rb_h.cとlcd.hを追加する。

完了後の画面

Picへの書き込みPicKit3を選択し電源を設定し書込む。

以上