ボッシュさんのBMP180 気圧センサで気温のデーターを取得しようとしているのですが、うまくいきません。ご指導お願いします。個人的には下のコードで、パソコンの方でなにか数字がでると思っているのですが、000でした。抵抗値か転送クロックに問題があるように思っています。よろしくお願いいたします。
環境e2 studio Version:5.3.1.002 評価期間の有効期限が切れています。RL78/G10+E2 Lite
周辺機能の設定の転送クロックは100000です。
抵抗は5kΩ位です。
/* Start user code for global. Do not edit comment generated here */char buf[256]="";char data[10]="";unsigned long millisec;void sleep(long i_end_millisecond);void uart(void);/* End user code. Do not edit comment generated here */
最初に戻る前に寄り道をさせて頂きます。イチゴのようなのでi2cをdetectするようなことをしたいです。さっと環境作れないので確認していないのですがコマンドのi2cdetecです。けっこう色々なスレーブを見つれたと思います。
こんなかなと思い作成して見ましたがダメでした。ご指導お願いします。
/* Start user code for global. Do not edit comment generated here */char buf[256]="";char data[10]="";unsigned long millisec;void sleep(long i_end_millisecond);void i2cfind(void);/* End user code. Do not edit comment generated here */
void i2cfind(void){ int ad; MD_STATUS status; for(ad=0;ad<1024;ad++){ buf[0]=0x05; //ENQ? buf[1]=0x00; status=R_IICA0_Master_Send((uint8_t)ad,(uint8_t *)buf, 1,(int8_t)100); sleep(10); if( status==MD_OK ){ sprintf_tiny(data,"%04d OK ",ad); R_UART0_Send((uint8_t*)data,strlen(data)); sleep(15); }else{ sprintf_tiny(data,"%04d NG ",ad); R_UART0_Send((uint8_t*)data,strlen(data)); sleep(15); } if((ad%6)==0){ sprintf_tiny(data,"\n"); R_UART0_Send((uint8_t*)data,strlen(data)); sleep(15); } }}
環境e2 studio Version:5.3.1.002 評価期間の有効期限が切れています。RL78/G10 16ピン+E2 Lite
チョコです。 I2Cバスでは,スレーブアドレスの上位4ビットが0b0000と0b1111は拡張コードとして,通常のI2Cスレーブは 存在しないはずです。通常EEPROM等は0b1010xxxが使われていますし,BMP180は通常の7ビット・アドレスの 最後の0b1110111を使っています。 また,10ビット・アドレスと言うことで,0~1023を指定されようとしていますが,通常の7ビット・アドレスと10 ビット・アドレスはアドレス指定が異なります。少なくともコード生成は10ビット・アドレスには対応していません。 通常のデバイスは殆ど7ビット・アドレスです。(10ビット・アドレスはスレーブアドレス部が0b11110xxで,最初の データが下位8ビット分のアドレスになるので,やり方はレジスタ・アドレスを指定するのににていますが。) 今,RL78/G13用のプログラムをRL78/G10に移植中しています。環境が揃わないので,プログラムの移植だけに なりますが,本日中には何かアップできると思います。
RL78G10_IICA0.zip
チョコです。
サンプルプログラム等の「IICマスタ(RL78/G13版)改」はコード生成を初期化だけに使用し,I2Cの実際の処理部はライブラリとしてr_iic_lib.c(及びr_iic_lib.h)として独立させています。これをRL78/G10に書き換えてみました。
変更点:
・割り込みベクタを定義しているpragma指令からレジスタ・バンクを削除
・IIC_TM03_init関数のTMR03レジスタをTMR03Lに変更
これをr_cg_main.cの中で使ったg_IIC_put_data関数とg_IIC_get_data関数でレジスタを内蔵したスレーブ用のアクセス関数(スレーブ・アドレスとレジスタ・アドレスを指定した書き込み関数と読み出し関数)です。ついでに,16ビットのデータの読み出し関数まで作ってみました。余計な処理はできるだけ削除したり,変更しています。まだ,ワーニングは消えていませんが,エラーがなくなったのでアップしておきます。参考にしてください。
RL78G10_IICA0_rev2.zip
BMP180関係の定数の定義が間違えていた(入れ替わっていた)ところを修正し,温度を読み出す部分を関数にしてしまいました。
また,前回出ていたワーニングを消すために関数の引数の部分を変更しました。
BMP180のデータシートを見ると,計測した結果をEEPROMのデータを使って計算することで,0.1℃単位で温度が得られるとのことなので,温度計算に必要なパラメータをEEPROMから最初に読み出すようにしています。ただし,計算はやっていませんが。
動作確認はしていませんが,I2Cバスの制御はこんな感じです。一応これで試してみてください。
ご指導ありがとうございます。サンプルコードをe2-studioのインポートで読み込むとエラーがでました。
解決には時間がかかりそうです。
つくたろうさん、こんにちは。NoMaYです。チョコさんの手元ではCS+のプロジェクトをe2 studioにインポート出来たとのことですが、つくたろうさんの手元では結局出来なかったということになりますか?[メモ]今の私はBMP180について初心者なのでGoogle検索で見付けた頁へのリンクを色々貼らせて貰いました。BMP180BMP180製品ページ - BoschBMP180データシートPDF - Bosch使用例STM32L / Barometer (Bosch BMP180) on (GCC + OpenOCD) with PN2 - JH1PJL Homepage - 個人HPロジアナでの信号データありRL78/G13でBMP180 温度、圧力センサーの値を読む - RVF/RC45 blog - 個人BlogGNURL78で独自C++クラスを設計 (GitHubにて公開)Arduino Pro Mini+BMP180でI2Cを試す - hnw - Qiita個人投稿気圧センサーbmp180をテストする - A V R 試 用 記 (別館) - 個人HPRaspberry Pi + 温度センサーで部屋の温度を測る - Nyanchew's Digital Life - 個人BlogGoogle検索ボッシュ BMP180BMP180搭載モジュールはスイッチサイエンスや共立エレショップやaitendoで購入可能一世代前のBMP085搭載モジュールは秋月電子で購入可能
つくたろうさん、こんにちは。分かりました。CS+のプロジェクトをe2 studioへインポート出来ず(チョコさんの手元では出来たとのことなのでチョコさんも言っているようにインポートのやり方を間違えたということになりそうですね)、なので、ビルドも出来ず、試すことも出来なかった、というところですね。では、また暫く待って頂けますか? どうも、チョコさんの話しからすると、例えインポート出来てもビルド出来ないという問題(その問題はルネサス責任の問題かも)があるようですので、ちょっと私の方でひと晩ほど調べてみます。
つくたろうさんwrote: said:インポートはできませんでした。ただし、新しくプロジェクトを作ってマージはまだ試していません。[引用終]
つくたろうさん、すみません、遅くなりました。(文中の表記次第で投稿出来なくなる不思議な現象に遭遇して手間取ってしまいました。)チョコさんのCS+のプロジェクトをe2 studioのプロジェクトに変換したZIPファイルを作りました。以下の(1)の画面コピーのようにしてインポートしてみて貰えませんか? (本来、CS+のプロジェクトをe2 studioにインポートするには以下の(3)の画面コピーのようにしてインポートするものなのですが、今回のプロジェクトでは幾つか落とし穴があって、まずは私の方でプロジェクトを変換したものを添付することにしました。なお、落とし穴については、別スレッドにして後で投稿しようかと思っています。) (あと、出来ればつくたろうさんと同じV5.3.1.002のe2 studioでやりたかったのですが、V5.4.0が既にリリースされたせいなのか入手出来ませんでしたので、手元のV5.3.0.023でやりました。また、ビルド出来ることの確認も当方固有の事情でCC-RL V1.01でやっています。)RL78G10_IICA0_rev2_for_e2.zip補足: ソースファイルを<プロジェクトフォルダ>直下から<プロジェクトフォルダ/src>の下へ移動させています。理由: e2 studioのコード生成機能のソースファイル生成先フォルダが<プロジェクトフォルダ/src/cg_src>固定になっている為。(1) e2 studioのプロジェクトをアーカイブしたものをe2 studioにインポートする(2) インポート結果とビルド結果(但し当方固有の事情でCC-RL V1.01でビルドしています)(3) CS+のプロジェクト(アーカイブされたままでは駄目)をe2 studioにインポートするには[追記]つくたろうさんのところで画像が表示されないようなので、上の6枚の画像(pngファイル)だけを固めたZIPファイルも添付しておきます。(もうブラウザで見られるようになっていれば良いのですが、、、)RL78G10_IICA0_20170419_images.zip
つくたろうさんへ先ほどの投稿の一番下に画像(pngファイル)だけを固めたZIPファイルを添付しました。(もうブラウザで見られるようになっていれば良いのですが、、、)
チョコさん、こんにちは。(Cc: つくたろうさん、鈴木さん) NoMaYです。チョコさんのCS+のプロジェクトをe2 studioのプロジェクトに変換していて気付いたのですが、今回のプロジェクトではコード生成機能の設定が“初期化関数のみ出力する”という設定に変更されています。これをコード生成機能のデフォルトの“設定に合わせてすべて出力する”に戻すとチョコさんの作成されたソースとコード生成したソースとでリンク時に変数(や関数)の2重定義エラーがIICA0/UARTの部分で発生します。ということは、タイマとかA/DとかIICA0/UART以外での利便性を求めてコード生成機能のデフォルトの設定で使いたい場合(つくたろうさん(?)、私とか、など)には遅かれ早かれ少々困った事態に遭遇することになりそうだと推測しているのですが、何か良い対処方法などあったりしないでしょうか?今回のプロジェクトは、つくたろうさんのところでIICA0がサッパリ動いていないようなのでチョコさんが大急ぎで作られたもの、というのは重々承知しているつもりですが、、、 また、以前にチョコさんが仰っていたコード生成機能で何でも出来る訳ではないという趣旨の意見も拝見していますが、、、
IICA0関係のヘッダファイルのマクロ定義等もコピーしないといけませんでした。
ついでに,インターバルタイマ関係も割り込み処理がr_cg_main.cで定義していたので,コード生成のインターバルタイマの割り込みを使用しないに変更しました。
なぜ,IICA0の初期設定がコード生成を利用していたかを思い出しました。通信速度を自由に設定するためにコード生成を使っていました。
一応,ここらを修正したプロジェクトを作ってみました。
ビルドまではやってみましたが,十分に返答ができているかは不明です。
RL78G10_IICA0_rev3.zip
つくたろうさん、こんにちは。NoMaYです。もしかしたら、、、と気になったのですが、今回のチョコさんのプロジェクトのmain関数は以下のようになっていて、よく見るとループしてないです。void main(void){ R_MAIN_UserInit(); /* Start user code. Do not edit comment generated here */ { uint8_t status;/* readr EEPROM */ status = g_IIC_get_wdata( BMP180, A_AC5, &g_AC5 ); if ( 0x00 == status ) { status = g_IIC_get_wdata( BMP180, A_AC6, &g_AC6 ); status = g_IIC_get_wdata( BMP180, A_MC, &g_MC ); status = g_IIC_get_wdata( BMP180, A_MD, &g_MD );/* start temperature measurement */ status = g_IIC_get_temp( &g_UT ); } } /* End user code. Do not edit comment generated here */}
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
uint8_t status;
/* readr EEPROM */
status = g_IIC_get_wdata( BMP180, A_AC5, &g_AC5 );
if ( 0x00 == status )
status = g_IIC_get_wdata( BMP180, A_AC6, &g_AC6 );
status = g_IIC_get_wdata( BMP180, A_MC, &g_MC );
status = g_IIC_get_wdata( BMP180, A_MD, &g_MD );
/* start temperature measurement */
status = g_IIC_get_temp( &g_UT );
}
/* End user code. Do not edit comment generated here */
つくたろうさんwrote: said:インポートもできました。 転送クロックfscl=100000bpsだとSCLは5μsで0Vと3.3Vになるのだと思うのですが、ずっと3.3Vのままです。[引用終]
チョコです。 今,外出から戻ってきました。 IICA0の各レジスタの値はどうなっていますでしょうか。 そこらが,問題を解決するヒントになるはずです。
追伸
変数の中がどうなってるかもチェックしてください。
NoMaYさん,つくたろうさん,
今回のIICA0を制御するライブラリの簡単な説明書を作ってみました。これを参考にしてプログラムを見てもらえれば,理解し易いかと思います。
要は,main関数の中は自分でやってねと言うことです。
IICA0ライブラリの解説.pdf