マイコン入門:5 of 6
組み込みシステムの技術者に必要なマイコンの基礎知識を解説しています。いよいよ、今回が最終回。プログラミングとその実行を学びます。レッツトライ!
事前準備が肝心!
「マイコン入門」最終回の今回は、プログラミングとその実行を学びます。さまざまなプログラミング言語がありますが、組み込みシステムでは定番で、ルネサスの統合開発環境「CS+」が対応しているC言語で解説を進めます。前回と同様にハードウェアは、マイコン開発キットの「RL78/G14 Stick スターターキット(RL78G14-STICK)」を使用します。
プロジェクトの設定
最初に、プログラミング作成のために「プロジェクト」を準備します。
- 「CS+」のメニューの「ファイル(F)」から「新規作成(N)」→「新しいプロジェクトを作成(N)…」をクリックします。
- 「プロジェクト作成」ポップアップが表示されます(図1)。
- マイクロコントローラに「RL78」を選択します。
- 検索ボックスに「R5F104LE」と入力し、下に表示される「R5F104LE(64pin)」を選択します。
- プロジェクトの種類は「アプリケーション(CA78K0R)」を選択します。
- プロジェクト名は任意ですが、ここでは「test01」としました。最後に「作成(C)」ボタンを押して、プロジェクトを作成します。
デバッガの設定
続いて、プログラムの誤りや不具合などのバグを修正(デバッグ)する「デバッガ」を設定しましょう。
「プロジェクト・ツリー」の「RL78シミュレータ(デバッグ・ツール)」を右クリックして、「使用するデバッグ・ツール(D)」をクリック。各種デバッガが表示されますので、「RL78 EZ Emulator(Z)」を選択してください(図2)。
ビルドの設定
次は、C言語で書いた元のファイル(ソースファイル)をコンパイル(機械語に翻訳)し、さらに複数のファイルを結合(リンク)して、マイコン上で実行可能な機械語データを作成する「ビルド」を設定します。「プロジェクト・ツリー」の「CA78K0R(ビルド・ツール)」を右クリックして、ビルドメニューを表示し、その中の「プロパティ(P)」を選択(図3)して下さい。
ビルドのプロパティ表示からは「リンク・オプション」のタブを選択します(図4)。
「リンク・オプション」の「デバイス」設定を以下のように変更してください。
- 「オンチップ・デバッグを設定する」を「いいえ」から「はい(-go)」。
- 「オンチップ・デバッグ・オプション・バイト制御値」に「85」を入力。
- 「ユーザー・オプション・バイトを設定する」を「いいえ」から「はい(-go)」
- 「ユーザー・オプション・バイト値」に「FFFFE8」を入力。
変更すると下の図のようになります。
以上で、「プロジェクト」の設定が完了しました。
開発環境により必要な設定や方法が異なります。マニュアル等を参照して、しっかりと事前準備を整えることが大切です。
LEDが点滅したら大成功!
事前準備が整ったので、プログラムの入力を行いましょう。まず、プログラムを記述するファイルを作成します。作成方法は、「プロジェクト・ツリー」の「ファイル」を右クリックして、「追加(D)」の「新しいファイルを追加(N)…」を選択してください。
「ファイル追加」のポップアップが表示されます。そこで「Cソース・ファイル(*.C)」を選択し、ファイル名の枠に「main.c」と入力してください(図7)。
作成した「main.c」に、下のプログラムを入力します(図8)。
このプログラムは、マイコン入門(2)と(3)においてLEDを点滅させた手順を、プログラムによって実現したものです。入力を終えたら、早速、その動作を実行してみましょう。
「メニュー」の「デバッグ(D)」をクリックし、「ビルド&デバッグ・ツールへのダウンロード(B)」を選択すると(図9)、プログラムがコンパイル、リンク、ダウンロードと順に実行されます(図10)。
この状態で「F5」キーを押すとプログラムが実行され、LEDが点滅します!
書き方を覚えれば組み込みも簡単
この「マイコン入門」では、マイコンの基礎知識を解説してきました。そのため、プログラミング言語についての解説を省いています。最後に、今回「main.c」に入力したプログラムを簡単に眺めてみましょう。
2行目: #pragma sfr
マイコン内部の特殊機能レジスタ「SFR」の値を設定可能にします。これにより、9行目のPM7と10行目のP7の記述が可能になります。
3行目: #pragma NOP
15行目の何もしない関数NOP()を使用可能にします。
5行目: unsigned long int i;
変数 i の定義を行っています。変数 i は符号が付かない(つまり正数の)32ビット整数を定義しています。
7行目: void main(void)
main関数を定義しています。型がvoidでvoid型の引数をとる関数として定義しています。通常はこのmain関数の内部に書かれたプログラムが最初に実行されることとなります。
9行目: PM7.7 = 0;
10行目: P7.7 = 0;
LEDを点灯するためにP77とPM77レジスタの値を変更しています。このイコール「=」は数学的なイコールではありません。右の値を左の変数に代入するという命令です。したがって、PM77レジスタに0が、P77レジスタに0が代入されます。
12行目: while(1) {
whileループ文と呼ばれ丸括弧の中が真を表す1であれば、次の{}の内部のプログラムを繰り返し実行します(無限ループ)。
13行目: P7.7 = ~P7.7;
右の値を左の変数に代入せよという命令です。右と左に同じP7.7がありますが、最初にイコールの右側が実行されP7.7の値が読み込まれます。「~」は演算子で、値の0と1を反転します。つまり、0が1に、1が0になります。この行が実行されるたびLEDが点滅します。
14行目: for (i=0 ; i<=1000000 ; i++) {
forループと呼ばれる繰り返し命令です。iの値をカウントアップさせて100万になるまでループさせます。
15行目: NOP();
forループで繰り返される部分ですが、何もしない関数NOPが繰り返されるので、何もせず時間が経過します。つまり、14行目と15行目によって点滅の期間を調整しています。
ここまでお付き合いいただいた読者の方には、まだ物足りないかも知れませんね。14行目の1000000の数値を変更するとLED点滅の速さが変わります。例えば、「RL78/G13 Stickスターターキット」には、可変抵抗が付いています。ADコンバーターで抵抗によって調整されたアナログ値を読み込んで、点滅スピードに反映するプログラムに挑戦してみてはいかがですか。
C言語にはIf文やcase文などの重要な文法がたくさんあります。それらを組み合わせれば、より複雑なプログラムが可能です。ぜひ、しっかりと学んでください。
今回でマイコン入門は最終回です。組み込みプログラミングは、ハードウェア固有の記述が難しいと言えるでしょう。セミナーへ参加したり、サンプルプログラムを参考にしたりして、マイコンへの理解を深める事が一番の解決方法です。レッツトライ!
※この記事は2015年3月13日に改訂しました。
「電子工作入門」 では実際の「モノづくり」に挑戦できます。こちらも是非ご覧ください。