マイコン制御はじめの一歩、LEDを点灯させよう!:S08ではじめるマイコン制御プログラミング(2)(2/3 ページ)
入出力装置なくして、マイコン・システムは成り立たない。今回は基本的な汎用I/O(GPIO)を使ってLED点灯プログラムに挑戦。
LEDを光らせてみる
それでは、典型的な表示装置(デジタル)の1つであるLEDを使い、これをプログラムで制御してみましょう。
まず、プロジェクトを作ります(以下、1〜3の手順)。
1.前回と同じように、Windowsの[スタート]メニューの[プログラム]から[Freescale CodeWarrior]−[CW for Microcontrollers V6.2]−[CodeWarrior IDE]を起動し、表示された「Startup」ダイアログの[Create New Project]ボタンをクリックしてください(図3)。
2.「New Project Wizard」が起動します。これは、ターゲットマイコンやデバッガの種類などを答えていくだけで、必要なパラメータが設定されたひな型プロジェクトを自動生成してくれる便利な機能です。「New Project Wizard」の1ページ目は「Device and Connection」です。左ペインの[HCS08]−[HCS08Q Family]−[MC9S08QE128]を選択し、「Connections」で「P&E Multilink/Cyclone Pro」を指定して、[次へ]ボタンをクリックします(図4)。
3.「New Project Wizard」の2ページ目は、「Project Parameters」です。C言語がチェックされているのを確認し、「Project name」と「Location」を指定して[完了]ボタンをクリックします(図5)。
以上で、図6のようなプロジェクトが作成されます。なお、プロジェクト・ウィンドウのアイコンの意味は以下のとおりです(表2)。
ここまでの作業で必要なファイルは自動生成されています。以下に、各ファイルの概要について説明します(表3)。
ファイル名 | 意味 |
---|---|
main.c | main関数を含むC言語ソース・ファイル |
derivative.h | システム用ヘッダ・ファイル |
MC9S08QE128.h | QE128用レジスタ・ファイル(宣言) |
ansiis.lib | ANSIランタイム・ライブラリ |
MC9S08QE128.c | QE128用レジスタ・ファイル(実体) |
Start08.c | スタートアップ・ルーチン |
burner.bbl | バーナー用バッチ・ファイル |
Project.prm | リンカ・パラメータ・ファイル |
Project.map | リンカ・マップ・ファイル |
表3 プロジェクトに登録されているファイル |
何もしないプログラムの作成
さて、ここまでの作業でいろいろなファイルが生成されましたが、今回の演習で修正するのは「main.c」ファイルだけです。ここにユーザー・プログラムを追加していきます。
それでは、プロジェクト・ウィンドウの「main.c」をダブル・クリックして開いてみてください(図7)。
何やら2つのマクロ(図7の赤枠)を呼び出しているようですが、これらは実質何もしていません。いったん、この状態で[Make]ボタンをクリックし、ビルドしてみてください。エラーなしでビルドが終わるはずです。これで“何もしないプログラム”が完成しました。
――突然ですが、「プログラムはどこから開始されますか?」
- main関数から(Cプログラマですね)
- リセット・ベクタに書かれたアドレスから(アセンブリプログラマですね)
どちらも正解です。K&R本(注)などでC言語を勉強されてきた皆さん。前回のデモ・プログラムをどのように起動したか思い出してみてください。コマンド・プロンプトから「a.out」と入力しましたか? ウィンドウが開いてデモ・プログラムのアイコンをダブル・クリックしましたか? いえいえ、単に“ボードの電源を投入しただけ”ですよね。
C言語のプログラムは確かにmainからはじまります。しかし、マイコンの動きとしてはROMの特定の場所にあるリセット・ベクタに書かれたアドレスからプログラムが起動します。この違いを吸収する役割を果たすのが「スタートアップ・ルーチン」です。
リセット・ベクタには、スタートアップ・ルーチン(_Startup関数)のアドレスが書かれています。スタートアップ・ルーチンは、C言語を使用するための環境を構築し、main関数を呼び出す処理を行います。今回のようにOSを使わないマイコンのプログラムでは、main関数から“出る”ことはありません(“出る”ということは暴走を意味しますから)。CodeWarriorでは、この部分を自動生成してくれますので、皆さんはシステムが使える状態でプログラムを組むことができます。
――再び突然ですが、「プログラムが暴走したときはどうしますか?」
Windowsのアプリケーションでしたら、タスク・マネージャで該当するアプリケーションを終了できますが、Windows OS自体がフリーズしたり、携帯電話や情報家電製品の動作が不安定になったりした場合はどうしますか? ――ありますよね。あの伝家の宝刀「リセット・ボタン」が!
マイコンもこれと同じです。プログラムの暴走などで不安定になった場合、安全のためにリセットを掛ける仕組みがあります。「COPウォッチドッグ・タイマー」もその1つです。これは、ある一定時間ごとに特定のレジスタをアクセスすることで、マイコンに「正常に動作しているよ」と知らせるもので、もし、プログラムが暴走してこの動作がなされないような場合には自動的にリセットが掛かるようになっています。
この機能は、初期状態で「ON」になっています。安全でとてもよいのですが、プログラミングの学習を行う際は本来の処理が分かりにくくなり、はっきりいって邪魔物です。というわけで、本連載ではこの機能を「OFF」にすることにします。
リスト1のように、main.cに「SOPT1_COPE = 0」を追記し、「__RESET_WATCHDOG()」の記述を削除してください。
「SOPT1_COPE = 0」の記述は、SOPT1レジスタのCOPEビットをゼロにするという意味で、COPウォッチドッグが「OFF」になります。また、削除した「__RESET_WATCHDOG()」はレジスタへアクセスしに行く処理です。
Copyright © ITmedia, Inc. All Rights Reserved.