プログラムを作成する場合のモットー、できるだけ自分でキーボードを叩かない・・・ それには、
→ コピペで前に使ったコードを持ってくる ・・・ もしくは、
→ サンプル・プログラムを探してきて、それを改造する。
これが 一番楽な方法でしょう。 自らキーボードで文字を打ち込む場所は、コメントの部分だけにして、ここだけは時間をかけてでも できるだけ分かりやすい文章にすべき、力を入れるべき所です。
よって、ハードウェアにおける「Hello world」プログラムともいえる 「LED点滅」=俗にいう「Lチカ」も サンプルプログラムを見つけてきて、実行し 自分では できるだけ文字を打たなくて済むように工夫しましょう。
1) まずは、資料集めから
MSP430の開発キット LaunchPad : MSP-EXP430G2 のデータシート、ユーザーズマニュアル等、PDFファイルの資料をインターネットから探しまくり、ダウンロードしました。 どのポートにLEDが繋がっていて、どのポートにスイッチが繋がっているのか?分からないことには プログラムの作りようがありません。 入手した簡単な(日本語の)回路図が こちら ↓
ポート1のゼロ・ビット目=P1.0 に 赤のLEDが接続されているのが分かります。 (これが LED1)
もう1つ、ポート1の6ビット目=P1.6 に 緑のLEDが接続されてます。 (これが LED2)
両方のLEDとも、Hi = '1' を出力すると、LEDが点灯します。
そして、ポート1の3ビット=P1.3 に 押しボタンスイッチ(S2)がつながっています。 つまり、ここは入力ポートにしないといけません。
スイッチを押した時に、Low = '0' が読みだされ、押されていない時はHi = '1' が読みだされます。(プルアップ抵抗がMCUの中にあり、設定で接続することができる)
2)プロジェクトの作成
新たに、”BuildLED” という名称でプロジェクトを作成しましょう。 今度は最初からちゃんと MCUのターゲットは MSP430G2553 にセットして作成していきます。 (これは一度セットすると、次に変更するまでは同じターゲットのままでいるようで、しばらくは G2553のまま 再入力しなくても良いでしょう)
CCSを起動し、メインメニュー:Gettting Started画面で 「New Project」を実行、その画面内で ① ターゲットのDevice=MSP430G2553にセット
② プロジェクト名を入力 ( 例: blinkLED )
③ BASIC Examplesで 「Blink The LED」を クリックしてから、
④ [Finish] ボタンを押す。
すると、 blink.c というファイル名で サンプル・プログラムが入ったファイルが自動で作成されます。 ↓
このサンプルプログラムは、LED1(赤)を 激しく点滅させる(LEDをチカチカさせる)だけのプログラムです。
3)実行してみる
何ひとつソースの文字を打ち込むことなく、プログラムが完成してしまいました。 F11キーを押して Debugを開始すると、ビルトも自動でやってくれます。 実行コードがLaunchPadに書き込まれ、しばらくすると main()関数の先頭の { カッコの所で 実行が一時停止した状態まで進みます。 (8行目の緑の矢印の所で停止している)
F8キーで プログラムの続きを 実行させると・・・
赤いLEDが激しく点滅します。
上の状態から F5キーで 1行づつ 確認しながら ステップ実行させることもできます。
例えば、 10行目 P1DIRに1を書き込むと P1=ポート1のビット0が出力ポートになり、初期状態でHiが出力されます→ LED1がいきなり点灯するのが分かります。
次に 16行目の P1OUT ^= 0x01; を 実行すると、ビット0の状態が ^= XOR命令で反転するので LED1は消灯します(=Lowが出力された)
その後の forループで 変数 i が 1万から1づつ引かれ、ゼロになるまで繰り返され・・・ これでしばらく時間待ちになります。=LEDの点灯or消灯時間。
そして、点灯/消灯を繰り返します。
どこのタイミングでも良いので F8キーを押すと、ずっと実行されるので(実行開始)LED1 が 点滅したままの状態になります。 このプログラムがMCUに実際に書き込まれたので、次に CCSから実行しなくとも 基板に電源をつなぐだけで、赤いLEDの点滅は実行されたままになります。
つまり、このLaunchPadはプログラム・ライターとしても機能するということです。
プログラムの中で volatile という あまり見かけない命令が出てきますが、これが宣言されている 変数は、「最適化」を行わないようにするための指定です。 ここでは 変数i が最適化から外れて、(レジスタ変数では無く)必ずメモリ上の変数がアクセスされます。
つまり、レジスタ変数等に割り振られて超高速に動作し、不要な命令が実行されなくなってしまうのを防ぐことができます。 (時間を待たせるための空ループもちゃんと実行されます)
。
※コメント投稿者のブログIDはブログ作成者のみに通知されます