/******************************************************************************* * skLPS25H - 大気圧センサLPS25H(I2C接続)用関数ライブラリ * * PressureInit - デバイスの初期化を行う処理 * PressureReceive - デバイスから指定個数のデータを受信する処理 * PressureSend - デバイスに指定個数のデータを送信する処理 * PressurePD - デバイスの"パワーダウン"と"動作中"を切り替える処理 * PressureRead - 圧力・温度を読込み気圧値を計算する処理 * AltitudeCalc - 気圧値(hPa)から高度を計算する処理 * * ============================================================================ * VERSION DATE BY CHANGE/COMMENT * ---------------------------------------------------------------------------- * 1.00 2015-01-21 きむ茶工房 Create * ============================================================================ * MPLAB IDE(V8.63) MPLAB X(v2.15) * MPLAB(R) XC8 C Compiler Version 1.00/1.32 * ============================================================================ * * PIC24F用ライブラリに改修 * 2016/12/27 N.Ishii *******************************************************************************/ #include #include #include "skLPS25H_PIC24F.h" #include "skI2C_PIC24F_lib.h" #include "colorlcd_libdsPICVH.h" static int Sensor_adrs ; // デバイスのI2Cアドレスを保存する変数 /******************************************************************************* * ans = PressureInit() * デバイスの初期化を行う処理 * デバイスの動作を確かめる為にデバイスIDのチェックを行います。 * 分解能のモード(内部平均の数)設定は、デフォルトで動作させます。 * 制御レジスタ1は"動作中モード","1Hzの更新速度",Bit0-3=0 で初期化しています * 初期化データを変更する場合は、skLPSxx.hのRES_CONF_DATA/CTRL_REG1_DATAを * 書き換え変更して下さい。 * ans : 0=正常 * 1=デバイスのIDチェックエラー * ============================================================================ * * PIC24F用に改修 * 2016/12/25 N.Ishii *******************************************************************************/ int PressureInit(int id ,int address) { int ans; unsigned char data[2]; Sensor_adrs = address; // デバイスの識別IDをチェックする処理 PressureReceive(WHO_AM_I_ADRS,&data[0],1); // WHO_AM_Iの内容をチェック if (data[0] == id) ans = 0; // IDは一致した else ans = 1; // IDが一致しない // デバイスを初期化する処理 if (ans == 0) { // 圧力分解能のモード設定(圧力=384回 温度=64回 で平均を行う) //data[0] = RES_CONF_DATA; //ans = PressureSend(RES_CONF_ADRS,&data[0],1); // 制御レジスタ1の設定(動作中モード,出力データ速度は1Hz) data[0] = CTRL_REG1_DATA; PressureSend(CTRL_REG1_ADRS,&data[0],1); delay_ms(1); // 確実に設定が終了するのを待つ // FIFOの設定を行う(移動平均を行う) data[0] = CTRL_REG2_DATA; // FIFO ON PressureSend(CTRL_REG2_ADRS,&data[0],1); data[0] = FIFO_CTRL_DATA; // FIFO_MEAN MODE・8 samples PressureSend(FIFO_CTRL_ADRS,&data[0],1); } return ans; } /******************************************************************************* * ans = PressureReceive(reg_adrs,*data,kosu) * デバイスから指定個数のデータを受信する処理 * reg_adrs : 読出すデータのレジスターアドレスを指定する * 連続的に読出す場合は、読出すレジスターの先頭アドレスを指定 * *data : 読出したデータの格納先を指定する * kosu : 読出すデータのバイト数を指定する * ans : 0=正常 1=異常(相手からACKが返ってこない) * ============================================================================ * * PIC24F用に改修 * 2016/12/25 N.Ishii *******************************************************************************/ void PressureReceive(char reg_adrs,unsigned char *data,char kosu) { int i , ack; char sub; if (kosu == 1) sub = reg_adrs; // 単発読み出しモード else sub = reg_adrs | 0x80; // 連続読み出しモード I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(sub); // レジスタアドレスを指定 I2C_rStart(Sensor_adrs,RW_1); // リピート・スタートコンディションを発行する /// 測定開始点トリガ for (i=1 ; i<=kosu ; i++) { if (i==kosu) ack = NOACK; else ack = ACK; *data = I2C_Receive(ack); // 指定個数分読み出す(受信する) data++; } /// 読出し完了トリガ I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * ans = PressureSend(reg_adrs,*data,kosu) * デバイスに指定個数のデータを送信する処理 * reg_adrs : 書出すデータのレジスターアドレスを指定する * 連続的に書出す場合は、書出すレジスターの先頭アドレスを指定 * *data : 書出すデータの格納先を指定する * kosu : 書出すデータのバイト数を指定する * ans : 0=正常 1=異常(相手からACKが返ってこない) * ============================================================================ * * PIC24F用に改修 * 2016/12/27 N.Ishii *******************************************************************************/ void PressureSend(char reg_adrs,unsigned char *data,char kosu) { int i; char sub; if (kosu == 1) sub = reg_adrs; // 単発書き込みモード else sub = reg_adrs | 0x80; // 連続書き込みモード I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(sub); // レジスタアドレスを指定 for (i=0 ; i