エントリー

カテゴリー「make:」の検索結果は以下のとおりです。

PC-E500のメモリが1Mbyteに迫る勢い

  • 2008/10/24 19:21
  • カテゴリー:make:

 PC-E500関連の資料を眺めていて思ったのですが,S1:というエリアとS2:というエリアにそれぞれ256kByteのメモリを搭載したことで,もうメモリを追加する方法はない,と思い込んでいた私は,どうも間違っていたようです。

 もちろん,バンクメモリという荒技や,NANDフラッシュを内蔵するという方法で大きなメモリを搭載する方法は知っていましたが,これらはいずれもアマチュアが考えついた独自の方法であり,デバイスドライバがなければアクセスできません。

 私個人は,そこまでやってしまうことはオリジナルシステムを無視したように感じてしまい,どうも美学に反するように感じてしまうので,そうした方法を使ってまでメモリを増やそうとは思いません。

 PC-E500に搭載されたSC62015という8ビットCPUは,後にPIザウルスにも搭載された高性能なCPUです。先日も書きましたが,ユーザーが我慢できないコンピュータの弱点は処理速度よりもメモリの小ささだと思っていまして,PC-E500シリーズがマニアに指示された理由は,やはりこのメモリを搭載できる力に長けていたことにあると考えています。

 SC62015は,アキュムレータや汎用レジスタが8ビットなので8ビットCPUの範疇に入れてよいと思うのですが,スタックポインタやインデックスレジスタは20ビットの長さがあります。そのくせプログラムカウンタは16ビットだったりするので,なにやらアクの強さを感じますね。

 プログラムカウンタは確かに16ビットですが,4ビットのセグメントレジスタも持っていて,この2つで20ビットのアドレッシングを可能にしています。ただし,プログラムカウンタがオーバーフローしてもセグメントレジスタはインクリメントされないので,その点では8086なんかと同じように,64kByteの壁が存在しています。

 そんな話はよいとして,このCPUはとにかくアドレスを20ビット生成する力があるということですから,最大1MByteのメモリをアクセス可能なわけです。もともと32kByteしかRAMを持たないPC-E500にとって,1MByteというのは無限に広がる荒野に近いといえます。

 8ビットCPUでも64kByte以上のメモリをアクセスできるCPUは多いのですが,残念なことに多くはアドレスを生成するレジスタが16ビットだったりするので,実際に使ってみると非常に面倒な制約がついてしまうのです。SC62015についても,セグメントの境界による制約がないわけではありませんが,少なくともコードではなくデータについてはリニアアドレスと見て良いだけの自由度があります。

 もう1つ,20ビットのアドレスが生成できるからといって,CPUの信号線としてアドレスバスを20本も出しておく事は,普通はない話です。半導体の価格は,一般にチップ面積だといわれていますが,それは高価な半導体の場合のお話で,安い半導体の場合,チップそのものよりもパッケージの価格が大きく見えるようになることも多いのです。

 そしてそのパッケージの価格は,ピンの数と関係があります。使わないピンは出さないでおいて,ピンの数を減らした方が安くて小さいICになることは言うまでもないでしょう。

 SC62015の場合,アドレスバスが18本外に出ています。256kByteのメモリまでをサポートしているわけですね。上位の2ビットのアドレスは外には出てこないので,一見すると1Mbyteのメモリはサポートされないように思うのですが,実は上位のアドレスをデコードしたチップセレクト信号を8本出してあります。

 そうなんですよね。確かに20本のアドレスバスを全部外に出しておいてくれれば,どんなアドレスにも好きなサイズのメモリを繋ぐことが出来るのですが,一方でそのメモリチップを割り当てたアドレスの範囲でアサートされるチップセレクト信号を作ること(これをアドレスデコードといいます)は,メモリのサイズが大きくなればなるほど規模も大きくなり,煩わしいのです。

 そこで汎用性の低い組み込み向けのCPUではアドレスデコードを済ませたチップセレクト信号をアドレスバスの代わりに出しておくことが一般的です。気の利いたCPUでは,デコードするアドレスをレジスタで可変出来るようになっていて,これはこれでなかなか便利なのですが,弱点がないわけではなく,プログラムが走り出して,レジスタの設定が終わるまで外のメモリにアクセスが出来ません。

 SC62015の場合,チップイネーブルのアドレスデコードは固定されているため,言い換えると8本出ているチップセレクトにデコードされたアドレスが,即メモリマップになるというわけですね。

 これによると,

CE0 80000h - BFFFFh 256kByte 内蔵RAM(S1:)
CE1 40000h - 7FFFFh 256kByte RAMカード(S2:)
CE2 C0000h - FFFFFh 256kByte 内蔵ROM(S3:)
CE3 20000h - 3FFFFh 128kByte 未使用
CE4 0C000h - 0FFFFh 16kByte  未使用
CE5               LCDコントローラ
CE6 10000h - 1FFFFh 64kByte  ROMカード
CE7 BC000h - BFFFFh 16kByte  システム

 ということで,実は1Mbyte全部のエリアをアクセス出来るようにはなっていません。

 アドレスバスは18本しか出ていませんから,チップセレクト1つあたりに接続できるメモリは最大256kByteまでとなります。すでにCE2は256kByteのROMが接続済みですので,内蔵RAMとRAMカードのエリアをそれぞれ256kByteにした合計512kByteが,PC-E500の限界だと私は思っていたわけです。他のアドレスにRAMをただ繋いでも,システムレベルでサポートされなければ使い道がありませんからね。

 ところが,CE3にしてもCE6にしても,別にGPIOを併用したバンク切り替えで作り出されたアドレスとは違って,CPU自身が生成するアドレスであるところがミソでして,ここにRAMを繋ぐと,確かにシステムレベルでのサポートはなくても,CPUからは特別な工夫無しに自由にアクセス出来る事には違いないのです。

 もし,内蔵ROMのアドレスに割り当てられているS3エリアを,CE3に増設したRAMのアドレスに割り当てることが出来れば,CE3のRAMが直ちにシステムレベルでのサポート対象となりますね。(あ,ここでいうシステムレベルというのは,PC-E500のIOCSが持つファイルシステムでアクセスが可能になる,という意味でして,S3でROMがアクセス出来なくなっても,そもそもその必要性が薄いため支障がないのです。)

 それで調べて見ると,この割り当てというのは,IOCSのワークエリアの5バイトに,開始アドレスとサイズの2つを書き込むことで行われているらしく,要するにここをCE3のアドレスにしてやれば,めでたくS3エリアをRAMにすることが出来そうです。

 そこで先程のメモリマップを眺めてみますと,CE3の128kByteとCE6の64kByteが連続したエリアとして合計192kByteを割り当てることも可能です。

 ただ,256kByteで1チップのRAMなどを使うわけにはいかない(チップセレクトを2本使わないといけませんからね)ので,どうしたって2チップが必要になります。

 ここまで考えて,思いついたのは先日秋月電子で買っておいた1MbitのSRAMです。こんな事もあるかと買っておいたのですが,CE3に繋がる分はいいとして,CE6に繋がる分は半分余らせてしまうことになります。

 もったいないと思いましたが,よく考えると1つ100円です。100円をけちるのに256KbitのSRAMを2つ使うようにアドレスデコーダを組む手間や,あるいは256KbitのSRAMを1つだけ使って32kByte足りないままで使うよりは,ずっとお得と考えて,1MbitのSRAMを2つ使う事に決めました。

 回路図をささっとかいて,PC-E500を分解します。

 私のPC-E500は,S1やS2エリアのSRAMに,2Mbit品というちょっと変わったものを手持ちの関係で使っています。実は3.3V品なのですが,ダイオードで電圧を落としてごまかしてつかっています。(やばいんですけどね,こういうことをするのは。)

 ですからトータル512kByteになっているPC-E500としては配線数も少なく,またSRAM自身もTSOPという小型パッケージですので,スペースは十分にあると思っていたのですが,今回の1MbitのSRAMは通常のSOPです。分厚い上に大きいので場所がありません。

 そこで,RAMカードを入れる部分をこわして,ここに配置することにしました。どうせカードをはめ込めば暴走するわけですし,これでいいです。

 しかし,SOPのSRAMは分厚いです。1つあたり2.7mmほどあるので,重ねると5.5mm程にもなります。やはり少し削って,高さを抑えないといけないと判断し,ベルトサンダーを持ち出して削りました。

 あまり削りすぎると壊れるので慎重に削っていきますが,結局2つで5mm弱程度にしました。見た目には随分薄くなったように見えるのですが,シャーペンの芯1本文くらいしか薄くなってないのかと思うと,結構がっかりです。

 配線をどこから確保するかも悩んだのですが,元のRAMが付いていたランドはすでに2MbitのSRAMへの配線で使われていて,ここを使うのはトラブルの原因になるように思いました。そこで,RAMカードのコネクタを潰して,ここから信号を取り出すことにしました。どうせカードは使えないのですし,別にいいです。

 後は40本程度の配線を根気よく繰り返すだけです。私は単純作業が好きな人ですので,こういう配線は全然苦になりません。時間の経つのも忘れてしまうほど没頭できます。もしかすると,写経なんかもやってみたらどっぷりはまるかも知れないです。

 配線が終わってテスターでひと通りの確認をして電源を入れると,問題なく起動はします。追加したアドレスに値を書いて読み出すと同じ値になっているので,まずは動作しているようです。

 S3のアドレスをワークエリアを書き換えてみると,ちゃんとS3として増設したRAMが読み書きできます。一応動いていそうです。

 でも心配なので,増設したエリア全域を,AAhと55hで埋め尽くし,正しく読み出せるかを行ってみましたが,エラーも出ずにすんなり終了。もう大丈夫でしょうね。

 これで,私のPC-E500は,256+256+192の704kByteのRAMを実装したポケコンになりました。おお,往年のPC-9801を越えましたよ。(FM-RやPC-100,ハイレゾの98には勝てないのですが)

 これに内蔵ROMの256kByteを加えると,実に960kByteとなり,SC62015の限界である1Mbyteも目前というところまできます。調べて見るとさらにCE4まで使ってしまう人までいるようですが,私はもうそこまではやる気はしません。

 で,これだけメモリを増やしてどうするのか,とお思いでしょうが,日本語化するとメモリがたくさん必要なので,とてもありがたいのです。日本語フォントが50kByteちょっと,変換辞書が70kByteちょっとですので,合計ですでに130kByteほど。これにユーティリティ類やゲーム数本,ヘルプファイルをいれておくと,あっという間に256kByteなんか使い切ってしまいます。

 S1エリアはメインメモリですから,ここをストレージにするのはあまりにもったいないです。そこでS2にファイルのたぐいを集めるのですが,私の場合残り2kByte程まで使い切っていたのです。そこに192kByteも増えるのですから,これはもう盆と正月が一度に来たくらいありがたい話です。

 設定をすませ,広いメモリ空間をゆるゆると漂う感覚は,いつ味わってもいいものです。

 仮想メモリという「偽物」を当たり前の存在にしたモダンなOSに,飼い慣らされて牙を抜かれた現代人は,目の前にあるアドレス以外は信じない,という原始の我々が一様に備えていた野生の感覚を取り戻し,あの時のように星を頼りに粗末な小舟で果敢にこぎ出すことの喜びを,もう一度知ることが出来るのでしょうか。
 

テスタの修理

  • 2008/10/23 12:02
  • カテゴリー:make:

 ところで,先日の土日は,ふとしたことから随分時間のかかる修理をやる羽目になりました。

 それは,バーグラフ式のデジタルテスタです。1985年頃だと思いますが,今はなきソアーというメーカーから,バーグラフ式のデジタルテスタが出ていました。

 なんでもかんでも「デジタル」が優れていると盲目的に言われた80年代,テスタも例外なく,アナログ式のテスタは古くさいものとして扱われていました。

 ただ,電子工作の世界は,ベテランのおじさんたちが「アナログテスタには変化を見たりフルスケールに対する割合をぱぱっと確認出来るという良さがある」などと吹聴して回ったこともあり,アナログとデジタルが拮抗すると信じられていた特異な世界でもありました。

 ならばデジタルテスタでアナログのような表示をさせればいいんじゃないか,と本気で考えた面白い人たちがいて,それが先程のバーグラフ式デジタルテスタとして世に出るわけです。

 まあ,ちょっと考えればわかるんですが,せっかくデジタルになっている情報を,わざわざLCDのセグメントに1つ1つ割り当ててバーグラフにしてしまっても,何の意味もありませんわね。

 アナログは連続量だから針で示されるわけですし,デジタルは離散量だから数字で表示出来るのであって,本質的なデータの扱い方と表示方法を切り離し,入れ替えただけでは,それぞれの弱点を組み合わせただけの,最弱のテスタが出来上がるだけです。

 面白い,とそれなりに評判になったと記憶していますが,主流になることもなく,また後継機種が出ることもなく,さらに加えると絶賛する声もないまま,メーカーであるソアーと共に消え去りました。

 余談ですが,三和,日置などと列んで,テスタのメーカーとして知られたソアーですが,どうもこの少し後で倒産し,マザーツールとカスタムの2社に分かれたようです。どちらのテスタも店頭で見ることが出来ますが,正直どちらもぱっとしないという印象が私にはあります。

 デジタルテスタのサンプリングレートが上がり,連続変化をある程度捉えることが出来るようになり,これを視覚的に表現するために,数字での表示と一緒にバーグラフを出すテスタは普通に売られていますね。1つにサンプリングレートの向上と,1つはバーグラフを補完的に使うという役割の整理により,このアイデアは後世に残ることとなったわけです。

 というわけで,その時代が生んだ迷えるバーグラフ式テスタですが,私が手に入れたのはひょんなことからです。

 高校の1年と2年の夏休みに,大阪日本橋のジャンク屋「デジット」でアルバイトをした私は,そこで大変お世話になった店長さんと時々立ち話をするのが大好きでした。確か大学の入学が決まった冬だったと思うのですが,デジットから少し離れたビルに,デジットの2号店を出すという話を耳にし,開店直前に様子を見に行ったのです。

 店長の姿が見え,いつものように話を始めたところ,デジットの2号店としてここの店長も兼務するということ,店の名前は「客をデバッグしてやる」という挑発的な意味で「デバッグ」にした,ということを聞きました。

 デジットよりはもう少し綺麗なものを扱うことにしたらしく,いわゆるジャンクというよりも,今で言うアウトレットショップのような雰囲気を目指していたように思います。

 結局デバッグは紆余曲折を経てCCPというケーブルやコネクタの専門店になり,今はもう跡形もなくなっています。

 で,そのデバッグの開店時の目玉商品の1つが,先のバーグラフ式テスタでした。といってもソアーのものではなく,おそらくソアーのOEMと思われる,別のブランドのものでした。DT3100というのですが,ググってもかすりもしません。

 本体は水色で,いかにも80年代の色をしていますが,およそ測定器っぽくありません。付属品はテスタリードだけで,ケースもカバーもありません。説明書は英語のみで,外箱は簡素なボール紙です。これが確か3000円か4000円か,そんな値段だったと思います。いや,この価格はデジタルテスタとしても安いんですよ。

 手にとって「面白そうですね,買っていきますよ」と私が言うと,上機嫌な店長は「1000円でええわ」と気前よくサービスをしてくれました。お得意さんだろうが身内だろうが商売は商売と言い放つ店長が,どういうわけだかこの日は大盤振る舞いだったので,私は気味が悪くなったほどです。「入学祝いやとおもっとき」と,ニコニコして下さったことを,私は今でも覚えています。

 私にとっては3台目のテスターで,これで測定にも幅が出るなと喜んでいたのですが,使ってみるとあまり便利なものでもなく,次第に出番が減っていきました。

 その後,電池を何回か入れ替えて使えるようにはしてあったのですが,先日思い出したようにスイッチを入れてみると,動作しません。電池をしばらく替えていないなあと思いつつふたを開けると,見るも無惨に液漏れしていました。

 ソニーの電池は,百発百中で液漏れしますね。本当に時限爆弾です。

 アルカリ電池の液漏れは本当に始末が悪く,基板を溶かしてしまうことは昨年にも書きました。電池金具はボロボロですが,幸いなことに基板には浸透していない様子です。

 そこで,修理計画です。出番がないのでもう捨ててもいいかと思いましたが,やはり思い出の品ですし,測定器には違いありませんから,とりあえずやってみましょう。

 電池金具は,リン青銅板で作り直してみましょう。ちょっとバネが弱いですが,なんとかなるでしょう。同じサイズに切り取り,曲げて加工すれば出来そうです。

 そして土曜日,修理を始めます。金具を交換するのに全部ばらすことになったのですが,それはそんなに難しくありません。20年経っているとは思えないほど,中は綺麗です。

 金具を交換し,電池を入れてみると,あれ,動きません。表示が出ないのです。ちょっといじっていると表示が出たので,電池金具の接触だろうと,組み立て直します。

 しかし,組み立てると表示が出ません。

 これは困った。

 もう一度ばらしてみますが,やはり表示が出ません。LCDは外し,その下のシールド板を外して確認をしますが,目視ではなにもおかしいところはありません。

 見ると,シリンダ型の水晶発振子があります。これがクロックを作っているのでしょうが,動かない場合はクロックを疑うのがセオリーです。オシロスコープで確認すると,やはり発振していません。

 少なくとも,電源を入れて水晶発振子が発振していないというのは正しい動作ではありませんね。そこで,指で触ったり何度か電源を入れてみると,ノロノロと発振が始まるのがわかりました。発振開始に数秒もかかるのですが,こんなに発振しにくいのでは不安定すぎます。

 でも,もともとこれでちゃんと動いていたのですから,もう一度組み立ててみます。しかし,やはりだめです。

 今度は順番に確認していきます。基板単体で発振するのを確認し,シールド板を取り付けます。まだ発振してます。LCDを取り付けると発振停止。うーん,これは面倒です。

 水晶発振子が劣化することは,しばしばあることなので手持ちの32.768kHzと交換しますが,最初から発振しないか,発振しても同じような様子です。発振子が悪い訳ではなさそうです。

 ならばと外付けのコンデンサの値を調整しますが,10pF未満にしてもあまり変わらず。32kHz位の水晶なら,発振を安定させるためにコンデンサを小さなものにすると良いので,直列にして5pF位にします。

 そうするとかなりすっと発振が始まるようになりました。それまで正弦波だった波形も,矩形波に近くなってきました。力強くなってきたので気をよくして組み立てます。

 LCDを付けたところではまだ大丈夫です。しかしケースに入れると発振しません。何度か電源を入れると数秒後に画面が出てきます。しかし,それで2時間ほどもするとまた発振しなくなるのです。

 うーん,これでは使い物にならんなぁ,と,シールドのために切り刻んだ銅箔テープを手にくっつけながら,白んだ窓の外をながめて布団に入りました。

 翌日,改めて基板を見てみると,どうも水晶発振子とLSIのパターンが長すぎて,浮遊容量が大きそうに見えます。私のような素人でも,こんなパターンは危なくてひきません。

 考えたのは,LSIの足を浮かせて発振子を直接ハンダ付けし,最短距離で配線すること,それがダメなら発振器を別に作り,外部入力でクロックを入れてやろうという,2つのプランです。

 まず,最短距離での配線をやってみます。すると,強力な発振が始まります。これならいける,そんな風に思って組み立てますが,やはり大丈夫そうです。

 最終的に組み立てて何度か電源を入れてみましたが,問題なし。制度も確認してみましたが大きな誤差もないので,このまま使えそうです。

 というわけで,あまり便利ではないキワモノテスタですが,一応直って何よりと言ったところです。どうして壊れてしまったのか,なにが悪かったのか分からずじまいですが,結果良ければすべて良し。少なくとも発振しやすい方向で改善をしたのですから,今回やったことは無駄にはならないはずです。

 改めて思ったのですが,うちにあるテスタはどれももう10年以上のものです。中には20年以上昔のものもあります。メインで使っているのは秋月の安物ですし,予想通りそれぞれみんな値が違います。なにが正しいのか,もう分かりません。

 ちゃんとしたテスタを買い直す時が来たのかも,知れません。

PC-E500の電池電圧検出回路Final

  • 2008/10/20 18:42
  • カテゴリー:make:

 まず最初に,先日の電池電圧検出回路についてです。この土日に波形の確認を実機で行ったところ,考えたとおりの動作をしていました。電圧検出器にかかる電圧も,GPIOがLowからHighになったときに少しだけ上昇するようになっており,1つの電圧検出器で2つの電圧を判定できることも確認できました。

 さて,改めて改造後の実機で動作を見てみたのですが,2度目の割り込みがかからず,BATTマークが点灯しただけで終わってしまいます。電流を調べて見るとショットキーダイオードからの漏れ電流が小さくなっており,従って2度目の割り込みがかからないようです。

 数uAの電池への流入ということで,放っておいても構わないような気がしたのですが,BATTマーク点灯の後の電圧降下で電源が切れないことが問題ですし,日によって動作が異なるというのは許し難い状況です。それに,わずかな電流でも電池は劣化すると言いますから,やっぱり避けた方がいいです。

 要するにGPIOによって検出電圧を切り替えればよいわけで,トランジスタを使って抵抗をON/OFFするような回路などを考えてみたのですが,どうもうまくいきません。たぶん無理だと割り切って,ディスクリートで作るのはあきらめました。

 電圧検出器を電池に直結し,分圧抵抗を外すという作戦も考えましたが,これは試してみるとBATTマークの検出の直後にもう1回連続して割り込みがかかり,結果として電源が切れてしまいます。これでもいいのですが,やっぱりBATTマークで警告を先に出して欲しいです。

 そこで,幼稚な手を使いました。できればこういう芸のないことはしたくなかったところですが・・・

 やってることは単純で,GPIOと39kΩの抵抗との間に,CMOSインバータを2段直列に入れるだけです。インバータの電源は言うまでもなく電池電圧,つまり3.9kΩと同じ電圧です。

 こうすると,GPIOのHighレベルはCPUの電源電圧である5Vから,CMOSインバータの電源電圧である電池の電圧に変換されます。よって,39kΩはLowになったり電池電圧になったりして,元々のような2電圧検出が可能になるわけです。しかも,もう電位差はありませんから,逆流防止用のダイオードは必要なくなります。

 しかし,ここで私はずるいことをしました。CPUからの入力は5V,一方CMOSインバータの電源電圧は5V以下です。場合によっては4V付近になります。電圧の差が1Vもあるので,下手をすれば1段目のインバータは壊れてしまうかも知れません。

 1段目はトランジスタで受け,ここで反転させたものを2段目のインバータに入れれば良いように思ったのですが,それだとGPIOがHigh(電源OFF時)にコレクタ電流が流れたままになり,もったいないないです。CMOSインバータならほとんど電流は流れません。

 インバータ2つと電圧検出器のトータルが消費する電流は,全部で6uAほど。ちょっと大きいなあと思いつつ,SRAMのバックアップにDC-DCの消費電流を加味して200uAも全体で消費するので,まあいいかと考えました。素人丸出しの設計で,仕事だとこんな事をしたら怒られてしまいます。

 この回路の動作を確認してみると,4.2V付近でBATTマーク点灯,電源OFFは3.9V付近でした。うん,これならちょうどよいでしょう。

 ということで,この件はもうオシマイです。あんまりいじりすぎると壊してしまいますから,もうこのくらいにしておきましょう。

 そして,大容量512kByteのメモリを内蔵した改造PC-E500の本領は,日本語化によって発揮されます。15年前のデータやプログラムがちゃんと残っているのがPC-E500のマニアっぷりを象徴しています。

 10年ぶりの作業なのでもうほとんど覚えていませんでしたが,思い出しながらの作業でとりあえず日本語化完了。しかしクロックを高速側に切り替えた瞬間暴走してリセットをかける羽目に・・・わずか15分の命でした。

 クロックを上げて暴走するのは,電池が減っているときと言われています。私の場合,5Vに安定化したので大丈夫かとおもったのですが,PC-E500にとって5Vは低い電圧のようです。5.5Vまでかさ上げすればたぶんクロックアップに耐えられるのでしょうが,なんというか,そこまでする気ももうないので,このまま作業をやり直します。

 終わってみると,これで結局なにもすることがないという状況に寂しさが募るわけですが,これが確かに15年前,あるいは10年前なら,大したものだと感激したことでしょう。これでPDAのようなアドレス帳やスケジュール帳があるとさらに面白いのですが,その手の実用ソフトが皆目揃っていないというのが,当時のPC-E500の立ち位置を微妙に表しています。

 考えてみると,PC-E500のCPUは後にZaurusに搭載されるCPUです。それなりにパワフルで当然です。しかし,いつの時代でもマシンの陳腐化は「メモリ不足」であることを今回もつくづく感じますね。メモリさえあればどうにかなるものです。

やっぱり目の付け所がシャープ

  • 2008/10/17 19:58
  • カテゴリー:make:

 昨日,PC-E500というシャープのポケコンの電池電圧検出回路を「謎だ」と書いたのですが,気になってずっと動作を考えていました。

 電圧検出器は4.0Vのものが1つ,3.9kΩと39kΩの2本の抵抗で電池電圧(PC-E500の場合電池電圧と回路電圧はダイオードの電圧降下分だけの差で変化は同じです)とGNDを分圧し,その中点が電圧検出器に入力されています。

ファイル 226-1.jpg

 この回路で2つの電圧を検出し,1段階目ではBATTマークの点灯,2段階目では強制的な電源OFFと,2つの動作を行うようになっています。どちらも割り込みで処理をしていますから,CPUの割り込み入力端子に繋がっています。

 検出電圧は4.0Vのみ,割り込みも1本のみ,この状態でどうやって2つの電圧を判定しているのか・・・頭をひねって考えていました。そして,ようやく答えが出ました。

 え,こんなん簡単やんけ,ですって?こんなん当たり前やがな,ですって?

 いやー,私は頭が固いので,こういうパズルは苦手でして。


・フェイズ1~電源OFFの状態

ファイル 226-2.jpg

 39kΩの抵抗をずっとGNDに落としたままにしてしまうと,電源を切っていようがいまいが常に140uA程度の電流が抵抗に流れ続けてしまい,電池が消費されてしまいます。電源OFFのときなど,何の役にも立たない電流ですから,これをカットするためにCPUのGPIOをHighにしてあります。

 これはまあ,いいですね。


・フェイズ2~電源が入った

ファイル 226-3.jpg

 電源がONになると,GPIOをLowにし,図のように39kΩをGNDに落とします。すると電圧検出器の入力電圧は,抵抗によって分圧された電圧になります。仮に電池電圧が5Vだとすれば,4.55Vになります。

 電圧検出器は4.0VでCPUに割り込みを発生させますから,この電圧ならまだ割り込みは発生しません。


・フェイズ3~電圧が下がった

 このまま使い続けると,電圧が下がっていきます。電圧検出器の入力電圧が4.0Vになる電池電圧を計算すると,4.4Vと求まります。4.4Vになって割り込みが入ったら,CPUは画面にBATTマークを点灯させて,ユーザーに電池が減ったことを通知します。この段階ではまだ電源を強制的には切りません。1つ目の電圧検出が終わりました。

 そして,これがミソなのですが,GPIOをHighに切り替え,39kΩを電池電圧と同じにします。


・フェイズ4~さらに電圧が下がると

ファイル 226-2.jpg

 39kΩが電池電圧と同じなったために,電圧検出器の入力電圧はまた4.4Vに上昇します。CPUへの入力も復帰しますが,割り込みはかかりません。

 そして電圧がさらに下がり,電池電圧が4.0Vになった瞬間,同じ割り込み端子に2度目の割り込みが入ります。CPUはこの2度目の割り込みによって,電源を強制的にOFFするわけです。

 実際には,電池からダイオードを通っていますので,電池の電圧はすべて0.6Vほど高い電圧です。ということは,BATTマーク点灯は5.0V,強制電源OFFは4.6Vとなります。

 3.9kΩを大きくすればBATTマークの点灯する電圧が高くなり,同時に電源が切れるまでの差が広がります。逆に小さくすればBATTマークの点灯する電圧が下がり,電源が切れるまでの差は縮まります。

 どうですか・・・GPIOによって電源OFF時の無駄な電流をカットすることと,検出電圧を2つ用意するという2つの機能を実現出来ているんですね。いやー,私などは目からウロコがボロボロ落ちましたよ。見事ですね。

 PC-E500,PC-E550,PC-1480Uなど,同じ回路構成の派生機種や,製造時期の違いによって分圧抵抗の値もちょっとずつ違っていたりします。BATTマークを点灯させる電圧を何度か修正してあるということでしょう。どっちにしても,電源をOFFにする電圧は4.0Vということがはっきりしました。

 実は,PC-E500のエミュレータで,LowBattery割り込みを与えてみると,1度目の割り込みではBATTマーク点灯,2度目の割り込みでは電源OFFという動作をします。割り込みによってどういう動きをするかはファームウェアによるわけですが,そのファームウェアは実機のROMから吸い出したものを使っていますから,今回の答えで間違いないのではないかと思います。

 さて,この回路は電池の電圧とGPIOのHighの電圧が同じ,という条件で動いています。しかし,昇圧回路を組み込んで回路電圧を安定化したモダンな回路構成では,もうひとひねりが必要です。

 まず,電池電圧の検出は,電池端からショットキーダイオードを通して3.9kΩに与えます。これは,電池の電圧がGPIOのHighよりもいつも低くなることで発生する逆流を防止するためです。また,回路電圧は5.0Vで安定化してありますので,GPIOのHighは5.0Vとなります。

 同じような手順で考えてみると,


・フェイズ1
 GPIOはHighで,ダイオードがOFFなので電圧検出器の入力電圧は5.0V。よって割り込みは発生しないし,電流の消費もない。

・フェイズ2
 電源ONでGPIOはGNDに落とされる。これは先程と同じ。

・フェイズ3
 1回目の割り込みがかかるのは,先程と同じ4.4Vにショットキーダイオードの電圧降下分を加えた4.6V。4.6Vに達して割り込みが発生するとBATTマークを点灯し,GPIOをHighにする。

・フェイズ4
 GPIOがHighになったので電圧検出器の入力電圧は5.0Vになる。ここから電池の電圧が下がっても,ダイオードがONしないため電流が流れず,よって5.0Vのまま。


 ということになります。あれ,2度目の割り込みはかからないですね。

 実際の動きと違うので,LTSpiceという回路シミュレータを使って動作を見てみました。ショットキーダイオードを使うと実際と同じような動きをしますが,シリコンダイオードを使うと上に書いた状態になります。何が違うのか?

 そうですね,ショットキーダイオードは逆方向電流が多く流れるのです。シリコンダイオードは逆方向電流がほとんど流れないために,シミュレータの結果が上に書いた状態と一致します。

 しかし,ショットキーダイオードは品種によるのですが,今回のシミュレーションでは30uA程も流れてしまいます。試しに,ショットキーダイオードを1N5817にしてみると,以下のような感じの挙動を示します。


・フェイズ1
 GPIOはHighで,電池電圧が4.8Vとすると,電圧検出器の入力電圧は4.82Vと少し高め。割り込みは発生しない。

・フェイズ2
 電源ONでGPIOはGNDに落とされる。これは先程と同じ。電池電圧が4.8Vなら電圧検出器には4.3Vがかかる。まだ割り込みはかからない。

・フェイズ3
 1回目の割り込みがかかるのは,4.45V。この電圧で電圧検出器の電圧が4.0Vを割る。そしてGPIOをHighにする。

・フェイズ4
 GPIOがHighになることで電圧検出器には4.51Vがかかる。ここからさらに電池電圧が下がり,2度目の割り込みがかかるのは3.8V。


 ということで,なんとまあ1度目の割り込みは4.45V,2度目の割り込みは3.8Vという結果が出ました。実機によく似た状況が再現されています。ちなみにフェイズ4における逆方向電流は26.4uA。恐ろしいことに,この微弱な電流が電池に流れ込んでいるというわけです。液漏れしそう・・・

 さらに怖いのは,この電流は温度が上がるともっと増えます。当然検出電圧も変化するだろうし,電池も危険になります。ここにはショットキーダイオードは使えそうにないということが分かってきました。

 実に奥が深い。

 さらにもうひとひねりしないと,実用にならない感じがしてきました。

 それにしても,シャープはなかなか工夫上手ですね。回路電圧と電池電圧が同じであるという前提が制約としてあるとしても,1つの電圧検出器で2つの電圧を判定できるというのは,なかなかパズルっぽくて,いい勉強をさせてもらいました。

古いハンドヘルドマシンをエネループで動かす

  • 2008/10/16 18:48
  • カテゴリー:make:

 さて,X-07とPC-2001に昇圧回路を組み込んで,エネループを完全に使い切ることが出来るようになったのですが,1つ大事なことを忘れていました。

 それは,ニッケル水素電池は,1.0V以下にしてはいけないということです。いわゆる過放電という状態になってしまうと,ニッケル水素電池は簡単に劣化します。

 今回のスイッチングレギュレータは,下限電圧が2.0Vでも出力に6V付近を出してきます。2.0Vということは1セル当たり0.5V。これはもう液漏れしても文句は言えないレベルです。やばい。

 本来なら1セル当たり1.0Vになったところで電源をカットする回路を入れるべきなのですが,最低でもバッテリーアラームが出るようにしないといけません。

 少し考えてみたのですが,X-07もPC-2001も,電池の電圧を測定する機能を持っています。問題は測定するポイントを電池端子にすることと,検出電圧が高いことです。

 X-07は内部で4.6Vに安定化している関係上,4.8V付近でアラームが出ます。PC-2001は電池の電圧をそのまま供給しているので,やはり4.8V付近でアラームが出ます。

 そこで,これらの回路を改造し,電池端子の電圧が4.0Vになったらアラームが出るようにしてみます。

(1)X-07の場合

 X-07は,コンパレータで4.6Vの回路電圧を測定しています。1MΩと1.3MΩで分圧しているのですが,電源側の1MΩに2.2MΩを並列に繋ぐと,大体4Vでコンパレータが動作します。

 これを電池端子にくっつけてやれば理屈の上ではOkなのですが,果たして動作確認をすると,ちゃんと4.0Vで「LowBattery」の表示が出てきます。うまくいきました。

 ただ,どういうわけだか「CardLowBattery」というアラームも同時にでます。おかしいなあと思ってさらに調べてみました。

 X-07は,メモリカードに内蔵されたリチウム電池の電圧も本体側で監視できるようになっています。カードに搭載された電池の電圧が3.0Vを割ると,画面に「CardLowBattery」と出るようになります。ところが鈍くさいことに,カードを入れてない場合にも「CardLowBattery」が出るのです。

 これはうっとうしい。そこで昨年,カードの電圧低下をCPUに知らせる信号線をカット,本体電源低下の信号線を突っ込んで,本体の電圧が下がったら両方のメッセージが出るように,修理のついでに改造をしてあったことをすっかり忘れていました。(ただし,今までCardLowBattery表示が出たのを見たことがないのです・・・おかしいですね)

 そこで今回は改造箇所を元に戻し,カードの電圧検出点を電池端子に接続してみました。こうすると,4.0Vに下がると「LowBattery」が,さらに3.0Vまで下がると「CardLowBattery」が出てくる仕組みです。実際3.0Vまで下がってしまうとかなり危険なわけですが,遊ばせておくよりましでしょう。

 これでX-07もエネループ完全対応となりました。


(2)PC-2001の場合

 PC-2001の場合,電池端からシリコンダイオードを通して0.6V下がった電圧をそのまま回路に供給しています。コンパレータを使って回路電圧が4.8Vになったら「BAT」アイコンが消えるようになっています。

 4.8Vということですので実際は5.4V付近で「電池切れ」となってしまいますが,これではさっぱりダメですね。アルカリ電池でも1セル当たり0.9V位まで使い切るのが当たり前なのですが・・・

 まずはこのダイオードをショットキーダイオードにします。X-07は最初からショットキーダイオードになっていて(お金かかってます),しかも電圧の分圧回路は合計で2MΩ以上と無駄な電流消費を押さえ,しかも誤差1%の金属被膜抵抗が使われていました。

 PC-2001では5%のカーボン抵抗で分圧をしているようです。大丈夫なんか?と思って調べて見ると,温度補償にはサーミスタが,電圧の調整には可変抵抗が使われていました。X-07とは随分考え方が違うものです。

 可変抵抗を回してみると検出電圧を4.0Vに調整可能だったので,検出点を電池端子に付け替えて改造は終わりです。4.0Vになったら「BAT」アイコンが消えることを確認し,作業完了。

 これでPC-2001もエネループ完全対応になりました。


(3)PC-E500の場合

 PC-E500も電池からダイオードを通して5.4Vになったものをそのまま回路に供給しています。PC-2001と同じような構造ですが,当然それぞれのLSIがきちんと動作出来る電圧の範囲をはみ出す場合もあるわけで,結構綱渡りで動いている上に,電池を使い切れていません。

 電圧検出の仕組みはさすがに後の時代のものだけあり,専用のICが使われています。松下のMN1280QというICで,4.0VになったらLowになるICです。

 回路電圧を3.9kΩと39kΩで分圧し,MN1280Qの出力は割り込みに入っています。面白いのはこの分圧抵抗のGNDへの落とし方で,GNDではなくGPIOに繋がっています。

 電源をOFFにしているときにはここがHighになり,抵抗を通して無駄な電流は流れません。起動と同時にこのポートがLowになり,電圧検出ICに電源電圧がかかります。

 ただ,よく分からないことが1つあります。PC-E500は,電池の電圧が下がるとBATTマークが点灯します。この段階では電源は切れず,OFFにした後でも再度ONに出来ます。

 しかし,ここから0.2V程電圧を下げると,なんと電源が切れるのです。電源キーを押しても一瞬起動しますが,すぐにOFFになります。

 回路電圧が下がって動作しなくなっているんだろうと思うかも知れませんが,回路の電圧は安定化して供給しておき,電圧検出点の電圧だけを下げて試してみた結果です。

 腑に落ちないのは,電圧検出ICは単純に4.0Vを割ったかどうかを見るだけで,2段階の検出を行う能力はないことです。なのに,BATTマークを点灯させたあと,電源を落とすという機能が実現できています。

 GPIOでなにかやってるのだろうと考えてみましたが,電圧検出ICの出力はCPUの割り込みにただ1本だけ入っているので,動作が分岐することは考えられません。また,この検出点をオープンにすると,BATTマークは点灯しますが,電源は切れません。謎です。もう少し考えてみます。

 それで,今回もこの検出点を電池端に接続してやればよいのですが,注意しないといけないのは,GPIOでGNDに引っ張る構成ですから,GPIOがHighになった場合には電池端の方が電圧が低く,電池側に電流が逆流してしまいます。

 そこで,ショットキーダイオードを入れて逆流防止をします。

 試してみると,4.2VでBATTマーク点灯,4.0Vで電源OFFという結果になりました。一応問題のない動作をしているのですが,欲を言えばBATTマークは4.0Vで,電源OFFは3.8Vくらいで切れて欲しいところです。

 そこで分圧抵抗を調整しようと思ったのですが,なにせ電源側がGND側に比べて1/10の抵抗しかありませんから,分圧抵抗を使わず直接電圧検出ICに入れてやるしかありません。試してみると,BATTマークの点灯と同時に電源が切れてしまいます。またもや謎です。電圧検出ICが2レベルで,2本の割り込みがCPUに入っているなら分かるのですが,どうして分圧抵抗の有無でこんなに挙動が変わるのか,考えてみたのですがわかりません・・・

 とりあえず元の値にもどし,4.2Vで警告,4.0Vで動作停止という仕様のままに,組み立てることにしました。最終テストでも問題はなく,動作もきちんとしていますので,一応これでエネループ完全対応,ということにしておきましょう。なかなかすっきりしないことは不満ではありますが・・・


 ということで,結局アルカリ電池の特性に依存した形で電源供給を行うような思想の昔のマシンを,ニッケル水素電池に対応させるのは思った以上に面倒なことです。単純に電圧を上げてあげるだけではだめで,バッテリーアラームもそれなりに対応してあげないと電池を痛めてしまいます。本来なら電源カットの回路も必要です。

 今の電池で動作する機器は,ほとんどすべてがこうした電源回路や電圧監視回路が組み込まれているので心配はありませんし,きちんと電池を使い切ることも出来るのですが,20年ほど前まで,こうした贅沢な仕組みを持つ機器はまだまだ少数派であったことを,改めて感じました。

 そういえば,使い切った電池でもリモコンには使えるのですぐに捨てないで,と暮らしの手帳系の豆知識を耳にしたことはありませんか。

 これは,大きな電流を引っ張る機器では,内部抵抗による電圧降下が大きくて使えなくなっても,消費電流の小さなリモコンでは電圧降下が小さくて済むからだ,という理由が説明されています。

 それは確かに正解なのですが,今から20年前の状況を考えると,実は内部抵抗以前の問題として,きちんと電池を使い切っていない機器が案外多かったのではないかと思います。

 それは,本来ならエネルギー供給という役割だけのはずの電池に,電圧の安定化という機能も持たせ,しかもすぐに失われる安定化能力を確保するために,まだまだエネルギーを保っている電池を使い捨てるという事実です。今ならこんな製品は許されないことでしょう。

 そして,つくづくのんびりした時代だったのだなあと,昭和生まれの私は遠い目で高い秋の空を見上げるのです。

ユーティリティ

2026年01月

- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

過去ログ

Feed