とりあえず、何もしないプログラムを作成してみます。
左側にファイルのリストが表示されていると思いますが(表示されていないときは[表示] > [ワークスペース])、"C source file" カテゴリ中の<プロジェクト名>.cファイルをダブルクリックしてください。そうすると、そのファイルが開かれてエディタが表示され、編集できるようになります。
#ifdef __cplusplus
で囲まれたよく分からないコードがごちゃごちゃと書いてありますが、これはC++で開発するときに必要な構文が自動生成されているもので、今回は必要ありません。今回必要なのは以下の文だけです。
void main(void)
{
}
他は残しておいても構いませんが、消しても構いません。
とりあえず、明示的に無限ループに入るよう少しコードを書いてみます。
void main(void)
{
while(1);
}
これで最低限のプログラムが完成したので、コンパイルおよびビルドをしてみましょう。
[ビルド] > [ビルド] メニューを選択すると、変更されたファイルを自動的にコンパイルして、その後ビルドしてくれます。F7キーを押しても、ツールバー上の「ビルド」ボタンをクリックしても同じです。
初回は少し時間がかかりますが、ウインドウ下部に進行状況が表示されるので気長に待ちましょう。
L1100 (W) Cannot find "C" specified in option "start"
というようなWarningが表示されることがありますが、これは定数領域に入れるべきものがないという意味で、一個も定数を使っていないときに表示されます。ためしにmain()関数の前に
const int i = 0;
void main(void)
{
while(1);
}
と入れてみると、Warningは表示されなくなります。
なにはともあれ、"Build Finished"と表示されたなら、ビルドは成功です。これで何もしないプログラムが完成しました。
しかし何もしないプログラムでは、正常に動いているかどうかが分からないので、LEDを点滅させるプログラムを作成してみましょう。
まずは、IOレジスタ定義ファイルをインクルードします。以下のように記述します。
#include "iodefine.h"
void main(void){
while(1);
}
一度この状態でビルドしてみましょう。すると、左側のリストの"Dependencies"カテゴリに、"iodefine.h"ファイルが追加されるはずです。ここには、インクルードしたファイルが自動的に追加されるので、ヘッダファイルなどの内容はここから編集できます。
一度、"iodefine.h"ファイルの中身ものぞいてみましょう。よくわからないコードがずらずら並んでいますが、マイコンの各種レジスタを可読な形に置き換えたものです。
詳しいことはひとまず置いておいて、とりあえず必要最小限の機能だけ使ってみましょう。
LEDを点滅させるプログラムは以下のようになります。
#include "iodefine.h"
void main(void){
int i;
CPG.FRQCR.WORD = 0x16db; // Iφ=48MHz
PFC.PECRL1.BIT.PE1MD=0x00; //IO端子に設定
PFC.PEIORL.BIT.B0 = 1; //出力端子に設定
while(1){
for(i=0;i<1000000;i++); //100万回 空ループでウェイト
PE.DRL.BIT.B0 ^= 1; //出力を反転
}
}
順を追って説明します。
CPG.FRQCR.WORD = 0x16db; // Iφ=48MHz
ますはこれですが、いきなりですが詳細は省きます。クロック発振器の設定を変更して、CPUのクロック周波数を48MHzに変更しています。
PFC.PECRL1.BIT.PE1MD=0x00; //IO端子に設定
つぎにこれは、ポートEのビット0(PE0)をIOピンとして設定しています。マイコンでは1つのピンに複数の機能が割り当てられているので(マルチプレクス)、どの機能を使うか選択する必要があります。実はデフォルトがIOピンなので設定の必要はないのですが、IOピンであることを明示するためにわざと書きました。詳細はハードウェアマニュアルの15章を参照してください。
PFC.PEIORL.BIT.B0 = 1; //出力端子に設定
次に、ポートEのビット0のIO端子の入出力方向を出力に設定しています。"0"で入力、"1"で出力です。これも詳細はハードウェアマニュアルの15章を参照してください。
for(i=0;i<1000000;i++); //100万回 空ループでウェイト
つぎにこれですが、10万回無駄にループすることで時間をかせいでいます。これによって点滅の周期が決まります。SHは処理速度が速いので、ループ回数が少なすぎると人間の目で認識できなくなります。32ビットCPUなのでint型は32ビット整数になり、32767を超えても問題ありません。
PE.DRL.BIT.B0 ^= 1; //出力を反転
最後にこれですが、もとの出力と"1"の否定論理積をとることで出力を反転させています。分かりにくければ、次のように変えてもいいです。
for(i=0;i<1000000;i++); //100万回 空ループでウェイト
PE.DRL.BIT.B0 = 1; //1を出力
for(i=0;i<1000000;i++); //100万回 空ループでウェイト
PE.DRL.BIT.B0 = 0; //0を出力
PE0を出力端子にしてPE.DRL.BIT.B0に値を書き込むと"1"で5V出力、"0"で0V出力されます。PE.DRL.BIT.B0を読み込むと端子の出力の状態が調べられます。
これをビルドして、LED点滅プログラムの完成です。