皆様
はじめまして、Kaminari です。
RL78G13 (R5FR5F100LE)とCS+ (V8.05.00)でI2Cデバイスの設定と、読み出しを行うセットを製作しようとしております。
内容は、次のようなものです。
チョコ様のIIC通信のマスタ側のプログラムや書籍も参考にさせていただいて作成していたのですが、C言語も初心者のため、おはずかしながら生成されたAPI関数を用いるためにはどう直せばいいのかわからず滞っております。
周囲も詳しい者がおらず、また上記構成を起点として機能を追加する予定のため生成されたIICA関数でIICアクセスを行いたいと思っております。恐れ入りますがIICA用API関数を用いたI2Cアクセスのサンプルプログラムがありましたら、(または場所をご存知でしたら)ご教示いただけませんでしょうか?
チョコです。
>「環境に合わせた修正」は、あの分厚いユーザーズマニュアルをちゃんと理解しないと
その必要はないはずです。アプリケーション・ノートにはそこで使用している関数の説明が書かれています。しかも、main関数はそれらの関数(API関数)の使用例になります。つまり、RL78のマニュアルは読まなくても、使えるはずです。少なくとも、コード生成APIの役に立たないマニュアルよりは、実際に使っている例なので簡単なはずです…
NoMaYさん、コード生成と付き合いは、まだ十年にはなっていませんが、もうすぐ十年にはなりますね。
コード生成は、初期化から公開され、最初は公開されていた初期設定について、文句を言って、それなりに改善はされてきました。APIは後から追加されたもので、それも個々の周辺機能ことに追加されてきました。I2Cでもいくつか改善はされました(今よりひどかったのです)。デバイスの展開が大きく広がったことに対応が手一杯ですでにあるものの改良の優先順位は下がっているとのことでした。最後の修正は、確かリスタート対応でしたが、設定としては追加されたのですが、プログラムに問題があり、使い物になりませんでした。
ということで、全く無視され続けたわけではありませんが、問題点の改善には至っていないのが、現状ですね。
今は、新しいSCに期待しています。
売るもの作るんでなければ、ArduinoやGR-KURUMIなんかでちゃちゃっとでっち上げるのが楽チンと思います。
私はマニュアル読みです。
RL78/G10が出て、それを入手してからは、実際にEEPROMを制御し、その後にLCD表示モジュール、センサと動かしてきました。
2KのG10だったので、最初はアセンブラ記述でのプログラムでしたが、G13やG14の環境(テセラのUSBスティック)を入手したからCに移りました。元がハード屋なので、Cは見よう見まねで作っています。その代わり、できるだけ読みやすいように心がけています(凝ったプログラミングはできません)。
コメントありがとうございます。kaminariです。
ハードウェア開発では手が足りず、制御ソフトウェアも手掛けることになりました。まだ駆け出しなので皆さんのCの勉強法は参考になりました。ありがとうございます。
遅くなりましたが、(まだエラーが取り切れえおらず大変恐縮ですが)ソースをUpさせていただきます。fujita様も仰る通り完全に社内で閉じていればArduinoでいいのですが、少々難しい状況があり、Cで開発を進めております。
自前の環境に修正、といいましてもまだまだ実力が伴わないのでほとんどごきゅおじいただきましたオリジナルで、アドレスを直して使わない処理を省略したようなものです(それでもエラーが残っています…)
恐れ入りますが、お気づきの点がありましたらご指摘いただけますと幸いです。
Test_controller_00.zip
zipファイルにSmartManualDocsが入っているので、ファイルが8MBを超えてしまっています。
ファイルを添付する場合にはこのフォルダ削除してから添付してください。大きすぎて、ダウンロードにすごく時間がかかってしまいました。実際にビルドしてみると以下のエラーが出ているようです。
最初の「r_iic_lib.c(36):F0520005:ソース・ファイル "r_timer_user.h" を開くことができません。」はオリジナルに存在した "r_timer_user.h" がプロジェクトにないことが原因です。これはiic_lib.cで60マイクロ秒のウエイトを呼び出している処理のためです。r_iic_lib.cの36行目と207行目をコメントアウトすれば、このエラーはなくなります。
「r_main.c(216):E0520268:ブロック内で実行文の後に宣言を置けません。」と「r_main.c(217):E0520065:";" がありません。」はないか見えない変なコードがあるようです。
「r_main.c(325):E0520020:識別子 "status" は定義されていません。」と「r_main.c(334):E0520118:void 関数は値を返せません。」はオリジナルでは、以下のように定義されています。このローカル変数が定義されていないのが原因です。
「r_main.c(492):E0520020:識別子 "FALSE" は定義されていません。」「r_main.c(497):E0520020:識別子 "TRUTH" は定義されていません。」はオリジナルのr_cg_userdefine.hには、以下のように定義されているので、これをr_cg_userdefine.hに追加してください。
これ以外に実行時に問題になりそうなのが、WDTです。使っていないなら停止してください。
ビルドエラーを中心に眺めましたが、まだ、シリアル関係に注意点があります。それは後程コメントします。
Test_controller_00_2.zip
>「r_main.c(216):E0520268:ブロック内で実行文の後に宣言を置けません。」と「r_main.c(217):E0520065:";" がありません。」はないか見えない変なコードがあるようです。
よく確認したら、main関数の"}"が2個不足しているのが原因です。"}"を2個追加しました。
オリジナルのサンプルプロジェクトの内容をできるだけ再現した格好で作り直してみました。
その結果以下のワーニングだけになりました。当然ながら、動作確認はしていません。
コード生成のUARTとIICA0がバッティングするので、IICA0の初期設定(void R_IICA0_Create(void))等を「r_iic_lib.c」に移動させ、コード生成の対象からIICA0を除きました。
タイマ関係の機能はオリジナルを復活させて、「r_cg_timer_user.c」に持ってきています。r_main.cの最後の方に「delay_ms」がありましたが、そこはコメントアウトしています。「r_cg_timer_user.c」の「delay_ms」はタイマを使って時間計測を行っているので、時間は正確です。
主に、エラー対応を行いました。main関数の処理については、確認はしていません。
結果を添付しておきますので参考にしてください。
以上
チョコ様、皆様
お世話になっております。kaminariです。
ありがとうございます!!こちらの環境で動作テストしてみて、またご報告させていただきます。
お忙しいところ、誠にありがとうございました。
チョコ様
手元の環境で試してみましたが、以下のようにI2Cの通信がまだできていないようです。
(比較に100kbpsのArduinoを用いています)
ペリフェラルは400kbpsをサポートしているのですが、何か原因として挙げられそうなものはございますでしょうか?
また、通信速度の差分があるのかと思いまして修正いただいたプロジェクトを100kbpsで再作成しますと以下のように
エラーで停止します。
お忙しいところ恐れ入りますが、修正するべき箇所を教えていただけませんでしょうか?
以下のエラーは、コード生成でIICA0を有効にしようとしたことによるものと考えられます。
先日提示したプロジェクトでは、コード生成でIICA0は使用しないようにしてください。
IICA0関係はiic_lib.cの499行目から以下のR_IICA0_Create関数があり、これでIICA0を初期化しています。
ここで赤で囲んだのが通信速度を設定しているところです。100kbpsにするなら、0x15→0x4C、0x14→0x55に書き換えてください。
そのうえで、IICA0は使わないに設定しておいてください。
下の波形を眺めると、100kbpsの方は、(8bit)スレーブアドレス0xA2に対してACK応答がありますが、400kbpsではNACK応答になっています。これは、ノイズがどの程度あるかに依存しますが、SDA 信号の立ち下がる直前にヒゲが見られますがこれが影響してはいないでしょうか。
追加でコメントしておきます。
波形から判断すると、RL78/G13以外の信号線の引き回しを含むハードウェアの問題が考えられます。
また、ビルドでのエラーが出た部分ですが、これは、IICA0を有効にしてコード生成したからで、IICA0の初期化(R_IICA0_Create(void))の中に以下のようなコードが生成されます。
これは、IICA0を使用すると指定したときにr_cg_serial.hで以下のように定義されているものを参照しようとしたからです。ここで、_4C_IICA0_IICWL_VALUEは先頭の数値(4C)が実際に設定される16進の値であることを示しています。
先日提示したプロジェクトでは、IICA0はコード生成を使用しないで、初期設定はr_iic_lib.cに移動させていますが、値を生成(定義)してくれるところがないので、即値として0x4Cのような値を使うようにする必要があります。通信速度を変えるには、IICWL0とIICWH0の部分を手動で書き換えます。