こんにちは、組み込みエンジニア歴20年以上のtomozoです。
今回は、ルネサス社製のマイコン
RL78でタイマー/割り込み/入出力ポートを使って
LED点滅制御(通称Lチカ)プログラムについて徹底解説します。
この記事は
e2studioのコード生成を使ってプログラムを始めて作る組み込み初心者の方
向けの記事です。
コード生成を使うと期待通り動作する周辺機能のプログラム
をすぐに作ることができて、プログラミング作業がはかどります。
マニュアルを読みながら一つずつ設定を入力していくのは
結構苦労しますからね。
プログラミングが終わって実際に動かしてみると
全然動かなくて原因調査に何日もかかることもあります。
そういった作業はサクッとミスなく終わらせられれば
クリエイティブな設計作業や他の業務、学習などに
時間を充てることができるようになります。
この記事を読めば
- e2studioでコード生成する方法とその内容
- Lチカのためにコード生成された後やること
が分かるようになります。
それでは早速解説をはじめます。
目次
設計概略
まずは今回設計するものの概略を考えます。
要点を整理すると以下の表のようになります。
機能 | マイコンが起動してからLEDを1秒ON、2秒OFFを繰り返す |
マイコン | ルネサス社製 RL78 |
使用するマイコンの周辺機能 | 1msのインターバルタイマー割り込み(チャネル0)
入出力ポート(P01) |
備考 | e2studioのコード生成を使用する |
具体的にはこちらの記事で説明した内容のプログラムを作っていきます。
概要など詳しく説明しているのでまずは読んでみてください。
組み込み開発の流れを基礎解説【マイコン基本機能を使って設計】
コードの自動生成
作るものが理解できたら、プログラムを作っていきましょう。
tomozo
設計の大きな流れとしては以下のようになります。
- コードの自動生成(ポート、タイマー)
- ユーザーのオリジナルプログラム作成
- 動作確認
出力ポートのコード生成
P01を出力ポートに設定します。
操作はすべてe2studioです。
①プロジェクトエクスプローラーのウィンドウで
「コード生成」ー「周辺機能」ー「ポート」を選択します。
②周辺機能のウィンドウで
ポート0のタブを選択しP01のラジオボタンをOut(出力)に設定して
「コードを生成する」をクリックしてください。
③コンソール画面でコードの生成が行われたら完了です。
インターバルタイマのコード生成
次にチャネル0を使って1ms設定のインターバルタイマーを
コード生成します。
①プロジェクトエクスプローラーのウィンドウで
「コード生成」ー「周辺機能」ー「タイマ」を選択します。
②周辺機能のウィンドウで
「TAU0」ー「一般設定」のタブを選択し、チャネル0をインターバルタイマー
に設定します。
③チャネル0のタブで
インターバルタイマの時間を1msに設定に
タイマ・チャネル0のカウント完了で割り込み発生にチェックを入れておきます。
④ポート説明同様に「コードを生成する」をクリックしてコード生成したら完成です。
生成コードの確認
さて生成されたコードを見てみましょう
出力ポート関連
プロジェクト・エクスプローラーのsrcフォルダの中にある
- r_cg_port_user.c
- r_cg_port.c
- r_cg_port.h
の3つのファイルが該当します。
r_cg_port.c
以下の部分でP01が出力に設定されています。
r_cg_port_user.c
このファイルは特に何もソースコードはありません。
ポートに関する関数を追加するなどプログラマー(ユーザー)が
自由にプログラミングできるファイルとして用意されています。
何かコードを書くときは
/* Start user・・・ */と/* End user・・・*/とコメントで書かれた行の間に
書くようにしてください。
そうしないと仕様変更などでしコードを再生成した時に
せっかく書いた自分のプログラムが消えてしまいます。
インターバルタイマ関連
プロジェクト・エクスプローラーで確認すると
srcフォルダの中にある
- r_cg_timer_user.c
- r_cg_timer.c
- r_cg_timer.h
の3つのファイルが該当します。
r_cg_timer.c
- R_TAU0_Create
- R_TAU0_Channel0_Start
- R_TAU0_Channel0_Stop
の3つの関数が生成されています。
それぞれ以下の処理をそれぞれ行っています。
- R_TAU0_Create:タイマーの初期設定
- R_TAU0_Channel0_Start:タイマーのカウント開始
- R_TAU0_Channel0_Stop:タイマーのカウント停止
特にタイマーの初期設定はポートと違って色々必要というのが
分かってもらえると思います。
r_cg_timer_user.c
以下の2つのコードがあります。
- #pragma interrupt r_tau0_channel0_interrupt(vect=INTTM00)
- static void __near r_tau0_channel0_interrupt(void)
上の#pragma interruptは割り込み条件とそれはこういう名前の割り込み関数ですよ
というのを宣言しています。
下でなにもない関数として割り込み関数
r_tau0_channel0_interruptが用意されています。
この関数の/* Start user・・・ */と/* End user・・・*/のコメントの間に
割り込みで処理したい内容を記述していきましょう。
ポートもタイマーもどちらもファイル名から
何をしているファイルかイメージできるのではないでしょうか。
何をしているかだいたい分かるファイル名を付けておくと
プログラムの可読性が上がります。
自分でファイルを作るときも分かりやすいファイル名にしましょう。
ユーザーのオリジナルプログラム作成
コードの自動生成では基本機能の骨組みができたので、
LEDは点滅しません。
ここからは自分でプログラミングしていきます。
メインプログラム
メインプログラムはr_main.cファイルにあるmainという名前の関数で定義されています。
R_MAIN_UserInit関数が呼んだあと無限ループでほとんど何もしていない空関数です。
この無限ループの中では
1秒経過したらLED ON
2秒経過したらLED OFFを繰り返すようにします。
具体的には以下のようなプログラムで実行できます。
- LedCountTimerというグローバル変数を用意
- main関数のループの中でLEDのポートP01をON/OFF
- R_MAIN_UserInit関数でインターバルタイマーを開始
インターバルタイマーの割り込み処理
1msのインターバルタイマー割り込みであるt_tau0_channel0_interrupt関数で
グローバル変数LedCountTimerをカウントします。
ちなみに、if文で0でないことを見ているのは、
万一0を見逃してカウントのオーバーフロー
を予防するためです。
組み込みでは、こういった万一を想定してプログラムする
意識が必要になってきます。
新人の頃は先輩が書いたプログラムを見る機会も多い
と思いますので、色々な知識を吸収していきましょう。
動作確認
プログラムができたらいよいよ動作確認です。
せっかく作ったプログラムが思ったように正しく動くところまで確認したいですよね。
組み込みエンジニアの一番楽しい部分です。
作ったプログラムを確認できるスターターキットなどのターゲットボードとデバッガ
がある方はそちらで確認して下さい。
ターゲットボードがない方はe2studioに用意されているシミュレーターを使って見ましょう。
シミュレータの使い方は公式サイトのこちらにある動画が分かりやすいです。
まとめ
設計するもの
- RL78でタイマーと出力ポートでLEDを点滅する
e2studioでコード生成手順を紹介
- 出力ポート
- タイマー
生成されたコードの確認
- ファイルおよび初期設定と空の関数が用意される
自分でプログラミング
- 空の関数の所定の場所にコードを記述する
動作確認
- ターゲットボードやシミュレーターで確認
考になったとか、もっとここが知りたいなど一言でも
コメント、意見などいただけると励みになります。
こちらの記事でマイコンの基本機能についてまとめています。
もしよければご覧ください。
マイコン基本機能5選【初心者組み込みエンジニア必見】
このサイトでは
学校や友人、親は教えてくれない
資産運用についても紹介しています。
できるだけ早く自分の将来のために勉強しておかないと
もっと早く知っておけば良かったって後悔しますよ。
インデックス投資はおすすめ!厳選ファンド(商品)3つと利回り検証