最近、マイコンを触り始めたものです。
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位置を示すものも表示されず、アドレス欄も空欄です。何か設定を変えてしまったのだと思いますが、どこの設定を直せばソースファイル上でのステップオーバー実行ができるでしょうか。よろしくお願いします。
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ファイルを添付しておきます。
分りました。
その方法で調べていきたいと思います。
試しに、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;
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;
この順番(ポートの値の初期化→ プルアップ抵抗の有効化→ ポートモードの設定)である必要はありますか?
また、そうであれば、なぜかを教えてください。
また、この順番である必要があるのかどうかは、どうやって判断すれば良いでしょうか。(順番を入れ替えてバグが起きればわかりやすいのですが…)
以上、よろしくお願いします。