SSブログ

MC9RS08LA8で作った電圧計 [RS08]このエントリーを含むはてなブックマーク#

2762232

某所より提供された液晶パネル「VIM-503」を使って、電圧計を作ってみました。

基板は、そのまま

2718574

MC9RS08LA8で作った評価ボードでは、液晶パネル「LCDP81」を搭載した基板を作成しました。 写真をご覧ください。 今回の液晶パネルは、なんと、この基板をそのまま使用しています。 これは、任意のポートをバックプレーンとして使用することができるというMC9RS08LA8のLCDドライバの特徴の成せるわざです。 また、今回使用した、液晶パネル「VIM-503」が15端子一列分しか必要としないという仕様にも助けられています。 ソフトウェアは、多少、苦労しますが、もう一枚基板を作るのに比べたら軽いものです。

電圧を検出する仕組み

電圧計を作るためには、何らかの方法で基準電圧を手に入れる必要があります。 MC9RS08LA8の場合には、マイコン内部にバンドギャップと呼ばれる基準電圧を作成する機能を持っています。 バンドギャップ電圧は、データシートによると [1.208V (MIN); 1.208V (MAX)] とかなり強気な仕様になっていますが、きっとこれは、何かの間違いでしょう。 私のハンディ・テスタで校正したところ、1.1913V という値が出てきました。

MC9RS08LA8には、10ビットのA/Dコンバータが内蔵されています。 このA/Dコンバータでバンドギャップ電圧と被測定電圧を測定し、その比に先の 1.1913V を掛けると電圧が得られます。 さらに、測定精度を上げるために、A/D変換を64回行い、その和を16ビットの測定値として取り扱います。

この16ビットの値を取得するのが、関数 "do_adc()" です。

消費電力もちょっとは考えた

電圧表示は、 RTI モジュールの内蔵発振器を使って、約0.5秒ごとに更新されます。 A/D変換を行い、電圧値を計算し、液晶パネルに値を表示したら、次の更新までCPUには仕事がありません。 そこで、仕事が終わったらWAIT命令で低消費電力状態に移行し、次回の更新タイミングではRTI割り込みを利用して起き上がるという仕組みを取り入れました。

また、通常動作中は内部クロックを FEI (FLL Engaged Internal) モードに入れて 8MHz の高速バス・クロックで動作させて、WAIT期間中は内部クロックを FBILP (FLL Bypassed Internal Low Power) モードに入れて 16kHz の低速バス・クロックで動作させています。 この動作によって、消費電流は、0.24mAまで落ちました。

RTI割り込みの待ち合わせを行う命令には、もっと低消費電力になるSTOP命令もあります。 しかし、STOP命令を使うとクロックが停止してしまい、LCDドライバも停止して具合がよくありません。 そのため、次善の策としてWAIT命令を使用しています。

もし、どうしてもSTOP命令を使いたい場合には、外部発振子を追加して、そのクロックでLCDドライバとRTIを駆動するという方法もあります。 今回の基板では、外付け部品を減らすため、内蔵発振器のみを使うことにしています。

液晶パネルの駆動電圧

今回使用した、Varitronix社VIM-503というパネルは、4V程度の駆動電圧が必要になるようです。 MC9RS08LA8のLCDドライバは、チャージポンプを内蔵していて電源電圧から三つのバイアス電圧を作ることができます。 バイアス電圧の作り方には二種類あり、レジスタで設定することができます。

モード3/3 VDD モード3/2 VDD モード
VLL33/3 VDD3/2 VDD
VLL22/3 VDD2/2 VDD
VLL11/3 VDD1/2 VDD

A/D変換によって得られたバンドギャップ電圧から電源電圧を逆算し、これら二つのモードの一つを選択すると、ちょうどいいバイアス電圧が得られます。

この処理を行っているのが、関数 "lcd_cpcontrol()" で、 3.8V と 4.2V をスレシホルドとしてモードを切り替えるようになっています。

LCDWF レジスタの憂鬱

今回のプログラムでは、関数 "lcd_num()" で、16ビットの値を符号付十進数に変換し、セグメントのON/OFFを決めています。 この関数では、配列 "wf[12]" に、一旦 LCDWF レジスタの値を格納し、あらためて関数 "lcd_show()" で液晶パネルに表示しています。

元のプログラムでは、配列 "wf[12]" は使わず、直接 LCDWF レジスタに対してビット操作を行っていました。 今回、 LCDWF レジスタを直接ビット操作しないように変更した理由は、 LCDWF レジスタが書き込み専用レジスタだったからです。

MC9RS08LA8のリファレンスマニュアルには、確かに LCDWF レジスタは読み書き可能であると記述されています。 そのため、何の疑問も抱かずに LCDWF レジスタに対するビット操作を行ったのですが、うまく値が読み出せないことに気が付きました。 そこで、 freescale.com の Service Request に問い合わせたところ、「RS08 シリーズの LCDWF レジスタは、書き込み専用である。」との回答を得ました。 どうやら、リファレンス・マニュアルの不備のようです。

このため、仕方なく、配列を使った間接ビット操作に変更したというわけです。

デモンストレーション

プロジェクト・アーカイブ

今回作成したプロジェクトは、このリンクを "LA02.zip" という名前で保存すると再現できます。

参考文献

HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers

HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers

  • 作者: Fabio Pereira
  • 出版社/メーカー: Booksurge Llc
  • 発売日: 2007/11/13
  • メディア: ペーパーバック

関連文献

コメント欄の流れから、広告を追加しました。 「表面実装リフロー装置(オーブントースター使用)」が紹介されている号です。
トランジスタ技術 (Transistor Gijutsu) 2007年 01月号 [雑誌]

トランジスタ技術 (Transistor Gijutsu) 2007年 01月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2006/12/09
  • メディア: 雑誌
トランジスタ技術 2007 CD-ROM版[CD-ROM]

トランジスタ技術 2007 CD-ROM版[CD-ROM]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/03
  • メディア: 単行本

MC9RS08LA8で作った評価ボード [RS08]このエントリーを含むはてなブックマーク#

2718574

サンプル請求の結果で紹介したマイコンの一つ"MC9RS08LA8"でサンプル評価ボードを作成しました。

回路図

la8lcd8-sch.png

液晶パネルは、ダイセン電子工業LCDP81です。 小型のパネルに8桁の数値表示が可能です。 1/3デューティーのパネルなので、1/8デューティーまで対応する"MC9RS08LA8"には役不足ですが、まあ、いいでしょう。 ちなみに、マイコンが搭載されている変換基板もダイセン電子工業のものです。

マイコンには、液晶ドライバが内蔵されているので、直接接続します。 液晶の駆動には、数種類の異なる電圧が必要なのですが、心配は不要です。 マイコンには、チャージポンプ回路が内蔵されています。 外付けに0.1µFのコンデンサC4からC7を付けると必要な電圧が生成されます。

キーボードは、A/Dコンバータ入力だけで動作させます。 スペースの関係で、残念ながら12個しか搭載できませんでした。

サンプル・アプリケーション

とりあえず、延々と数を数えるプログラムを作成し、実行させてみました。 RS08と言えども、ProcessorExpertが使えるのでプログラムの開発は簡単です。 と言っても、LCDをサポートするBeanは、初期化を行うための"Init_LCD"しか用意されていないので、データ処理と表示部分については自力で記述していく必要があります。

消費電流は、実測で3.4mAでした。 BUSCLK=10MHzでCPUが全速力で走っている割には、低消費電力でしょ。

プロジェクトは、このリンクを"LA01.zip"という名前で保存すると再現できます。 1カウントに1400から1600サイクルも要するダサいプログラムですが、あくまでサンプルですのでご勘弁を。

アプリケーション募集中

このサンプル・アプリケーションでは、とりあえず作成したために、せっかく付けてあるキーボードが使用されていません。 何か、良いアプリケーションがあれば、お知らせください。


K2K 2008年バージョン [RS08]このエントリーを含むはてなブックマーク#

2718253

はるか昔、部品調達リスト (4) - K2K2008で紹介した基板にようやく部品を実装しました。

回路図は、これだ

k2k2008pcb-sch.png

なんてことはない、ポートに電流制限抵抗とLEDを接続しただけの簡単設計です。 配線スペースの関係から、LED番号とポートの対応が少々不自然です。 まあ、このくらいはソフトウェアに泣いてもらうことにしましょう。

PTAD = (~(pattern >> 8) & 0x0F) | (PTAD & 0xF0)
PTBD = ~(((pattern >> 12) & 0x0F) | (pattern &0xF0));

このプログラム断片は、16ビットの変数"pattern"上位12ビットの内容をLEDに転送するものです。 このまま、8ビットシフトと12ビットシフトをそのままコンパイラに喰わせると、妙なコードを生成してくれます。 そのため、変数"pattern"は、"union"で宣言して使用します。

union {
  word      W;
  byte      B[2];
} pattern;

    :

      PTAD = ~(pattern.B[0] & 0x0F) | (PTAD & 0xF0);
      PTBD = ~(((pattern.B[0] >> 4) & 0x0F) | (pattern.B[1] &0xF0)));

プログラムは、ProcessorExpertで

RS08が出たばかりの頃のCodeWarriorは、アセンブラしかサポートしていませんでした。 それが今、Cが普通に使えるまでに成長しています。 また、簡単にプログラムをするためのサポート・ツールProcessorExpertも対応しています。 これで、面倒なところはツールに任せて、やねこい部分だけを人間が考えれば済むようになりました。

まだ、ろくにサンプル・プログラムを作っていないので、プロジェクトの公開は省略します。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。