シリアルインターフェイスIICAでデータを取得できません

ボッシュさんの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 */ 

 

static void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    R_UART0_Start();
    buf[0]=0xF4;
    buf[1]=0x2E;
    buf[2]=0x00;
    R_IICA0_Master_Send(0xEE, (uint8_t *)buf, 2,20);
    sleep(20);
    while (1U){
        //R_UART0_Receive((uint8_t *)rx_buf,10);
     uart();
     sleep(10);
    }
    R_UART0_Stop();
    /* End user code. Do not edit comment generated here */
}
/* Start user code for adding. Do not edit comment generated here */
void uart(void){
    int i;
    R_IICA0_Master_Receive(0xEF, (uint8_t *)buf,256,20);
    for(i=0;i<256;i++){
     if((i%8)==7){
      sprintf_tiny(data,"%03d,%03d\n ",i,buf[i]);
     }else{
      sprintf_tiny(data,"%03d,%03d ",i,buf[i]);
     }
    //R_UART0_Send((uint8_t*)message,strlen(message));
    R_UART0_Send((uint8_t*)data,10);
    sleep(15);
   }
}
Parents
  • IICの送受信の経験は有りますか?
    IICの信号の中身の意味は分かってますか?
  • シリアルアレイユニットのIIC00で表示器に文字を出したことがあります。
  • 最初に戻る前に寄り道をさせて頂きます。
    イチゴのようなので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のインポートで読み込むとエラーがでました。

    解決には時間がかかりそうです。

  • チョコです。
    以前インストールしたままになっていたe2-studioでインポートをやってみました。
    インポートは指定された手順でやればできました。インポート自体はバージョンの関係でいくつか
    ワーニングが出ましたが,結果としてできたようです。しかし,そのままビルドしたらコード生成した
    だけの部分で2重定義でビルドエラーになったのでそこでやめました。
    やり方に問題があるのではないですか。
    (使用している環境がモバイルノートなので,画面が小さくてe2-studioはとても使う気にならないので,
    ビルドエラーが出た段階でやめました。)

    プロジェクトをそのままインポートするのがNGなら,e2-studioに新しいプロジェクトを作って,そこに
    IICA0関係のファイルをマージすることも考えられます。
  • つくたろうさん、こんにちは。NoMaYです。

    チョコさんの手元ではCS+のプロジェクトをe2 studioにインポート出来たとのことですが、つくたろうさんの手元では結局出来なかったということになりますか?

    [メモ]

    今の私はBMP180について初心者なのでGoogle検索で見付けた頁へのリンクを色々貼らせて貰いました。

    BMP180

    BMP180製品ページ - Bosch

    BMP180データシートPDF - Bosch

    使用例

    STM32L / Barometer (Bosch BMP180) on (GCC + OpenOCD) with PN2 - JH1PJL Homepage - 個人HP
    ロジアナでの信号データあり

    RL78/G13でBMP180 温度、圧力センサーの値を読む - RVF/RC45 blog - 個人Blog
    GNURL78で独自C++クラスを設計 (GitHubにて公開)

    Arduino Pro Mini+BMP180でI2Cを試す - hnw - Qiita個人投稿

    気圧センサーbmp180をテストする - A V R 試 用 記 (別館) - 個人HP

    Raspberry Pi + 温度センサーで部屋の温度を測る - Nyanchew's Digital Life - 個人Blog

    Google検索

    ボッシュ BMP180
    BMP180搭載モジュールはスイッチサイエンスや共立エレショップや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

Reply
  • つくたろうさん、すみません、遅くなりました。(文中の表記次第で投稿出来なくなる不思議な現象に遭遇して手間取ってしまいました。)

    チョコさんの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

Children
  • e2 studioのverは5.4.0.015です。CC-RLは?という環境です。
    私のブラウザの設定か調査中なのですが、画像とかがでてこないです。
  • つくたろうさんへ

    先ほどの投稿の一番下に画像(pngファイル)だけを固めたZIPファイルを添付しました。(もうブラウザで見られるようになっていれば良いのですが、、、)

  • チョコさん、こんにちは。(Cc: つくたろうさん、鈴木さん) NoMaYです。

    チョコさんのCS+のプロジェクトをe2 studioのプロジェクトに変換していて気付いたのですが、今回のプロジェクトではコード生成機能の設定が“初期化関数のみ出力する”という設定に変更されています。これをコード生成機能のデフォルトの“設定に合わせてすべて出力する”に戻すとチョコさんの作成されたソースとコード生成したソースとでリンク時に変数(や関数)の2重定義エラーがIICA0/UARTの部分で発生します。

    ということは、タイマとかA/DとかIICA0/UART以外での利便性を求めてコード生成機能のデフォルトの設定で使いたい場合(つくたろうさん(?)、私とか、など)には遅かれ早かれ少々困った事態に遭遇することになりそうだと推測しているのですが、何か良い対処方法などあったりしないでしょうか?

    今回のプロジェクトは、つくたろうさんのところでIICA0がサッパリ動いていないようなのでチョコさんが大急ぎで作られたもの、というのは重々承知しているつもりですが、、、 また、以前にチョコさんが仰っていたコード生成機能で何でも出来る訳ではないという趣旨の意見も拝見していますが、、、

  • チョコです。
    IICA0については,コード生成のR_IICA0_Create関数をr_iic_lib.cの中に組み込み,コード生成ではIICA0は使用しないようにしてください。その上で,R_MAIN_UserInitからR_IICA0_Create関数を呼び出せば,IICA0は問題ありません。ただし,R_IICA0_Create関数のプロとタイmpu宣言は追加してください。
    UART関係はr_uart0_lib.cとr_uart0_lib.hをプロジェクトから外して,全てコード生成にしてください。
    これで,コード生成をそのまま使えるはずです。
    (IICA0については,コード生成がリスタートに対応できていないので,今回のように全く別定義にするのがいいでしょう。これ以外にTM03も使っていますが,割り込みは使用せず,直接ハードを操作してポーリングしているので,コード生成で初期設定してあるだけで十分です。)
  • チョコです。

    IICA0関係のヘッダファイルのマクロ定義等もコピーしないといけませんでした。

    ついでに,インターバルタイマ関係も割り込み処理がr_cg_main.cで定義していたので,コード生成のインターバルタイマの割り込みを使用しないに変更しました。

    なぜ,IICA0の初期設定がコード生成を利用していたかを思い出しました。通信速度を自由に設定するためにコード生成を使っていました。

    一応,ここらを修正したプロジェクトを作ってみました。

     

     

    ビルドまではやってみましたが,十分に返答ができているかは不明です。

     

    RL78G10_IICA0_rev3.zip

  • しっかりと画像も見えています。インポートもできました。
    転送クロックfscl=100000bpsだとSCLは5μsで0Vと3.3Vになるのだと思うのですが、ずっと3.3Vのままです。
    配線し直したりゴニョニョしてみます。
  • つくたろうさん、こんにちは。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 */
    }

    つくたろうさんwrote: said:
    インポートもできました。
    転送クロックfscl=100000bpsだとSCLは5μsで0Vと3.3Vになるのだと思うのですが、ずっと3.3Vのままです。[引用終]
  • チョコです。
    今,外出から戻ってきました。
    IICA0の各レジスタの値はどうなっていますでしょうか。
    そこらが,問題を解決するヒントになるはずです。

    追伸

    変数の中がどうなってるかもチェックしてください。

  • チョコです。
    先ほど外出から戻ってきました。

    はい,これは,どうやってIICA0を使うかを示すためなので,それ以上は作っていません。
    元々,参考にしてもらうだけで作成したものです。

    最初の3つのg_IIC_get_wdataで温度の計算に使用するパラメータを読み出して,その後の,
    g_IIC_get_tempでg_UTに温度データを読みだしてきているだけです。後はこれらのデータを
    どう使うかです。
    基本的に,計算で使用するパラメータは固定値なので,温度データの読み出しを含むループを
    作る(ここらはつくたろうさんが作成する部分だと思います)ことになります。
  • チョコです。

    NoMaYさん,つくたろうさん,

    今回のIICA0を制御するライブラリの簡単な説明書を作ってみました。これを参考にしてプログラムを見てもらえれば,理解し易いかと思います。

    要は,main関数の中は自分でやってねと言うことです。

     

    IICA0ライブラリの解説.pdf