今回と次回で、低電圧インヒビット(LVI) の解説を行います。 ブレッド・ボードで簡単な可変電源を組んで、LVI モジュールの効果を確認します。
簡単な可変電源を使った LVI 実験のようす (クリックで拡大)
◆ 低電圧インヒビット とは?
LVI モジュールというのは、工作や製作物が完成した後ははっきりいってそれほど面白みのないモジュールです。 しかしこれがなかった場合、マイコンの安定した動作が期待できないなど、使い方によってはたいへん重要な意味をもつモジュールともいえます。 この際きちんと理解して、正しく使いましょう。
第3回 で紹介した QY4A英文データシートでは Low-Voltage Inhibit (LVI)、同じく QC16和文データシートでは 低電圧インヒビット(LVI) と書かれているものです。 QY4A の場合は標準的な動作電圧が 3V または 5V 、QC16 の場合は 3.3V または 5V という違いを除けば、どちらも同じものです。
インヒビットというのは耳慣れない言葉ですが、抑制(よくせい)するという意味があります。 Low-Voltage Inhibit とは 「電源電圧の低い不安定な状態での動作を抑制する」 といった意味になります。 下図で黄色く塗った部分が該当個所になります。グレーのところは説明済みです。
マイコンのブロック図 (クリックで拡大)
◆ 低電圧インヒビット に関係する入出力ピン
後ほど実験を交えて使い方を見ていく LVI 機能のピンを黄色で示します。
ピン機能優先度 高 RST,IRQ,OSC > ADC > TIM > KBI > PORT 低
第16回、第44回 と表現が異なりますが、実質的な順位は同じです。
◆ 低電圧インヒビット の考え方
低電圧インヒビット(LVI)モジュールは、システム保護のための機構として、マイコンが所定の動作電圧レベル未満で動作することを防止します。 このモジュールには、異なるシステム・レベルの要求に応じて機能を調整するためのいくつかの設定オプションがあります。
LVI モジュールの主な特長を示します。
・ LVIリセットの設定が可能
・ LVIトリップ電圧の選択が可能
・ ストップ・モード動作の設定が可能
これらの設定は CONFIG1 レジスタにあるため、リセット後に1回書き込んでおけば、間違って後から変更されるという心配がありません。
◆ 低電圧インヒビット に関係する I/O制御レジスタ
LVI ステータス・レジスタ(LVISR)
このレジスタには、LVI が有効かつ LVI によるリセットが禁止に設定されている場合に役立つステータス・ビットが格納されています。
・ LVIOUT LVI 出力ビット LVI Output Bit
この読み出し専用ビットは、下表のように VDD 電圧がVTRIPF トリップ電圧を下回ると 1 になり、VDD 電圧がVTRIPR を上回ると 0 になります。
QY4A英文データシートによると、それぞれの電圧は次のようになっています。 モードの項は CONFIG1 レジスタの LVITRIP ビットで決まる LVI モジュールの電圧モードのことです。
この表をよく見ると、5V モードでは VTRIPR -VTRIPF (つまりヒステリシス)が 100mV なのに対して、3V モードでは 75mV になっているのがわかります(データシートにもそう書かれている)。
コンフィギュレーション・レジスタ1(CONFIG1)
コンフィギュレーション・レジスタ1 は 前回 取り上げました。 ここでは LVI を利用する際に必要な部分だけを黄色で示してあります。 水色は、次回少しだけ出てくる STOP 命令に関する部分です。 各ビットの内容については 前回 を参照してください。
◆ LVI を使ってみる
レジスタの説明が一通り済んだところで、実際に LVI を動かして感覚と経験を養ってみることにしましょう。
ハードウェアの準備
電源電圧を変化させる必要があるので、ブレッド・ボードを使って簡易的な可変電源を作ります。 回路図を示します。
LM317(互換品でも可)という電圧可変型の三端子レギュレータIC を使うので、わりとシンプルな構成でできています。 ブレッド・ボードの穴に差し込むため、下の写真のようにIC の足を 90度ひねっておいてください。LM317 の足をそれぞれ 90度ひねってある(クリックで拡大)
足は印刷面に向かって左から ADJ OUT IN
半固定抵抗はモノによってブレッド・ボードにうまく刺さらない場合があります。 この部品が抜けると出力電圧が VIN(IN電圧) 近くになってしまうので、マイコンを壊さないよう注意してください。 心配な方は、ユニバーサル基板を使ってしっかりはんだ付けをして製作するのもよい方法です。
ブレッド・ボードで組んだ場合の配線のようすを写真で示します。 回路図とよく見比べながら組み立ててください。 組みあがってからの実験のようすは一番上の写真のようになります。
IC のすぐ近くの積層セラミック・コンデンサが C3 (クリックで拡大)
半固定抵抗は 2番ピン(真ん中)の位置が異なるものもある
DCプラグの組み立て方 (クリックで拡大)
DCプラグの組み立て方にはちょっとしたコツがあります。
最初にカバー(上の写真の黒い部分) をコードに通しておくのを忘れないようにしてください。 それから(3)で示した部分にビニール・テープではなく絶縁チューブを使う場合は、それもコードに通しておきます。 ただし今回はコードの反対側がバラのままですから、まったく気にする必要はありません。
(1) センタ・ピンではない方の配線を先にはんだ付けします。 火傷をしないように、何かはさむもので固定するか、作業机にセロハン・テープで貼るなどしてグラグラしないようにしておきましょう。
(2) センタ・ピン側のはんだ付けを行います。 作業しやすいように、面倒くさがらず固定し直してください。 センタ・ピン側の配線は、コードに少し余裕を持たせるようにしてください。 こうすることで断線しにくくなります。
(3) ビニール・テープを巻きます。 前もって絶縁チューブをコードに通しておいた場合は、その絶縁チューブを動かして写真の位置に持ってきます。
(4) ラジオ・ペンチなどを使って止め具の部分を折り曲げ、固定します。 あまりきつく締め付けると、コードの被覆が傷つくので適度にしてください。
あとは、カバー部分をねじ込んで完成です。
とりあえず LVI を使ってみる
実は 前回 作ったプログラム qy4a_rst_01.zip は、LVI を有効にしてありました。
void init_hardware( void ) {
CONFIG2 = 0x01; // IRQピン無効、RSTピン有効
CONFIG1 = 0x01; // LVI(3V)有効、STOP無効、COP無効
}
つまり、本来は RSTピンの機能を確認するためのプログラムだったわけですが、LVI が働くところもしっかり確認することができます。 次のように操作してみてください。
【準備】
・ HC08スタータ・ボードの POWERスイッチをオフにする。
・ 簡易可変電源の出力電圧を 3V に調整する。
・ HC08スタータ・ボードの POWERスイッチをオンにして、前回の qy4a_rst_01
が動くことを確認する。
・ 確認が済んだら POWERスイッチをオフにする。【実験】
・ HC08スタータ・ボードの POWERスイッチをオンすると LED がゆっくり点滅する。
・ 簡易可変電源の半固定抵抗をゆっくり左に回し、LED が消えたところで止める。
回しすぎたと思って右回りに戻してはいけないので、回しすぎないよう注意すること。
・ そのときの電源電圧を測定する。(実測例)VTRIPF 2.46V
・ 半固定抵抗を非常にゆっくり右に回し、LEDがゆっくり点滅を始めるところで止める。
・ そのときの電源電圧を測定する。(実測例)VTRIPR 2.53V
・ パワーオン・リセットと LVI リセットでは LED がゆっくり点滅し、RST ピン(プッ
シュ・スイッチ)によるリセットでは速く点滅することを確認する。
この実験で次のようなことがわかります。
・ 電源電圧を下げていくと LED 消灯の状態でプログラムが停止しているように見える。
・ また電圧を上げていくと LED がゆっくり点滅を始める。 これは RSTピン以外の要因でリセットが掛かっていたことを示している。
・ 非常にラフな実験ではあるが、ヒステリシスは 2.53V - 2.46V = 0.07V となり、仕様(3V)の 75mV と比べて非常に近い値であった。
これらのことから、LVI は正常に機能していると考えて間違いないでしょう。
LVI リセットが発生したことを判定する
次は、さらに詳しくリセット要因を見られるプログラムを作ってみます。
【仕様】
・ 前回 のプログラム qy4a_rst_01 を元にして、リセット要因が LVI のとき LED を
速く点滅、それ以外ならゆっくり点滅させる。
・ SIM リセット・ステータス・レジスタ(SRSR) の内容を、PORTB に出力する。
下記にリストを示します。色を付けたところだけ、前回から変更しています。
void main( void ){
U1 srsr_data;
U2 cnt, period;
init_hardware( );
init_PORT( );
srsr_data = SRSR; //一度しか読み出せないレジスタ
if ( srsr_data & SRSR_LVI_MASK ){
period = SHORT_PERIOD;
} else {
period = LONG_PERIOD;
}
PTB = srsr_data;
for ( ; ; ){
for ( cnt = 0 ; cnt < period ; cnt++ );
PORT_LED = ~PORT_LED;
}
}
プロジェクトごと圧縮したものを qy4a_lvi_01.zip として保存しましたのでご利用ください。 書き込みが済んだら、先ほどの準備・実験の要領で次のことを確認してみましょう。
【実験】
(1) LVI によるリセット発生後、速く点滅 → OK
(2) RSTピンによるリセット発生後、ゆっくり点滅 → OK
(3) パワーオン・リセット発生後、ゆっくり点滅 → NG? 速く点滅した
これは変ですね!? パワーオン・リセットのときは SRSR レジスタのビット7 が立つはずです。 速い点滅の判定はビット1 で行っているのに、なぜこんなことが起きるのでしょうか? それを調べるためには、PORTB (PTB) の電圧をテスタで確認すればよいのです。 さっそく調べてみると、下表のようになりました。
なんとパワー・オン・リセット(POR)のときは LVI のビットも立っているのでした(*1)。 それで、あんな動きになったのですね。 それでは、判定のところを少しだけ改良してみます。
srsr_data = SRSR; //一度しか読み出せないレジスタ
if ( ! ( srsr_data & SRSR_POR_MASK )
&& ( srsr_data & SRSR_LVI_MASK ) ){
period = SHORT_PERIOD;
} else {
period = LONG_PERIOD;
}
このようにして、「パワーオン・リセットでない」 かつ 「LVI リセット」 のとき速く点滅させるようにしました。 プロジェクトごと圧縮したものを qy4a_lvi_02.zip として保存しましたのでご利用ください。 マイコンに書き込んで動かしてみると、先ほどの実験(1)(2)(3) がすべて狙いどおりに動作することが確認できました。
(続く)
『参考文献』
「試しながら学ぶHC08マイコン入門」 (CQ出版)
第1章 マイコン電子工作を始めよう
第10章 統合開発環境CodeWarriorを使ってみる
筆者のホームページ 『マイコン工作の実験室』
組み込みエンジニア KAWANO
[2009-07-02 追記]
(*1) データシートの SIM Reset Status Register の項目に下記の説明文がありました。 納得です。
パワーオン・リセットでは、POR ビットはセットされ、レジスタのその他のビットはすべてクリアされます。 それ以外のすべてのリセット・ソースでは、各フラグがセットされますがレジスタはクリアされません。内部または外部のリセット発生時の条件に応じて、1 つ以上のリセット・ソースのフラグが設定されます。 たとえば、電源の立上がりに時間を要する場合はPOR ビットとLVI ビットがセットされます。
