Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

CS+ for CC のデバッグ・ツールについて

最近、マイコンを触り始めたものです。

CS+ for CC で RL78/G14 の R5F104LE(64pin)、アプリケーション(CC-RL)でプロジェクトを作成している状態です。

以下のような簡単なプログラムを main.c に書いています。

#include "iodefine.h"

static void intit(void);
#pragma interrupt intit(vect = INTIT, bank = RB1)

void main(void) {
// インターバルタイマの割り込み許可
ITMK = 0;
__EI();

// 低速オンチップ・オシレータ・クロックを供給
OSMC |= 0x10;

// クロックの供給許可
RTCEN = 1;

// LED0 の設定
PM1_bit.no7 = 0; // 出力モード
P1_bit.no7 = 1; // 消灯

// 100ms 間隔で動作開始
ITMC = 0x8000 + (15000 / 1000) * 100 - 1;

while(1);
}

void intit(void) {
static int count = 0;

if (10 == count) {
P1_bit.no7 = !P1_bit.no7;
count = 0;
} else {
++count;
}
}

この状態でデバッグ・ツールとして RL78 EZ Emulator を選択し、CC-RL (ビルド・ツール) のプロパティからリンク・オプションタブの、デバイス > デバッグ・モニタ領域を設定する を 「はい」にした状態でビルド&デバッグ・ツールへダウンロードを押すと、以前はソースファイルに対してステップオーバー実行などが出来ていたのに、逆アセンブル上でしかできなくなってしまいました。
現在のPC位置を示す黄色くなる行も逆アセンブルにしか表示されず、ソースファイルにはPC位置を示すものも表示されず、アドレス欄も空欄です。
何か設定を変えてしまったのだと思いますが、どこの設定を直せばソースファイル上でのステップオーバー実行ができるでしょうか。

よろしくお願いします。

  • あれこれするより新しくプロジェクトを作成してプログラムをコピペした方が解決が速いと思います。
  • solさん、こんにちは。NoMaYと申します。

    > 以前はソースファイルに対してステップオーバー実行などが出来ていたのに、逆アセンブル上でしかできなくなってしまいました。
    > 現在のPC位置を示す黄色くなる行も逆アセンブルにしか表示されず、ソースファイルにはPC位置を示すものも表示されず、アドレス欄も空欄です。

    そういう現象ならば、デバッグ情報出力の有効/無効とか(有効にする(コンパイラ/リンカ))、最適化レベル(最適化無しにする(コンパイラ))とか、その辺りの設定ではないかと思いますよ。

  • In reply to fujita nozomu:

    cafe_rene.zip

    チョコです。

    solさんがやられている方法は、初心者にはあまりお勧めできません。

    RL78には、コード生成機能があり、GUIで使用したい内蔵周辺機能を指定すると、必要なプログラムが生成されるので、面倒な初期設定が完了した状態でmain関数が起動します。

    ただし、WDTが有効になってしまうので、そこは禁止することをお勧めします。

    とは、いえ、せっかくなので、solさんのプログラムを実際にやってみました。

    RL78/G14 の R5F104LE(64pin)でRL78 EZ Emulator ということなので、テセラさんから販売されていた

    RL78/G14 Stick スターターキットで検証してみました。

    CS+CCで新しいプロジェクトを作成し、main.cに提示されたプログラムを埋め込んで、リンクオプションをスレッドになるように設定して

    実際にビルドしてRL78/G14 Stick スターターキットにダウンロードしてみました。

    結果は全く問題なくステップ実行もできました。(ただし、最後はwhile(1)のループになるので、その先は無意味ですが。)

    使用したプロジェクトのzipファイルを添付しておきます。

     

  • In reply to チョコ:

    チョコです。

    追加情報です。

    かふぇルネには、私が投稿した初心者向けの「チョコさんのRL教室」というものがあります。

    http://japan.renesasrulz.com/cafe_rene/b/rl78-classroom

     

    今はトップページの左側のナビの一番下になってしまっていますが、ここの内容が役に立つのではないかと思います。

  • In reply to fujita nozomu:

    この簡単なプロジェクトならそれでもいいかな、と思っていたのですが、今後大きなプロジェクトになって同じ現象が再発した時に、いちいちプロジェクトを作り直すのもなぁと思っていまして、そのため設定で直したく、質問しました。
  • In reply to NoMaY:

    デバッグ情報出力が無効になっていたので、ここを有効に直したら、無事できました!
    ありがとうございました。
  • In reply to チョコ:

    今回は、あれこれいじってしまった後の既存のプロジェクトを何とかしたかったです。
    試していただき、ありがとうございました。
  • In reply to チョコ:

    以前、見させていただいて、一通りやってみた覚えがあります。
    コード生成の機能は確かに便利なのですが、他のマイコンを使用する際にはこの統合開発環境が使えるとは限らず、データシートから読み解く技能を身につけなければならないので、できるだけデータシートを見ながら手書きして試しています。
  • In reply to sol:

    チョコです。
    >データシートから読み解く技能を身につけなければならないので、できるだけデータシートを見ながら手書きして試しています。

    それは、いいのですが、今のプログラムの構成はどうかと思います。
    ほとんどのMCUは一つの端子に複数の機能が割り当てられ、リセットが解除された時点では、殆どアナログ入力かデジタル入力になっています。この状態が長く続くとトラブルの原因になることが考えられます。そのため、端子の設定をできるだけ早く行う必要があります。
    リセットが解除されると通常スタートアップ・ルーチンが起動し、C言語のプログラムを動かすための準備をしてからmain関数をスタートさせます。しかも、スタートアップ・ルーチンでは、最初に使用する内蔵周辺機能の初期設定を行い(その中でも、ポート設定は最初の方)、その後に変数の初期化を行うことで、端子が入力(ハイ・インピーダンス状態)をできるだけ早く解消するようになっています。
    組み込み用途では、ここらをきちんと考えて処理すべきです。
  • In reply to チョコ:

    タイマーやポートの設定する前に割り込み許可してるのも宜しくない感じですね。
  • In reply to チョコ:

    そうなんですね…
    全く知りませんでした。
    どうするのが正解か、コード生成を見て確認して、なぜその順番なのかを調べる形で解決していくのが適切でしょうか?
  • In reply to fujita nozomu:

    そうなんですね、どういう順番でやるべきなのか全くわからないのですが、正しい順番というのはどうすれば分かりますか。
  • In reply to sol:

    チョコです。

    >どうするのが正解か、コード生成を見て確認して、なぜその順番なのかを調べる形で解決していくのが適切でしょうか?

    既にあるプログラムを参照するのが一般的で、コード生成(ある意味ルネサスの推奨)も一つの方法です。
    ルネサスが準備しているサンプルコードも初期化に関してはコード生成を使っているようです。
  • In reply to チョコ:

    分りました。

    その方法で調べていきたいと思います。

    試しに、LED0 (P17) を SW1 (P75) が押されている間点灯、そうでないとき消灯するというプログラムを書くための初期プログラムを、コード生成を使って作ってみました。

    以下の設定の上、コード生成を行いました。

    ・端子割り当て設定 = 初期状態のまま確定

    ・P17 = 出力

    ・P75 = 入力、内蔵プルアップ

    ・ウォッチドッグ・タイマ動作設定「使用しない」

    hwinit 関数でハードウェアに関する初期化をしているのかな、と考えました。

    特に、ポートの初期化はこの部分だということもわかりました。

    void R_Systeminit(void)

    {

       PIOR0 = 0x00U;

       PIOR1 = 0x00U;

       R_CGC_Get_ResetSource(); // リセットフラグの取得

       R_CGC_Create(); // クロック動作周波数の初期化?

       R_PORT_Create(); // ポートの初期化

       IAWCTL = 0x00U;

    }

    3つほど質問があります。

    ①リセット時の値が保証されているものに対してもわざわざ初期化しているのはなぜでしょうか。

    例えば、PIOR0 (周辺I/O リダイレクション・レジスタ0) は、リセット信号の発生により, 00H になります。とデータシートに記載がありますが、わざわざ代入しているようです。

    ②IAWCTLは、不正メモリ・アクセス検出制御レジスタ、とのことで、ポート機能、割り込み機能などの制御レジスタにライト可能かどうかを設定することができるもののようでした。

    これが0であれば、その機能は無効なので、ライト可能となる、というのは分かりました。

    でもそれって、やるなら一番最初にしないといけないのではと思ったのですが、なぜ最後にあるのでしょうか。

    ③ void R_PORT_Create(void) の中身は以下のようになっていました。

    P1 = _00_Pn7_OUTPUT_0;
    PU7 = _20_PUn5_PULLUP_ON;
    PM1 = _01_PMn0_NOT_USE | _02_PMn1_NOT_USE | _04_PMn2_NOT_USE | _08_PMn3_NOT_USE | _10_PMn4_NOT_USE |
    _20_PMn5_NOT_USE | _40_PMn6_NOT_USE | _00_PMn7_MODE_OUTPUT;
    PM7 = _01_PMn0_NOT_USE | _02_PMn1_NOT_USE | _04_PMn2_NOT_USE | _08_PMn3_NOT_USE | _10_PMn4_NOT_USE |
    _20_PMn5_MODE_INPUT | _40_PMn6_NOT_USE | _80_PMn7_NOT_USE;

    この順番(ポートの値の初期化→ プルアップ抵抗の有効化→ ポートモードの設定)である必要はありますか?

    また、そうであれば、なぜかを教えてください。

    また、この順番である必要があるのかどうかは、どうやって判断すれば良いでしょうか。(順番を入れ替えてバグが起きればわかりやすいのですが…)

     

    以上、よろしくお願いします。

  • In reply to sol:

    チョコです。

    >例えば、PIOR0 (周辺I/O リダイレクション・レジスタ0) は、リセット信号の発生により, 00H になります。とデータシートに記載がありますが、わざわざ代入しているようです。

    これは、ほかの値に設定するときに、値だけを設定すればいいように、わざわざ初期値と同じ値を設定しているものと考えられます。
    ②についても同じ理由でここに設定があります。最初にないのはリセットで全て許可になっているからと、禁止する前に設定を完了させておくためです。実は、他のスレッドにありましたが、ここで禁止するのは、別の問題があります。(初期設定は終了していても割り込みの制御は内蔵機能を起動するときにも行いますが、そこが引っかかってしまいます。)

    >この順番(ポートの値の初期化→ プルアップ抵抗の有効化→ ポートモードの設定)である必要はありますか?
    ポートモード設定よりは、ポートの出力ラッチの設定が先である必要があります。そうしないと、出力ポートをハイで初期化しないといけないときにポートの出力ラッチのロウが出力されてしまい、ポートにヒゲが出力されてしまいます。
    スレッドの最初の書き込みでは、順番が逆になっていました。これでは、ステップ実行で最初に一瞬LEDが点灯するのが分かったはずです。通常実行させても、もしかしたらLEDが薄く点灯するのが観測できたかもしれません。こんなことで分かることもあります。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page