MENU
カタログクリップ
本ページはプロモーションを含みます。

LPS331使用 高精度大気圧モジュールのI2CでのONE_SHOT測定テスト

2018 11/01
広告
電子工作
2014年1月29日2018年11月1日

I2C通信chkに引き続き、大気圧ONE_SHOT測定のテストをしました。装置をactiveにして、one_shotの命令をし、測定が終わったかをSTATUS_REGで確認し、終わっていたらば大気圧を読みに行く、という流れです。
こちらも無事読み取りができました。
f:id:beiz23:20140129000655j:image:w640

= 0x3f32b6 / 4096 とグーグル先生に聞いたら、1011.17 mbarだそうです。

コードはこちら。エラー処理はしてません。


#include <avr/io.h>
#include <util/delay.h>
#include <util/twi.h>


#define SLA_R  0b10111001
#define SLA_W  0b10111000

#define SCL PORTC5
#define SDA PORTC4

#define WHO_AM_I 0x0f
#define CTRL_REG1 0x20
#define PD 7 // power down when 0
#define BDU 2 // block data update

#define CTRL_REG2 0x21
#define ONE_SHOT 0

#define CTRL_REG3 0x22
#define STATUS_REG 0x27
#define P_DA 1
#define T_DA 0

#define PRESS_OUT 0x28
#define TEMP_OUT 0x2b


int32_t read(uint8_t reg_add, uint8_t bits);
int8_t write_one(uint8_t reg_add, uint8_t dat);


int main(void){
  uint32_t p;
  PORTC = (1 << SCL) | (1 << SDA);//pull up

  // 1e6/(16+2*TWBR*TWPS) < 100 kHz = 1e5
  //TWSR |= (0 << TWPS1) | (0 << TWPS0); //prescaler 1
  //TWBR = 0x00;// TWBR = 0
  //TWAR = //address & general call

  while(1){
    write_one(CTRL_REG1, ((1 << PD) | (1 << BDU))); // wake up
    //read_one(0x0f);
    write_one(CTRL_REG2, (1 << ONE_SHOT)); //set one shot meas
    while(!(read(STATUS_REG, 1) & (1 << P_DA))); //wait meas
    p = read(PRESS_OUT, 3); //read pout
    _delay_ms(5000);
  }
}

int32_t read(uint8_t reg_add, uint8_t bits){
  int32_t res = 0;
  if(bits > 3){ return -1;}

  // ST send start bit
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // | (1 << TWIE);
  while (!(TWCR & (1 << TWINT))); // wait
  if((TWSR & 0xf8) != TW_START){ // chk status
    return -1; //error
  }

  // SLA+W
  TWDR = SLA_W;
  TWCR = (1 << TWINT) | (1 << TWEN);//return
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MT_SLA_ACK){ //chk
    return -1;//error
  }

  // SUB: multiread? + register add
  TWDR = reg_add + (((bits > 1)?1:0) << 7); //single read MSB = 0;
  TWCR = (1 << TWINT) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MT_DATA_ACK){ //chk
    return -1;//error
  }

  // SR: restart
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT))); // wait
  if((TWSR & 0xf8) != TW_REP_START){ // chk status
    return -1; //error
  }

  // SLA + R
  TWDR = SLA_R;
  TWCR = (1 << TWINT) | (1 << TWEN);//return
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MR_SLA_ACK){ //chk
    return -1;//error
  }

  // DATA read
  for(uint8_t i = 0; i < bits; i++){
    if(i == (bits-1)){ //is next data last?
      TWCR = (1 << TWINT) | (1 << TWEN) | (0 << TWEA); //NACK
      while (!(TWCR & (1 << TWINT)));//wait
      if((TWSR & 0xf8) != TW_MR_DATA_NACK){ //chk
        return -1;//error
      }
    }else{
      TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); //ACK
      while (!(TWCR & (1 << TWINT)));//wait
      if((TWSR & 0xf8) != TW_MR_DATA_ACK){ //chk
        return -1;//error
      }
    }
    res += (TWDR << 8*i);
  }


  // SP
  TWCR = (1 << TWINT) | (1 << TWSTO)| (1 << TWEN);

  return res;
}


//
// write
//
int8_t write_one(uint8_t reg_add, uint8_t dat){

  // ST send start bit
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // | (1 << TWIE);
  while (!(TWCR & (1 << TWINT))); // wait
  if((TWSR & 0xf8) != TW_START){ // chk status
    return -1; //error
  }

  // SLA+W
  TWDR = SLA_W;
  TWCR = (1 << TWINT) | (1 << TWEN);//return
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MT_SLA_ACK){ //chk
    return -1;//error
  }

  // SUB: multiread? + register add
  TWDR = reg_add + (0 << 7); //single read MSB = 0;
  TWCR = (1 << TWINT) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MT_DATA_ACK){ //chk
    return -1;//error
  }

  // DATA write
  TWDR = dat;
  TWCR = (1 << TWINT) | (1 << TWEN);
  while (!(TWCR & (1 << TWINT)));//wait
  if((TWSR & 0xf8) != TW_MT_DATA_ACK){ //chk
    return -1;//error
  }

  // SP
  TWCR = (1 << TWINT) | (1 << TWSTO)| (1 << TWEN);

  return 0;
}
電子工作
highlightjs

関連記事

  • 購入前に知っておきたいUSB接続・PC接続型デジタルオシロスコープの利点と欠点。スタンドアロン型との違いは。
    2018年8月9日
  • SWR値はどのくらいまで大丈夫?SWR値から分かる反射波電力の割合。
    2018年7月23日
  • アマチュア無線用SWR計の選び方とダイヤモンド・コメット・ダイワの製品一覧。おすすめは?
    2018年7月23日
  • OWONのデジタルオシロスコープSDS5032Eの基本的な使い方。
    2018年7月10日
  • PCXpresso NXP LPC1769の評価ボード(OM13000)にmbedのバイナリを書き込む方法
    2017年5月13日
  • L, Cを測ることを考える
    2014年8月10日
  • Raspberry piで大気圧と温度を記録してグラフにして他のPCからグラフを見る
    2014年7月26日
  • raspberry pi を使って何かするメモ。
    2014年7月26日
カテゴリー
  • コンピューター
    • gnuplot & eps
    • mac
    • matplotlib
    • wordpress
  • ホーム・家電
    • アイロン
    • オーディオ
    • オーラルケア
      • ジェットウォッシャー
      • 音波振動歯ブラシ
    • カメラ
    • カー用品
    • クリーナー
    • テレビ、レコーダー
    • ドアホン
    • メンズ美容家電
      • ラムダッシュ
    • ルンバ
    • 一覧比較
    • 工具
    • 浄水器
    • 温水洗浄便座
    • 炊飯器
    • 空気清浄機・加除湿機
    • 空調・季節家電
    • 美容家電
      • フェイスケア
      • ヘアケア
      • ボディーケア
    • 血圧計
    • 調理器具
    • 電子レンジ
  • 健康
  • 家事
    • パン
    • 料理
    • 育児
    • 食品
      • おせち
      • コーヒー
  • 書籍
  • 知識
  • 趣味
    • ペン字
    • ロードバイク・クロスバイク
    • 車
    • 鉄道模型
    • 電子工作
サイト内検索
最近の投稿
  • モナークHGとモナークM7の4つの違い。[ニコン双眼鏡]
  • ニコン モナーク M7とM5の4つの違い。[双眼鏡]
  • Speed Wi-Fi DOCK 5G 01の実機使用レビュー。
  • RZ-760、GT-760、ST-760の違い。[ガス缶・CB缶]
  • RZ-730、RZ-730S、RZ-730SBK、RZ-730SWH、ST-Y450の違い。
  • TC-EA35WとTC-E123SBKの違いを比較。[スティッククリーナー]
  1. ホーム
  2. 趣味
  3. 電子工作
  4. LPS331使用 高精度大気圧モジュールのI2CでのONE_SHOT測定テスト
  • ホーム
  • プライバシーポリシー

© カタログクリップ
contact@beiznotes.org

目次