C言語の授業でこの様なプログラムを作成したことがあると思います。
#include <stdio.h> //必要な機能を読み込む
void main(void){ //メインの処理一式
int a,b //変数を宣言
printf("1つ目の数字を入力");
scanf("%d",&a); //入力待ち
printf("2つ目の数字を入力");
scanf("%d",&b); //入力待ち
printf("数字は%dと%dです\n",a,b); //出力
getchar(); //キー入力があるまで待機
//プログラム終了
}
プログラム起動
使いたい変数を設定
キー入力があるまで待機(プログラム一時中断)
入力された数字を表示
キー入力があるまで待機(プログラム一時中断)
キー入力があったらプログラム終了
これに対してマイコン用プログラムの例
#include "iodefine.h" //必要な機能を読み込む
main(){ //メインの処理一式
int a,b; //変数を宣言
init_io(); //IOポートの初期化
while(1){ //無限ループ
a=switch1_in(); //スイッチ1の状態取得
b=switch2_in(); //スイッチ2の状態取得
if(a==1){ //スイッチ1が押されたとき
out_LED1(1); //LED1を点灯
}else{ //スイッチ1が押されていないとき
out_LED1(0); //LED1を点灯
}
if(b==1){ //スイッチ2が押されたとき
out_LED2(1); //LED2を点灯
}else{ //スイッチ2が押されていないとき
out_LED2(0); //LED2を消灯
}
}
}
プログラム起動
使いたい変数を設定
IOポートの初期化
無限ループ開始
スイッチ1が押されているか押されていないか確認(待たない)
スイッチ2が押されているか押されていないか確認(待たない)
スイッチ1が押されてるとき
LED1を点灯
スイッチ1が押されていないとき
LED1を消灯
スイッチ2が押されてるとき
LED2を点灯
スイッチ2が押されていないとき
LED2を消灯
無限ループの先頭に戻る
この2つのプログラムの決定的な違い
1:IOポートの初期化が必ず存在する
マイコンの端子は入力としても出力としても使う事が出来ます。
しかし、マイコンに電源を入れた直後はマイコンの端子は入力に
するか出力にするか決まっていません。
※通常は全て入力に設定されています。
沢山あるマイコンの端子のどれを入力にしてどれを出力に設定するのか
事前に指示をしておく必要があります。
この設定がIOポートの初期化です。
パソコンのプログラムの場合はOS等や各装置のドライバプログラムがIOの
初期化相当の処理を行っています。
2:プログラムが終了しない(無限ループ)
授業で習ったプログラムでは1連の処理が終わったらプログラムが
終了していたと思います。これに対してマイコンのプログラムは必
ず無限ループをする箇所が存在します。
「無限ループに入って抜けられなくなっちゃったよ」とか
無限ループというとあまり良い印象が無いかもしれません。
作業が終わったら終了して欲しいものです。
では、マイコンの場合はどうでしょう。
ラジコンの場合を考えます。
1:電源ON
2:ボタンが押されるまで待ちます
3:ボタンが押されたら動きます <ここまではOK>
4:動いたのでプログラムを終了します
終了したので次にボタンが押されようが反応しません。
これでは使い物になりません。
電源を入れたら動き始めて、電源を切るまでは作業を続けなければいけません。
3:入力されるのを待たない
これもラジコン(戦車)の場合で考えてみましょう。
右のボタンを押したら右の車輪が動いてほしい。
左のボタンを押したら左の車輪が動いてほしい。
入力待機をする場合
右のボタンだけ押してみる
⇒左のボタンが押されてないのでプログラムが先に進まない
左のボタンだけ押してみる
⇒右のボタンが押されてないのでプログラムが先に進まない
結局ボタンを両方押さないと進まない。
真っ直ぐにしか進めない。
これでは使い物になりません。
ボタンが押されていても押されていなくてもその状態を受け入れて
プログラムを先に進めなければいけません。