6 プログラムの内容

続き(6 プログラムの修正)を見る

 

書き込んだプログラムの内容
書き込んだプログラムは、LEDを点滅させるものです。点滅という意味ではさっきと同じなんですが、点滅のスピードが違っていると思います。ここで青いボタンを押してみて下さい。点滅のスピードが遅くなったと思います。
単純すぎておもしろくないかも知れませんが、これがすべての基本なんですよ。LEDを点滅させられるということは、デジタル出力ができているということになります。つまり、ピンから出力される電圧の高低を、コントロールできているということです。 このセミナーの最初に紹介した、マイコンの機能のうちの「表現する」ができたということになりますね。
ボタンが押されているかどうかが分かったということは、デジタル入力を読み取ることができたということです。つまり、ピンに入力されている電圧の高い低いがわかったということです。これはマイコンの機能のうちの「感じる」ができたということです。
そしてこのマイコンはプログラムに従って常にスイッチが押されているかどうかを確認して、LEDを速く点滅させるかどうかを判断しています。つまり「考えて」いるわけですね。
もちろん、「表現する」方法はLEDの点滅以外にもいろいろありますし、「感じる」方法もスイッチ以外にもいろいろあります。ただちょっと言い過ぎかも知れませんけれども、その他のマイコンの利用方法というのは、このデジタル入力、出力の応用です。ですので、まずはこれをしっかりマスターするところから始めないといけません。
それでは実際にマイコンにこの動作をさせるプログラムを見てみましょう。ここでプログラムをやったことがある方は、このプログラムの内容がだいたい想像できるんじゃないでしょうか。要はループ処理で、まずは、ボタンが押されているかどうかを確認する、ボタンが押されていればゆっくりと点滅させる、ボタンが押されていなければ早く点滅させる、そして最初に戻ってまたボタンが押されているかどうかを確認する、あとはこの繰り返しという流れです。実際このプログラムもその流れになっていますので、確認してみましょう。
サンプルプログラムのソースを読む
eclipseの画面を見てもらって、左側のプロジェクトエクスプローラの中にあるSTM32プロジェクトの下の、main.cをダブルクリックして下さい。真ん中の空白だった部分に、ソースコードが現れたと思います。これがコードビューです。右側のスクロールバーをつかって、コードをスクロールさせていって下さい。63行目にmain関数、mainというキーワードで始まる部分でありますのでこれを見つけて下さい。C言語では、プログラムはmain関数から始まるのがお約束になっているので、このプログラムもここから始まります。
ここで冒頭にある4行分のプログラム、行番号でいうと66〜69行まで
スラッシュ2個から始まる行  // Configure board specific setting
BoardInit();という行
/*からはじまるGPIO Configurationという行
GPIO_Configuration():という行
ですが、ここはとりあえず無視しておいて下さい。ボードやIOの初期設定ですので、今は気にする必要はありません。
次にwhileループがあります。72行目です。引数が(1)になっているので無限ループです。C言語でwhileというキーワードを書くと、その後の括弧で挟まれた部分を条件が成就している間繰り返します。条件というのは(1)の部分で、ここの数値が1以上となっている間は繰り返すという意味です。ここではそのまま1が書かれていますから、ずっと繰り返すという意味になります。74行目の処理から88行目の処理までをひたすら繰り返すということです。
次にif文があるんですが、ここの処理の中で、マイコンの入力ポートへの状態を読み取っています。if文はその後の括弧の中の条件が1を返していたらその次の行を実行する、0だったら、else文の次の行を実行するという処理をします。正確に言うと0以外は全部条件成就ですが、その話はここでは置いておいて、とにかくここでは1なら次の行を実行、0ならelseに飛ぶと考えておいてください。
GPIO入力を読む
条件処理の中にGPIO_ReadInputDataBitという関数があります。これはST社が提供してくれているファームウェアが用意してくれている関数です。関数の名前が機能を表しているんですが、GPIO、これは汎用入出力という意味です、GPIOを、read、読み込む、input、入力の、DataBit、データビットを、となります。つまり入出力のデータのビットを読み込むという機能を持っている関数です。そのままですね。引数で、引数というのは関数の後の括弧です、どのポートのどのピンを読み込むかを指定します。
ポートというのはピンのグループ分けだと思って下さい。Value Line Discoveryの上を見ると、ピンの部分にPA1とかPB3とか書いてあります。このPと数字の間のABCがグループ分けで、ポートと読んでいるわけです。でそのグループの中に最大で16個のピンがあって、ピンは番号で分けられています。GPIO_ReadInputDataBit関数には、ポートAの8番という風に指定をしていけばいいわけです。
ちなみにですが、ボードを見ただけでは分かりづらいんですが、この青いスイッチはマイコンのポートAの0番に接続されています。なので、GPIO_ReadInputDataBit関数の引数には、GPIOAとGPIO_Pin_0が指定されているわけです。でこの関数を実行するとどうなるかということなんですが、引数で指定したピンに入力されている電圧が低ければ0を、電圧が高ければ、1を返します。ちょっと技術的な話になりますが、Value Line Discoveryの青いスイッチ、これをユーザースイッチと呼んでいるんですが、内部ではプルダウン接続という接続の仕方がされています。
プルアップスイッチの出力
細かいことはおいておいてどういうことになるかというと、スイッチを押しているときには、スイッチ部分の出力の電圧は高くなって、電源電圧ぐらい、このボードでいうと3.3Vになります。スイッチを押していないときは、スイッチ部分の出力電圧部分は0Vになります。
ここまでの話をまとめると、スイッチを押しているとスイッチの出力電圧が高くなる、GPIO_ReadInputDataBit関数は1を返す、if文の条件が成就されたことになるので、if文の次の行を実行する。スイッチが押されていないとスイッチの出力電圧が低くなる、GPIO_ReadInputDataBit関数は0を返す、if文の条件が成就されていないことになるので、else文の次の行を実行する。ということです。
GPIO_ReadInputDataBit関数を使いこなすことができるだけで、プログラムを、マイコンへの入力に応じて、自由に条件分岐させられることが分かると思います。
で、このプログラムで、実際に条件分岐の結果がどうなっているかというと、変数に入る数値が違っているだけです。変数というのは数値を入れる箱ですが、ここではTimeという変数、箱を用意しています。このTimeはあとあとLEDを点滅させるときの点灯・消灯時間を指定しています。ここに入れる数字が大きい方が点灯・消灯時間が長いので、LEDの点滅が遅くなるということになります。数字が小さいと、点灯している時間、消灯している時間が短くなるので、点滅が早くなります。実際の数字ですけれど、if文の次の行、スイッチが押されている時に入る数は500を指定しています。elseで入れる方は100です。つまり、スイッチを押されていない時の方が速いということです。
ここまでがマイコンに入力されている電圧による条件分岐です。