誰でも簡単マイコンプログラミング その2

電の記
DSC_1961

設計図

設計図を示しておきます。

関数相関図

関数相関図

ユーザ関数・変数

ユーザ関数・変数

状態遷移図

状態遷移図

ここまでできれば後はひたすらソースコードを書いて行くだけです。
ユーザ関数を紹介していきます。

ソースコード

ユーザコード

その2の初めから設計したきたユーザのソースコードを書いていきます。まず、こちらでデバックまで一通り終えているソースコード示します。その後ソースコードの追加の仕方やすでにあるコンフィグレータが作成したコードとの受け渡しやデバックの方法を書いていきます。

ソースコードの追加方法ですが新規の場合を書いておきます。新規でない、すなわち既存のファイルを追加はその名の通り既存のファイルを選択すればできます。では、今回はまずカテゴリ追加から始めます。これはプロジェクト内のフォルダのようなものでユーザコードをひとまとまりにするため作成します。

追加方法

通常左側に表示されています「プロジェクト・ツリー」から「ファイル」を選びます。そして「右クリック」ー「追加」-「新しいカテゴリを追加」を選びます。

新しく「コード生成」と同じレベルでカテゴリ作成され名前要求されますので今回は「User」とします。次に今作成したカテゴリを選択し右クリックで「追加」ー「新しいファイルを追加」を選択します。

ファイル種別、ファイル名を聞いてきますので作成する種別(.cか.hを)とファイル名を入れます。ここでは、作成場所も同じ名前のフォルダにしています。「User]というフォルダを先に作成しておいてユーザのファイルはこのフォルダに入れるようしています。

追加コード

まずは、ユーザソースコードです。書き方は、人それぞれですので自分に合った書き方をしていってください。もちろんC言語の文法にあったものでですが。以下が自分のほうで設計して書いたコードです。
SubMain.c
SubMain.h
Rl_Tmr0.c
Rl_Tmr0.h
Rl_Swpi.c
Rl_Swpi.h
Rl_Outp.c
Rl_Outp.h
SubMod.c
SubMod.h
SubOut.c
SubOut.h
SubTim.c
SubTim.h
SubErr.c
SubErr.h
SubCom.c
SubCom.h

基本機能ファイル

基本機能ファイルにユーザコード呼出しなど加える必要あります。書き加えるのは以下の3つのファイルでr_main.cには各機能の開始(停止)も加えます。強調表示している部分が書き加えた個所です。
r_main.c
r_cg_serial_user.c
r_cg_timer_user.c

デバッグ

デバッグ設定

デバック時のまずは設定です。デバッグの前には、使用するデバッグツールの設定でデバッグツールを指定する必要があります。設定をしないとシミュレータとなります。今回はE2 Liteエミュレータを使用してますのでE2 Liteを指定します。ここは、それぞれお使いのエミュレータでよいですがここではE2 Liteを使用したデバッグを説明していきます。

メニューバーの「デバッグ」ー「使用するデバッグツール」で「RL78 E2 Lite」を選択します。

次に、デバッグの時には左の「プロジェクト・ツリー」から「RL78 E2 Lite(デバッグツール)」を選択してデバッグの設定をします。「デバッグ・ツール設定タブの「実行を一瞬停止してアクセスをする」を「はい」にしておくととても便利です。

さあ、ここから本格的にデバッグに入ります。

デバッグ SubMain

上述する通りやってこられれば今の現状は下記のような状態かと思います。

しかし、実際はデバッグの時には新規作成のファイルを一気にコーディングしてデバッグをしていくことはせず1つコードを書いてデバッグ、いわゆる一つコード確認をして次に。としていきます。その実際のデバックの仕方を以下では解説していきます。では、いったん後戻りをしますがSubMain.cをデバッグします。

この時、上記のようにSubMain.c(とSubMain.h)以外まで追加されていればいったんプロジェクトから削除します。左のプロジェクトツリーでファイルを選び「プロジェクトから外す」を選択します。また、SubMain.cとSubMain.hあるいは基本機能ファイルもプロジェクトから外した関数・変数などを使用していればいったんコメントアウトしておきます。以下の通りです。


SubMain.c
SubMain.h
r_main.c
r_cg_serial_user.c
r_cg_timer_user.c

では、デバッグの開始です。まずコンパイルします。下記のアイコンをクリックするか、メニューバーの「ビルド」-「リビルド・プロジェクト」でコンパイルしてください。

コンパイルが問題ないことを確認します。もちろん、問題があれば赤色で問題個所の出力結果がでてきますし、赤字のメッセージをクリックすると異常個所にジャンプしてくれますので間違えを修正してください。

基板の電源を入れ接続、プログラムのダウンロードします。
ファイルメニューより「デバッグ」ー「リビルド&デバッグツールへダウンロード」を行います。

ソースコードの左にマイコン上のアドレスなどが表示されデバッグ開始です。

まず、プロジェクト・ツリーのSubMain.cをクリックするなどしSubMain.cを表示します。

ソースコードのコメントされていない部分で初期化関数のpSub_Initの左の赤枠の位置をクリックしてブレークポントを設定します。これは、この位置をプログラムが通過していることを確認するためのブレークポイントです。

同様に、メインループの中にブレークポイント作成します。処理は何もしていないのでreturnのところしかアドレス振られていないのでreturnの位置にブレークポイント作成します。

ブレークポイント作成後、①「リセット」 ②「現在位置から実行」 をしてプログラム開始します

正しくできていれば、pSub_Initの位置でプログラムは停止します。その後、その位置から「現在位置から実行」をクリックします。

次は、メインのreturnのところでブレーク停止します。その後、その位置から「現在位置から実行」をクリックしてもreturnのところのブレーク停止を繰り返します。

この動作が想定している動作となりますのでSubMainのデバック完了となります。

理解いただけていますでしょうか?
関数相関図にありますように、
R_MAIN_UserInitからgSubMain_Initを起動時1回だけ呼び出します。
ユーザはこのInitの中でいろいろな初期化を行います。
mainのwhile文の中からウォッチドッグ関数とgSubMain_Intrを繰り返し呼出し続けます。
ユーザはメインループから呼び出されたら処理を実行します。この実行は、ウォッチドッグがカウントされきる前に最短で制御を戻しながら処理を行う必要があります。
とここまでできましたらあとは同じように一つづつデバックを行っていけば良いということがわかります。すなわち1つのファイル(.cと.h)を追加して初回にInit関数が呼び出されているか、Intr関数が毎メインループで呼び出されているかを確認することがデバッグのはじめです。

続けて、IOのところでウォッチなど説明します。

デバック Rl_Tmr0、Rl_Swpi、Rl_Outp

ここでのファイルは、以下の通りです。
r_main.c
r_cg_serial_user.c
r_cg_timer_user.c
SubMain.c
SubMain.h
RL_Tmr0c
Rl_Tmr0.h
Rl_Swpi.c
Rl_Swpi.h
Rl_Outp.c
Rl_Outp.h

では、デバッグです。まずは、コンパイルしてエラーないいこと確認です。ダウンロードします。以下の状態になっていますでしょう

プロジェクト・ツリーからRl_Swpi.c(Rl_Swpi.hなどでも良いです)を選択しgcSwpi_Dataをダブルクリックし右クリックすると「ウォッチ1に登録」をします。同様にRl_Outp.cを選択しgcOutp_Dataをダブルクリック右クリックで「ウォッチ1に登録」をします。ウォッチ式ウィンドウ表示されたgcSwpi_DataとgcOutp_Dataの左側の+マークはクリックしそれぞれの変数を展開してください。

ここで、「リセット」して「現在位置から実行」します。そしてスイッチの入力確認およびRl_Swpiプログラムの確認をしていきます。スイッチの確認は、基板スイッチをPushすると下記のようにウォッチ1ウインドウのgcSwpi_Dataの変化が見て取れればRl_SwpiのデバッグOKと言うことになります。

出力は、ウォッチウインドウのgcOutp_Dataの値を直接変更します。値に応じてLEDが変化すればRl_OutpのデバッグはOKです。

前述のデバッグの設定でデバッグ・ツール設定タブの「実行を一瞬停止してアクセスをする」を「はい」にしておきましたのでこのように便利に使えています。実行を一瞬停止してアクセスするなんて言うとギコチナイ動きするのかと思ってしまいますが人が見たり操作する普通のプログラムであればリアルタイムに実行とウォッチウインドウの表示してくれます。

デバッグ 全体

コードは、一番最初に示したコードです。ぼくのコードは、ユーザの制御で使用するI/Oは前述のデバックしたI/Oからもうワンクッション入って変数使用してます。これは、I/Oが多くなってきたときにはシミュレータなど用意するのが大変となってきますのでパソコンからの通信でシミュレータの代わりとするためこんなことしてます。必要なければ、通信や変数の代入は使用しなくても大丈夫です。

スイッチをPushすると、LED1、LED2が点灯していくのとウォッチウインドウ画面のスイッチ状態や出力状態そしてタイムカウンタの値まで確認することができます。これですべてのデバッグ完了です。

他への展開

ここまで説明すれば他への展開はとても簡単ですね。

コンフィグレータがコード生成してくれないマイコンでも時間はかかりますが自分でコンフィグレータが生成してくれる部分を書いてしまえば、ユーザのコード部分はマイコン違ってもコピペで使い回しができますのでどんなマイコンやどんなハードウェア(I/O構成)でも流用できます。

皆さんもいろいろなマイコンなど展開してみてください。

 

 

コメント