お世話になっております。
以前、「RL78/G13(マスタ)とADC(スレーブ)によるI2C通信の件」と題して質問をさせていただいたHiroと申します。
CS+ for CCでは問題なく通るサンプルコードがCS+ for CA,CX 環境ではエラーが出てしまう点について質問させていただきたいです。
チョコ様に参考資料としてご紹介いただいた「RL78/G13 シリアル・インターフェースIICA(マスタ送受信)」(R01AN2759JJ0201)のサンプルコードをCS+ for CCで動作させてみました。
サンプルコードの設定を変えずに動作確認を行ったのですが、ビルド後RL78/G13(R5F100LE)がついている評価ボード(NGX Technologies製 BLUEBOARD-RL78/G13_64PIN)のボード上に搭載されているブザーが鳴りっぱなしになってしまいました。
そのため同じサンプルコードを使い慣れているCS+ for CA,CX 環境で動作させてみようと思い、以下の変更点を加えてコード生成、プログラム作成を行いました。
=============================================================================================================
変更点
①使用端子をP60/SCLA0、P61/SDAA0は変更させず、P137の動作開始指定用SW入力信号は評価ボード搭載のSWがついているP50へ変更
②使用端子のP62(ステータス表示LEDドライブ信号)、P63(エラー表示LEDドライブ信号)は使用せず、P62とP63の部分はコメントアウト
③CS+ for CCからCA,CX に変更する際にポートの定義が異なるのでそちらを変更
こちらで動作したところ、ビルドエラーとなりました。エラーは"r_iic_lib.c"で発生し、
#pragma interrupt r_iica0_interrupt (vect = INTIICA0 , bank = RB1)
の一文でエラーコードとなっています。
エラーメッセージは"CC78K0R error E0802:Illegal preprocess directive"です。
同一コードに見える"r_cg_serial_user.c"の
#pragma interrupt INTIICA0 r_iica0_interrupt
の一文はエラーになっていないので、そちらを"r_iic_lib.c"にコピーしてみましたがやはりエラーが出ましたので質問させていただきました。
お忙しいところ大変恐縮ですが、ご回答いただけると幸いです。よろしくお願いいたします
Hiro
チョコです。
CA78K0RとCC-RLでは割り込みの記述方法が異なります。「#pragma interrupt INTIICA0 r_iica0_interrupt」はCA78K0Rでの記述フォーマットですので、これは通るはずです。
しかしながら、CA78K0RとCC-RLでは、これ以外に「インクルード宣言」と「割り込み宣言」の順番が逆になります。
下に示すのがCA78K0Rの例で、割り込みが先に宣言され、その後でインクルードです。
同じく、CC-RLでは、インクルードが先で、その後に割り込みです。
ここらは、CA78K0RからCC-RLに移行したころはよくやっていたのですが、最近はCA78K0Rをそのまま使うことはないので、もう忘れていました。
それにしても、「RL78/G13 シリアル・インターフェースIICA(マスタ送受信)」では、ブザーに関係するところはいじっていないはずです。
以上
チョコ様
いつもお世話になっております。回答いただきありがとうございます。
上記の”割り込み”から”インクルード”の記入方法でエラーをなくすことができました。ありがとうございます。
そちらのエラーは消えたのですが、今度は新たなエラーが出てきました。下記に詳細を記載します。
=============================================================================================
RA78K0R error E3404: Multiple symbol definition '_@vect38' in file 'DefaultBuild\r_cg_it_user.rel'. First defined in file 'DefaultBuild\r_main.rel'RA78K0R error E3404: Multiple symbol definition '_@vect2a' in file 'DefaultBuild\r_iic_lib.rel'. First defined in file 'DefaultBuild\r_cg_serial_user.rel'RA78K0R error E3202: Segment type mismatch '@@VECT38' in file 'DefaultBuild\r_cg_it_user.rel' - ignoredRA78K0R error E3202: Segment type mismatch '@@VECT2A' in file 'DefaultBuild\r_iic_lib.rel' - ignored
こちらのエラーでのシンボル名、@vect38と@vect2aですがメインとサブプロジェクト内で一括検索をかけても見当たらずエラーの改善しようがないので困っております。
ご教授いただければと思います。よろしくお願いいたします。
ブザーの件ですが、CS+ for CA,CX 環境ではこのような動作が起こったことがなかったのでCS+ for CCでLチカを行うプログラムを作り動作確認をしてみたところブザーは鳴らなかったです。今後原因追及を行っていく予定です。
これは、エラーメッセージに書かれている通りです。
「vect38」が二重に定義されているとのメッセージなので、該当する割り込みベクタ(12ビットIT)のベクタ定義が2ヵ所以上でなされているということです。
シンボル「@vect38」が複数あるわけではありません。また、「@vect2a」も同様です。
このようなエラーメッセージについては、ヘルプで確認してください。
ご回答いただきありがとうございます。
シンボルではない件、承知しました。
チョコ said:「vect38」が二重に定義されているとのメッセージなので、該当する割り込みベクタ(12ビットIT)のベクタ定義が2ヵ所以上でなされているということです。
ご回答いただいた”ベクタ定義が2か所以上でなされている”という文を参考にしてベクタ定義を1か所にしたところ初めてビルドが通りました!
前回と今回ともに早急なご対応ありがとうございます。今後ともよろしくお願いいたします。