Special
» 2013年12月25日 00時00分 UPDATE

マイコン基礎の基礎:第15回 MSP430™ LaunchPadの入出力機能を拡張する、便利なスイッチ割り込みとタイマ割り込みを使ってみる

[PR/EDN Japan]
PR

 前回に引き続き、テキサス・インスツルメンツ社(TI)のMSP430™ LaunchPadバリュー・ライン開発キットを用いて、実際のマイコンのハードウェア、ソフトウェアの開発方法を体験しながら学びます。今回は、前回追加した7セグメントLED回路を活用して、便利なスイッチ割り込みとタイマ割り込みを体験してみましょう。回路図は前回と同じです(図1)。

mm131225_micon15_1.jpg 図1 7セグメントLEDを追加した回路図

赤色2桁7セグメントLEDのA-552SRD(ParaLight社)を使用し、今回はそのうち1桁だけを配線した。電流制限抵抗は470Ωで、各セグメントのLEDには約3.2mAの電流が流れる。


スイッチを押すごとに1ずつ数値が大きくなるプログラムの例〜その2

 前回は、スイッチS2の状態を常時プログラムで監視して、スイッチが押されたら7セグメントLEDの表示を1ずつ加算するプログラムを作成しました。この方式では、いつ押されるか分からないスイッチを監視するために、無限ループのプログラムを走らせ続けなければなりません。このやり方には、2つの大きな問題点があります。

 スイッチの監視以外に、マイコンにはいろいろな仕事をさせたいのが普通です。1つ目の問題点は、定期的にスイッチを監視するようなループがあると、他の仕事の邪魔になってしまうことです。また、その分だけ実効的な処理効率が低下してしまいます。

 それとは逆に、他にやらせたい仕事がない期間は、マイコンをスリープさせてシステムの消費電力を減らすことも重要になっています。2つ目の問題点は、無限ループでスイッチの監視を続けていると、スリープできずに無駄に電力を消費してしまうことです。

 どちらの問題に対しても、割り込みの活用が有効な対策となります。割り込みは、マイコンの外部の信号や、タイマなどの内蔵機能の状態が変化したときに、あらかじめ用意しておいた特別なプログラム(割り込みサービスルーチン)を起動するというしくみです。

 今回使用しているMSP430G2553では、ポート1(P1.0〜P1.7)、ポート2(P2.0〜P2.7)の任意のビットを割り込みに使用できます。MSP430 LanchPadのターゲット回路では、スイッチS2が接続されているP1.3の割り込みを利用すれば、無限ループで監視しなくてもスイッチが押されたことを検出できます。

 図2に作成したmain.cのソースを示します。前回は、1つのメイン関数main()の中でいろいろな処理を全部ごちゃまぜにやっていました。今回は、システム初期化を行うinitialize()、表示値nをカウントアップするcountup()、nを7セグメントLEDに表示するdisplay()の3つの関数を作成して、分かりやすい構造のプログラムにしています。

 なお、前回はソフトウェア側でスイッチのチャタリング対策をしましたが、スイッチ割り込みではチャタリング対策をやりにくいので、今回は省略しています。

mm131225_micon15_2a.jpgmm131225_micon15_2b.jpg 図2 スイッチ割り込みを使ったmain.cの例(左が前半部、右が後半部)

(1) システム初期化関数 initialize()

 8〜13行目は前回と同じで、ウォッチドッグ・タイマの停止、ポート1とポート2の初期設定を行っています。14〜16行目がスイッチ割り込みのための追加部分です。

 14行目でP1.3の割り込みを許可(イネーブル)しています。15行目は、P1.3がHからLに変化したとき(立下り時)に割り込みを発生させる設定です。P1.3の割り込みをイネーブル(14行目)し、かつ割り込みフラグをクリア(16行目)して、初めてP1.3の割り込みが可能になります。慣れないとちょっと面倒ですが、二重の割り込み許可機能をもつことによって、いろいろな条件できめ細かく割り込みを使えるようになっています。

(2) カウントアップ関数 countup()

 表示値nが9未満ならnに1を加え、nが9ならnを0にします。

(3) 表示関数 display()

 nの値に対応する字形(フォント)をポート2に出力し、7セグメントLEDに表示します。

(4) メイン関数 main()

 46行目でinitialize()を呼び出してシステム初期化を行い、47行目でdisplay()を呼び出して初期値0を表示します。48行目は、MSP430を省電力モード(Low Power Mode)に移行させる命令です。MSP430は、LPM0からLPM4まで5レベル(最近の製品はさらにレベルを細分化したものもある)の省電力モードをもちます。ここでは、最も省電力効果の高いLPM4を使用します。

 MSP430がLPM4に移行すると、CPUとすべてのクロックが停止しますが、入出力ポートは機能を続行します。7セグメントLEDの表示はそのままで、スイッチ割り込み機能も有効です。

(5) 割り込みサービスルーチン

 スイッチS2が押されてP1.3の入力がHからLに変化したら、マイコンの割り込み機能が働き、割り込みサービスルーチンPort1()が起動されます。55〜57行目の処理が終了したら、割り込みを終了して元の処理に戻ります。今回のプログラムでは、通常時はLPM4の状態(スリープ)で割り込みを待っているので、割り込み終了後はLPM4に戻ります。

 52行目の「#pragma」は、C言語の命令ではなくて、コンパイラに対して指令を出すための文です。この文の書式は、マイコンやコンパイラによって変わるので、一般の解説書には出ていません。ここでは、この割り込みサービスルーチンがどの割り込みで起動されるかを示すために使われています。

 Port1()が起動されると、55行目で表示値nを1加算し、56行目で7セグメントLEDに表示します。58行目で、またP1.3の割り込みフラグをクリアしています。ポート入力からの割り込みでは、割り込みが入ったとき自動的にフラグがセットされるようになっています。これは、1回の入力信号で何度も割り込みがかかるのを防ぐために、そうなっています。そのため、割り込みサービスルーチンの最後で割り込みフラグをクリアしないと、その後の割り込みがかからなくなってしまいます。

一定時間ごとに、自動的に1ずつ数値が大きくなるプログラムの例

 今度はスイッチを使わずに、放っておけばどんどん表示値が増えていくプログラムを作ってみましょう。一定時間ごとに何かするというのは、前回のプログラムのfor文のループによる時間待ちでも実現はできますが、最初に書いたようにループによる実現方法には大きな問題があります。マイコンに内蔵されたタイマを使って、一定時間ごとに割り込みをかけるようにすれば、この問題が解決されます。

 図3に作成したmain.cのソースを示します。表示値nをカウントアップするcountup()、nを7セグメントLEDに表示するdisplay()は図2と同じです。システム初期化を行うinitialize()、メイン関数main()は図2とはちょっと変わっています。割り込みサービスルーチンTimer_Aを新しく作っています。

mm131225_micon15_3a.jpgmm131225_micon15_3b.jpg 図3 タイマ割り込みを使ったmain.cの例(左が前半部、右が後半部)

(1) システム初期化関数 initialize()

 このプログラムはスイッチS2を使わないので、ポート1の設定は省略しています。12〜14行目がタイマ割り込みのための追加部分です。

 12行目では、内蔵タイマが50000カウント数えるように設定しています。13行目はタイマ動作の設定です。タイマの動作クロックとしてSMCLKを用いること、動作クロックを8分周してカウントすること、0から設定値(12行目で設定した50000)までカウントアップすることを設定しています。MSP430には、CPUの動作クロック(MCLK)、内蔵機能で利用できるサブクロック(SMCLK)、時計用クロック(ACLK)などのクロックがあって、使い分けることが可能です。ここではSMCLKを使っています。14行目でタイマ割り込みを許可(イネーブル)しています。

(2) メイン関数 main()

 44行目でinitialize()を呼び出してシステム初期化を行い、45行目でdisplay()を呼び出して初期値0を表示します。46行目は、MSP430を省電力モードLPM0に移行させています。LPM4にすると、全クロックが停止してしまうので、タイマ割り込みがかからなくなります。LPM0では、CPUとMCLKは停止しますが、SMCLKとACLKは停止しません。

(3) 割り込みサービスルーチン

 タイマのカウント値が50000になるごとに、マイコンの割り込み機能が働き、割り込みサービスルーチンTimer_A()が起動されます。53〜54行目の処理が終了したら、割り込みを終了して元の処理(ここではLPM0)に戻ります。

 Timer_A()が起動されると、53行目で表示値nを1加算し、54行目で7セグメントLEDに表示します。タイマ割り込みでは割り込みフラグのクリアは必要ありません。


※MSP430はTexas Instruments Incorporatedの商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。

TIのマイコン製品の詳細はこちら


Copyright© 2017 ITmedia, Inc. All Rights Reserved.


提供:日本テキサス・インスツルメンツ株式会社
アイティメディア営業企画/制作:EDN Japan 編集部/掲載内容有効期限:2014年3月31日

設計に役立つヒント集

宮崎 仁のQ&Aでよく分かるマイコン基礎の基礎:
第24回 割り込みっていろいろあるのですか?どんな種類があるか教えてください。

今回は、外部割り込み、内部割り込み、ソフトウェア割り込みについて詳しく解説しています
全文を読む


電源IC選択のヒント集
電源IC 使用時の注意点をわかりやすく説明しているほか、使用時に発生する可能性のあるさまざまなトラブルとその対処法についても紹介しています。ぜひご利用ください。ダウンロードには myTI アカウントが必要です。
Part 1をダウンロード
Part 2をダウンロード


アナログ回路設計式一覧ポケット・ガイド
日本語版 PDF

英語版で高い評価を受けてきたポケット・ガイドの日本語版が完成しました。基板レベルやシステム・レベルの回路設計でよく使われるアナログ設計式を紹介しています。ダウンロードには myTI アカウントが必要です。
ダウンロード



facebook & twitter

製品情報、セミナーや展示会などのイベント情報をお知らせしています。

RSSフィード

EDN 海外ネットワーク

All material on this site Copyright © 2005 - 2017 ITmedia Inc. All rights reserved.
This site contains articles under license from UBM Electronics, a division of United Business Media LLC.