前回からの続きで低電圧インヒビット(LVI) の解説を行います。 ブレッド・ボードで組んだ簡易可変電源を使って LVI モジュールの効果を確認します。
電流を測定するようす (クリックで拡大)
テスト棒の極性(赤・黒)に注意
LVI リセットを止めてみる
今度は、LVI モジュールは有効だが LVI リセットは無効 という設定を試してみます。
【仕様】
・ LVI 有効、LVI によるリセットは無効、RSTピンによるリセットは有効とする。
・ LVI モジュールによって電源電圧が低下したと判定したとき LED を速く点滅、
それ以外のときはゆっくり点滅させる。
RSTピンは関係ないのですが、前回からの流れでそのまま有効にしておきます。 さっそくプログラムを書いてみましょう。
リセット後の初期化処理 は、このようになりました。
void init_hardware( void ) {
CONFIG2 = CONFIG2_RSTEN_MASK; // RSTピン有効
CONFIG1 = ( CONFIG1_LVIRSTD_MASK | CONFIG1_COPD_MASK );
}
こうすることで、CONFIG1 には 0x21 が入ります。 第53回 の解説も参考にしてください。
メイン関数 は、このように書けました。
void main( void ){
U2 cnt, period;
init_hardware( );
init_PORT( );
for ( ; ; ){
if ( LVISR_LVIOUT ){
period = SHORT_PERIOD;
} else {
period = LONG_PERIOD;
}
for ( cnt = 0 ; cnt < period ; cnt++ );
PORT_LED = ~PORT_LED;
}
}
LVISR_LVIOUT は 前回 新しく出てきたレジスタのステータス・ビットです。 for 文の中に判定を入れたので、リセット後 1回だけではなく動作中に何度も判定を行います。 プロジェクトごと圧縮したものを qy4a_lvi_03.zip として保存しましたのでご利用ください。
これをマイコンに書き込んだら、次の実験を試してみてください。
【実験】
どのステップも、ツマミを回しすぎたと思って戻してもダメなので、じっくり回すこと。
・ 簡易可変電源の電圧を約3V に設定して、POWER オンする → ゆっくり点滅
・ 簡易可変電源のツマミをゆっくり左に回して電圧を下げ、点滅が速くなったところ
で止める。
・ そのときのマイコンの電源電圧を測定する。(実測例)VTRIPF 2.46V
・ 簡易可変電源のツマミをゆっくり右に回して電圧を上げ、点滅がゆっくりになった
ところで止める。
・ そのときのマイコンの電源電圧を測定する。(実測例)VTRIPR 2.52V
・ また簡易可変電源のツマミをゆっくり左に回して電圧を下げ、点滅が不規則に
変わったところで止める。【できない場合もあります】
・ そのときのマイコンの電源電圧を測定する。(実測例) 2.00V
・ さらに簡易可変電源のツマミをゆっくり左に回して電圧を下げ、(不規則な点滅から)
完全な消灯に変わったところで止める。【消灯は必ずできます】
・ そのときのマイコンの電源電圧を測定する。(実測例) 1.99V
・ 簡易可変電源のツマミをゆっくり右に回して電圧を上げ、ゆっくりの点滅になった
ところで止める。
・ そのときのマイコンの電源電圧を測定する。(実測例) 2.51V
・ おおむね、ゆっくり点滅する電圧のときに POWER オンするとマイコンは動作でき
るが、速い点滅の電圧のときに POWER オンしても動作できないことを確かめる。
この実験から次のことがわかります。
LVI によるリセットを行わない場合、この日の温度に限っていえば、この実験に用いたマイコンは電源電圧を 2.00V まで下げると正常に動作できなくなる(この電圧はまったく保証されていないので注意)。
動作できなくなるギリギリの電圧では、異常かつ不安定な周期で LED がパラパラ点滅した。 これはプログラムが異常に動作しているので、何か重要な機能のプログラムを作りたい場合はこういう状態にならないようにしなければならない。 → そのために LVI リセットや COP リセットが用意されている。
不安定な状態というのは電圧範囲が非常に狭いので、再現しにくいと思います。 どうしてもやってみたい方は、半固定抵抗を多回転タイプに変えるとよいでしょう。 また、ディジタル・マルチ・メータ(DMM)で現在の電圧を見ながら回すと、うまくいくようです。
ところで LVI モジュールを有効にして LVI リセットを無効にするような応用例があるのか、気になる方もおられると思います。 こんな使い方はどうでしょうか。 充分速い間隔で LVIOUT ビットを監視しておき、1 になったらシステムを終了させるための準備を行って(たとえば外付け周辺 IC に出力オフのコマンドを送る)、あとは何もしない。 いずれかのリセットがかかることによってシステムを再始動させる。 そのためには 「LVIOUT = 1 となる電圧」 から 「動作できなくなる電圧」 まで低下する時間よりも、終了準備の処理時間が充分短い必要があります。
◆ ストップ・モードと LVI
HC08マイコンには、ウェイト・モード と ストップ・モード という二つの低電力モード(これらの違いは内部のどの部分のクロックを止めるか)があります。 とくにストップ・モードでは通常動作モードに比べて消費電流が極端に少なくてすむため、電池駆動の機器では非常に役に立つモードです。 しかし誤解しないでいただきたいのは、これらの低電力モードは消費電力を抑えつつプログラムを実行し続けるものではなく、「なんらかのきっかけをもらうまで何の命令も実行せず待機するもの」 だということなのです。
これだけだとただのパワー・オフのように見えるかもしれないので補足しておきますと、そのきっかけというのが、各種の割り込みであったり、入力ピンのレベル変化であったり、自動で発生する周期的な信号であったり、そしてまた各種のリセットであったりと、実にさまざまです。
コンフィギュレーション・レジスタ1 にはストップ・モードと LVI に関するビットがいくつか含まれているので、それらについて動作確認を行いましょう。
なお、低電力モードの利用法についてはまた別な機会に詳しく見ていく予定です。
何度も出てきますが、コンフィギュレーション・レジスタ1 の図を再掲します。
コンフィギュレーション・レジスタ1(CONFIG1)
コンフィギュレーション・レジスタ1 は 第53回 で詳しく取り上げました。 ここでは LVI に関する部分を黄色で、STOP 命令に関する部分を水色で示してあります。
次に、ストップ・モードなどにおけるマイコンの電源電流を測定するためのプログラムを作ります。 測定の手順を簡単にする目的で 5種類のテストを一つのプログラムに詰め込みました。 これは HC08スタータ・ボードを使ってマイコンの電源電流を調べる実験ですが、HC08スタータ・ボードを改造しないで利用することができます。
【仕様】
・ 初期設定でポートB を入力方向に設定し、プルアップ有効にする。
・ PTB0 のみ“L”のとき、LVI 有効にして通常動作モードのまま無限ループを行う。
・ PTB1 のみ“L”のとき、LVI 無効にして通常動作モードのまま無限ループを行う。
・ PTB2 のみ“L”のとき、ストップ・モードでの LVI有効にしてストップ・モードにする。
・ PTB3 のみ“L”のとき、ストップ・モードでの LVI無効にしてストップ・モードにする。
・ PTB4 のみ“L”のとき、LVI 無効にしてストップ・モードにする。
・ いずれの場合も、“L”であったポートのみプルアップを無効にすること。
・ 判定でどれにも当てはまらないときは LED(D4) を点灯させて無限ループを行う。
このプログラムは分岐の判定をしたあとで CONFIG1 レジスタへの書き込みを行うため、初期設定を別関数に分けずにメイン関数で各種設定を行うことにしています。
メイン関数 は、このようになりました。
void main( void ){
U1 ptb_data;
PTBPUE = 0xFF;
CONFIG2 = 0x00;
PTAPUE = 0x00;
PTA = 0x02;
DDRA = 0x02;
ptb_data = PTB;
PTBPUE = ptb_data;
switch ( ptb_data ){
case 0xFE: // bit 0 LVI 有効、通常動作モード無限ループ
CONFIG1 = CONFIG1_COPD_MASK;
for ( ; ; );
break;
case 0xFD: // bit 1 LVI 無効、通常動作モード無限ループ
CONFIG1 = ( CONFIG1_LVIPWRD_MASK
| CONFIG1_COPD_MASK );
for ( ; ; );
break;
case 0xFB: // bit 2 ストップ・モードでの LVI有効、ストップ・モード
CONFIG1 = ( CONFIG1_LVISTOP_MASK
| CONFIG1_STOP_MASK
| CONFIG1_COPD_MASK );
asm("STOP");
break;
case 0xF7: // bit 3 ストップ・モードでの LVI無効、ストップ・モード
CONFIG1 = ( CONFIG1_STOP_MASK
| CONFIG1_COPD_MASK );
asm("STOP");
break;
case 0xEF: // bit 4 LVI無効、ストップ・モード
CONFIG1 = ( CONFIG1_LVIPWRD_MASK
| CONFIG1_STOP_MASK
| CONFIG1_COPD_MASK );
asm("STOP");
break;
}
PORT_LED = LED_ON; // ここへ来たときは失敗
for ( ; ; );
}
複数個所で利用するためにポートB を何度も読むのではなく、 ptb_data = PTB; として変数に取り込んでいます。
「“L”であったポートのみプルアップを無効にすること」 というのは PTBPUE = ptb_data; で実現しています。 目的はもちろん、プルアップ抵抗に電流が流れてマイコンの消費電流が増えるのを防ぐため、“L”のポートだけプルアップ抵抗を切り離しているのです。
あとは、それぞれの判定に応じて CONFIG1 レジスタの設定値を決めています。 仕様と合っているか、よく確かめてみてください。
ストップ・モードに移行するための STOP 命令は、C言語で普通に記述することができません。 そこで、asm( ) 関数を使ってアセンブラのニモニックを直接埋め込んでいます。
プロジェクトごと圧縮したものを qy4a_lvi_04.zip として保存しましたのでご利用ください。 これをマイコンに書き込んだら、次の手順に従って実験を行ってください。
(1) HC08スタータ・ボードを使って、マイコン以外の回路の部分に流れる電流を測定する。
・ HC08スタータ・ボードをスタンド・アロンの設定にする (JP1ショート、JP2ジャンパ・
リンクなし、JP3は 1-2間ショート、JP4は 1-2間ショート、VR1は任意)。
・ POWER スイッチがオフであることを確認し、IC ソケットから IC とマイコンをすべて
取り外す。
・ POWER スイッチをオンにする。 電源電圧はできるだけ正確に 3.0V に調整する。
・ JP1 を取り外し、ポスト・ピンを利用して電流を測定する。 その際、極性に注意する
こと(下の写真を参照)。
電流の測定に慣れていない人はピンと来ないかもしれませんが、この実験においてはテスト棒を当てることによってテスタ(DMM)を含む全体の回路が形成されたとき、電源スイッチを入れたのと同じ効果があります。
マイコン以外の部分の電流を調べる (クリックで拡大)
テスタ(DMM)のツマミは 電流測定レンジ に合わせる
テスト棒の極性(赤・黒)に注意すること
これは何を測っているかというと、HC08スタータ・ボードの VR1 に流れる電流です。 同時に、VR1 の正確な抵抗値もわかります。 第18回 の回路図も参考にしてください。
(実測例) 298.8μA この場合だと、3V ÷ 0.299mA = 10.0kΩ です。 部品は 10kΩの半固定抵抗、誤差は±5% なので充分納得できる値でした。
(2) 「LVI 有効、通常動作モード無限ループ」 の測定を行う。
・ HC08スタータ・ボードの ICソケットに、先ほどプログラムを書き込んだマイコンを
挿入する。
・ PTB0 と GND を、ワニ口クリップ・コードなどを使ってショートさせる。
・ JP1 のポスト・ピンを利用して電流を測定する。 極性に注意すること。
(実測例) 2.75mA
(3) 「LVI 無効、通常動作モード無限ループ」 の測定を行う。
・ PTB1 と GND を、ワニ口クリップ・コードなどを使ってショートさせる。
・ JP1 のポスト・ピンを利用して電流を測定する。 極性に注意すること。
(実測例) 2.70mA
(4) 「ストップ・モードでの LVI有効、ストップ・モード」 の測定を行う。
・ PTB2 と GND を、ワニ口クリップ・コードなどを使ってショートさせる。
・ JP1 のポスト・ピンを利用して電流を測定する。 極性に注意すること。
(実測例) 399.2μA
(5) 「ストップ・モードでの LVI無効、ストップ・モード」 の測定を行う。
・ PTB3 と GND を、ワニ口クリップ・コードなどを使ってショートさせる。
・ JP1 のポスト・ピンを利用して電流を測定する。 極性に注意すること。
(実測例) 299.1μA
(6) 「LVI無効、ストップ・モード」 の測定を行う。
・ PTB4 と GND を、ワニ口クリップ・コードなどを使ってショートさせる。
・ JP1 のポスト・ピンを利用して電流を測定する。 極性に注意すること。
(実測例) 299.1μA
どの測定も LED(D4) が点灯しているときは失敗なので、PTB0 ~ PTB4 のいずれかが きちんと GND にショートできているか、また、ワニ口クリップが隣と接触していないかなど確かめてみてください。
さて、それぞれの設定に基く マイコンの電流データ が取れました。 実測で下表のようになっていました。
これを見て、次のようなことがわかります。・ 通常動作モードを見ると、LVI モジュールの有無で 50μA ほど差がある。
・ 通常動作モードとストップ・モードの差は、2mAを越すかなりの開きがある。
・ ストップ・モードを見ると、LVI モジュールの有無で 100μA ほど差がある。
・ 4番目と 5番目の違いは、STOP命令を実行するまでの間、LVI が有効かどうか。
・ STOPモード、LVI 無効のとき 0.3μA というのは信頼できるのか? データシートを見ると、電気的特性の Stop mode VDD supply current の項目に、常温で 3V 動作時の STOP モードの電源電流は 0.36 μA(Typ) と記載あり。 今回の実験では充分な精度で測定できているとはいえないが、0.3μA という実験結果は妥当といってよいだろう。
1μAより小さい電流をもっと精度良く測るためには、このやり方では厳しいので、やはり 10kΩの半固定抵抗を完全に切り離した状態でマイコンの電源電流を直接測る必要があります。 HC08スタータ・ボードの配線パターンをカットする・・・というのは気が引けるので、ほかのテスト用の基板を用意するか、ブレッド・ボードを利用したほうがよいでしょう。
それにしてもストップ・モードというのは本当に電流が少ないです。 だから小さなボタン電池を利用する機器でもメカ式の電源スイッチがないアプリケーションが可能なんですね。
ここまでで一通り LVI に関する実験を済ませました。 LVITRIP ビット については実験を行っていませんが、これは 5V 用のプログラムを作るときに 1 にします。 そうすることにより、VTRIPF と VTRIPR が 5V 用の値に変更されます。 それ以外はとくに新しいことはないので、実験は省略します(ほかとの違いといえば LVITRIP ビットはパワー・オン・リセット以外のリセットでは変化しません)。
5V で動かす場合の VTRIPF と VTRIPR は、前回 の 3V の表に記入されています。 実験で用意した簡易可変電源は、5V 前後の電圧を出すこともできますので、余力のある方は試してみてください。
【μA 測定時の注意】
これはオマケの解説です。 今回は、テスタ(DMM) で μA という小さな電流を測定する実験を行っています。 しかし、マイコンの電源投入時は通常動作モードであり、プログラムが動いた後にストップ・モードに移行して電源電流がガクンと減るわけですから、最初は一時的に数 mA の電流が流れています。 これが問題になる場合があります。
筆者が普段使っている DMM (マザーツール MT-4070)では、表示が乱れたあと決まって 910μA 前後の値が出ていました。 最初なぜそんな数字になるのか不思議だったのですが、要するにエラーを起こしているということでしょう。数mA の電流(それも一瞬)でヒューズが飛んだりすることはないから大丈夫だろう、と思って甘く考えていました。 横着(おうちゃく)をしてはいけませんね。 当たり前のことですが、テスタ(DMM)のダイヤルで設定した電流レンジに合った電流を測定しないといけない、というわけです。
対策として、次のような方法でこの問題をクリアしました。 参考にしてください。
黒のテスト棒で JP1 の 2本のピンをショートさせる。
これによりマイコンに電源が入る。
プログラムが動き、ストップ・モードに移行する。
赤のテスト棒を手前のピンに接触させる。
まだテスタ(DMM)はゼロを表示している。
黒のテスト棒をスライドさせ、手前のピンから離す。
その際トランジスタに近い側のピンからは離れないようにする。
こうするとテスタ(DMM)の μA レンジに対する過大な電流が流れることがなく、正しい電流値が表示されます。 マザーツール MT-4070 ではこの方法で表示できましたが、他社の製品では、わざわざこんなことをしなくてもいきなりポンとテスト棒を当てて大丈夫なものもありました(METEX P-16 など)。
◆ LVI の効果的な使い方とは
LVI について、2回にわたって見てきました。 さてそれでは実際に、LVI モジュールというものをどうやって使うのがよいのでしょうか? 以下は一つの目安に過ぎませんが、参考にしてください。
・ LVI は有効。 LVIPWRD = 0
・ 使用する電源電圧に合わせる。 LVITRIP = 0 (3V) または 1 (5V)
・ LVI リセットは有効。 LVIRSTD = 0
・ ストップ・モードでのLVI 無効。 LVISTOP = 0
これを基本として、問題があるときには個別に対応すればよいでしょう。
たとえば 第37回~第42回 などに見られるリモコン・カーのプログラムでは、LVI を無効にしています。 この作品はモータが 2個搭載されていて、同時に回し始めると多くの電流が流れて電池電圧が一時的に低下します。 そのため、電池が少しでも弱ってくるとすぐに LVI リセットが掛かってしまい、次々に電池を交換するはめになってしまいます。 それはあまりにももったいないので、LVI を無効にして少しくらい電圧が下がってもリセットせず動かし続けるようにしたのです。 リモコン・カーという作品自体がオモチャですし、こういう対応でもよいだろうという判断です。
第53回 で 「SSRECビットについては LVI の解説のときにもう少し突っ込んだ説明をします」 と書きましたが、これは今の時点で説明できる内容ではありませんでした。 やるとしたら、発振器または低電力モードのところで解説したいと思います。 次回は コンピュータ動作保証(COP) の予定です。
『参考文献』
「試しながら学ぶHC08マイコン入門」 (CQ出版)
第1章 マイコン電子工作を始めよう
第10章 統合開発環境CodeWarriorを使ってみる
筆者のホームページ 『マイコン工作の実験室』
組み込みエンジニア KAWANO
