前回に引き続き、テキサス・インスツルメンツ(TI)のMSP430™ LaunchPadバリュー・ライン開発キットを用いて、実際のマイコンのハードウェア、ソフトウェアの開発方法を体験しながら学びます。今回は、ハードウェアとして数字表示用の7セグメントLED回路を追加し、プログラムを作って動かしてみましょう。
7セグメントLED回路を追加する
MSP430 LaunchPadのターゲット回路には、入出力拡張用として10ピンのピン・ヘッダが2個付いています。これを利用して、20ピンおよび14ピンのMSP430マイコンの任意のピンに外部回路を接続できます。20ピンの場合は、図1のようにポート1(P1.7〜P1.0)、ポート2(P2.7〜P2.0)の2つの8ビット汎用デジタルI/O(GPIO)ポートを利用可能です。
このうち、P1.0(LED1)、P1.6(LED2)、P1.3(S2)は基板上ですでに部品が接続されているので、何も接続されていないポート2の方を利用してみます。
7セグメントLEDは、図2のように数字の字形を7個の断片(segment)に分割してLED表示するもので、各セグメントはa〜gと呼ばれています。さらに小数点(DP)も表示可能なものが一般的です。8個のLEDは独立に点灯/消灯できますが、ピン数を減らすために、アノード側またはカソード側のどちらかを共通接続しています。
アノードコモンの場合は、アノード側を電源(VCC)に接続して、カソード側は抵抗を介して出力ポートに接続します。ポートに"0"を出力すればそのLEDは点灯し、"1"を出力すれば消灯します。
カソードコモンの場合は、カソード側をGND(0V)に接続して、アノード側は抵抗を介して出力ポートに接続します。ポートに"1"を出力すればそのLEDは点灯し、"0"を出力すれば消灯します。
このように、アノードコモンとカソードコモンでは接続方法も異なり、点灯/消灯を制御するプログラムも変わりますから、注意が必要です。
マイコンの出力ポートを使ってLEDを点灯する場合、供給可能範囲の電流しか流せません。必ず電流制限抵抗を挿入して、電流をその範囲に制限することが必要です。MSP430の汎用デジタルI/Oでは、供給可能電流は1ビットあたり最大±6mA、1ポートあたり最大±48mAです。ここでは、470Ωの抵抗を用いて電流を約3.2mAに制限しています。
図3にアノードコモンの7セグメントLEDを用いた回路図と、実装例を示します。
赤色2桁7セグメントLEDのA-552SRD(ParaLight社)を使用し、今回はそのうち1桁だけを配線した。電流制限抵抗は470Ωで、各セグメントのLEDには約3.2mAの電流が流れる。
スイッチを押すごとに1ずつ数値が大きくなるプログラムの例
図3の拡張によって、1桁の数字を表示できるようになりました。これを何に利用するかはプログラムで決まります。ここでは、スイッチS2を押すごとに0⇒1⇒2⇒…⇒9⇒0⇒…というように、1ずつ数値が大きくなるプログラムを作ってみましょう。マイコンは前回と同じMSP430G2553です。
開発環境のCCS(Code Composer Studio)を起動して、図4のようにFile→New→Projectを選択すると、ウィザード選択(Select a Wizard)画面が開きます。図5のようにCCS Projectを選択すると、前回説明した新規プロジェクト情報の設定画面(New CCS Project)になります。今回は、「7segLED1」という名称のプロジェクトにしました。
図6に作成したmain.cのソースを示します。
(1) ヘッダファイルの指定と変数の宣言、初期化
1行目はヘッダファイルの指定、2〜6行目はプログラムで使用する変数の宣言と初期化です。表示値を保持する変数n、前々回と前回のスイッチ状態を保持する変数bbs2、bs2、ループ回数をカウントする変数iを宣言しています。
(2) ポート1とポート2の設定
main関数では、11行目でウォッチドッグタイマを停止し、12〜20行目でポート1、ポート2の設定を行っています。ポート2は全ビットを出力に設定し、初期値は"1"(LED消灯)を出力しておきます。なお、P1SEL、P1SEL2、P2SEL、P2SEL2という4つのレジスタはポート1、ポート2がもつ多機能ピンの機能設定用で、汎用デジタルI/Oとして使用する場合は、あらかじめ各ビットに"0"を書き込みます。ただし、ほとんどのビットはリセット時に"0"に初期化されるので、この設定を省略しても動作します。今回は、P2.6とP2.7の設定が必要でした。
(3) 繰り返し処理
設定終了後は、22行目からのfor文を無限に繰り返します。
for文の中では、まず23行目でP1.3の状態を変数s2に読み込みます。P1.3はスイッチS2が押されたとき"0"になり、変数s2には0x00が入ります。S2が押されていないときは"1"になり、変数s2には0x08が入ります。
スイッチが押された回数を正しく数えるためには、P1.3が"1"から"0"に変化したことを検出する必要があります。また、スイッチ接点は、押された瞬間にごく短時間(0〜数ms程度)状態がばたつく現象(チャタリング)があります。そのため、ここではスイッチの状態を約10msごとに読んでバッファに保持し、「前々回が"1"かつ前回が"0"かつ今回も"0"」という条件(24行目のif文の条件式)のときスイッチが1回押されたと判定します。これはチャタリング除去と呼ばれる処理です。
チャタリングを除去してスイッチが1回押されたと判定できたら、switch文を用いて、表示値nに対応する表示データをポート2に出力します。"1"を出力したビットは消灯、"0"を出力したビットは点灯し、7セグメントLEDに字形が表示されます。nが0〜8のときは、出力後にnの値を1増やし、break文でswitch文から抜けます。nが9のときは、出力後にnの値を0にします。nがそれ以外の値(ここではdefault)のときは、ポート2の出力は変えずに、nの値を0にします。
39〜40行目では、P1.3の今回の状態を前回に、前回の状態を前々回に移します。41行目のfor文で、約10msの時間待ちを作っています。
このように、MSP430 LaunchPadにさまざまな回路を外付けすれば、マイコンをいろいろな用途に活用できるようになります。
※MSP430はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。
TIのマイコン製品の詳細はこちら
宮崎 仁のマイコン基礎の基礎 第15回「MSP430 LaunchPadの入出力機能を活用する、
スイッチ割り込みとタイマ割り込みを使ってみる」は、12/25(水)の公開を予定しています。
提供:日本テキサス・インスツルメンツ株式会社
アイティメディア営業企画/制作:EDN Japan 編集部/掲載内容有効期限:2014年3月31日
Copyright © ITmedia, Inc. All Rights Reserved.