TDS3054BのRTCの電池を交換するためにAVRで治具を作る
- 2022/02/07 11:47
- カテゴリー:マニアックなおはなし, make:
TDS3054Bというテクトロの古いオシロスコープは,私の持つオシロスコープでは最高のものです。4ch,500MHz,5GS/sと,今でも立派に通用するスペックですし,なんと言っても当時のベストセラー機であり,その測定結果はどこに出しても信用されるといって過言ではありません。
ひょんなことから我が家にやってきたTDS3054Bですが,2年ほど前に内蔵の電池が切れてしまい,電源を切っている間は時計が進まなくなってしまいました。
不便なのは測定前に時計を合わせることくらいなので別に困っていないのですが,やはりちょっと気持ちが悪いもので,このオシロスコープを使う作業が一区切り付いたら対策をしようと思っていました。
TDS3054BなどのTDS3000シリーズは,リアルタイムクロック(RTC)として,DALLASのDS1742Wを使っています。このIC,コイン電池とRTCとSRAMをエポキシでパッケージしたもので,外からは16kbitのSRAMそのものに見えるのですが,電源を切っても中身が消えないという便利さから当時はずいぶん流行りました。
しかし一次電池ですのでいつか電池切れになります。そうするとRTCもSRAMもバックアップ出来なくなるので,ある時急に「あれっ」となるわけです。
今はフラッシュメモリやらEEPROMやらがあるのでこんなものを使うことはないのですが,ある時期の電子機器にはこういう特徴的なデバイスが多く使われ,その時は(ほぼ)永遠だと勘違いされた5年や10年がリアルに経過した時,様々な問題を引き起こしているんです。迷惑な話です,
TDS3000シリーズは幸いなことに,SRAMでバックアップされる内容に重要なものはなく,完全に放電してデータが失われても使用を続けることが出来ますが,先程書いたように時刻を毎回合わせる必要があったり,セットアップが保存できなくなったりするので,やっぱり正常な状態に戻したいところです。
戻すには2つの方法があり,1つは新しいDS1742Wに交換すること。しかしこのICは随分前に製造終了していて,入手はほぼ不可能です。よく中国の業者が売りに出していますが,あれはほぼ偽物です。
ならばともう1つの方法ですが,これはパッケージを分解し,電池を交換することです。そんなに難しい作業ではありませんが,破損のリスクはあります。
とはいえ,現実には後者しか選択肢がないわけで,私も電池交換で検討を始めました。
まず,通電しながらだと電池の交換を行ってもデータは消えません。しかし,不慮の事故で消えてしまうと二度ととり戻せないので,なんとかバックアップを取っておきたいところです。
先人達の知恵を借りれば,なにやらDS1742Wの読み書きも可能な安価なROMライタがあるそうです。ただこれ,かつては4000円ほどで買えたものが,今は8000円以上するようです。それでも十分安いとは思いますが,4000円が8000円ですからね,バカらしいです。
そこで自作することにしました。DS1742Wのデータシートを見ていると,本当に普通の非同期SRAMです。ならば,使い慣れているAVRをつかってさっとでっち上げてしまいましょう。
ピン数の関係で,ATmega88Vを使うことにします。まず8ビットのデータバスと11ビットのアドレスバス,これにコントロール信号を確保します。
それから,16kbitのデータを保存するメモリがいりますが,これは電源を切っても残っている不揮発メモリであって欲しいのですが,あいにく内蔵のEEPROMでは全然たりません。なので外部にI2CのEEPROMを用意します。I2CはATmega88VではTWIで簡単に実現出来るので,ついでにI2CのLCDも取り付けて便利にしましょう。
しかしこの段階で端子が1つ足りません。ならAVRのリセット端子をGPIOに切り替えればいいよと手を打ったのですが,これをヒューズビットで設定してしまうと,もう普通のプログラマでは書き込めないことを忘れていました。
そこで,SRAMのCSとOEを常時Lowに落として読み書きすることにしました。SRAMからEEPROMへ転送,EEPROMからSRAMに書き戻し,そしてベリファイと機能を実装し,普通のSRAMでテストして完成!
早速TDS3054Bを分解しDS1742Wを取り出し,自作のリーダーにセットします。そしてEEPROMにデータを保存します。EEPROMを専用のリーダーでPCに読み出してダンプすると,なんかおかしなデータっぽいのですが,正解がわかりませんのでこれまでのテスト結果を信じ,先に進めます。
TDS3054Bにはソケットをハンダ付け,取り外したDS1742Wは慎重に削って電池を露出させます。すでに電圧は0.6Vになっていて,もう動かないも同然です。
新しい電池はCR2032を外部に電池ケース使って用意します。古い電池と並列に繋いで直ちに古い電池をカットして作業は終了です。作業は上手くいったのでデータは消えていないと思っていたのですが,TDS3054Bに組み込むと,やっぱり時刻も狂っていますし,連続稼働時間も無茶苦茶になっていました。セットアップも初期化されています。
ならばとすでに保存してあるデータをEEPROMから書き戻します。しかし,やっぱりデータは化けたままです。ああ,正常にデータを保存できていなかったのです。
もう消えてしまったのですから,今さらどうすることも出来ません。あきらめてSRAMの内容を初期化しました。連続稼働時間も0時間にリセットです。
しかし,何が悪かったのか気になるじゃないですか。そこでもう一度自作のリーダーのコードを見直し,さらに波形も確認すると,SRAMからのリードにバグがありました。実は,念のためにいれた一行を,結果が同じだからとコメントアウトしたんです。しかし,波形を見ると必要なコードであることがわかりました。
AVRは,ポートに出力する時にデータを設定するレジスタが,入力時には内蔵プルアップを指定するレジスタとして機能します。SRAMをリードしてその結果を読み込んだあと,単に出力に切り替えただけだとプルアップの端子がデータによって毎回変わるようで,入力ポートにする時には同時にプルアップの設定もやり直す必要があるのでした。
ここを修正して改めてDS1742Wをリードすると,今度はそれっぽいデータが読み込めています。これを書き戻してTDS3054Bにセットすると,元の状態で起動することも確認出来ました。しかし時既に遅し。DS1742Wは初期化されています。
ならばと,連続稼働時間を復活させようと,メモっておいた時間を所定のアドレスに書き込んでやりました。すると連続稼働時間だけは元に戻せました。やれやれ・・・
しかし,電源投入回数だけは戻せないのです。これは,電源投入回数はSRAMではない別のメモリに書き込まれているからだそうで,ここを初期化してゼロにすると,もう復活させる方法はないということでした。
完全に元の状態に戻すことは出来ませんでしたが,バッテリは復活してデータの保存は出来るようになりましたし,時刻も毎回合わせずに済むようになりました。連続稼働時間は戻せましたが電源投入回数は失われてしまいました。その他に支障はなく,残念ながら今の私に出来る事はこれ以上ありません。
加えて,私がAVRで作ったリーダーは正常に動作し,SRAMの読み書き,EEPROMの読み書きも問題なく出来ることが確認出来ました。つくづく惜しいのは,本番に行く前にちゃんと波形を見ておけばバグに気が付いただろうなあということです。波形確認は大事ですよ,本当に。
そして,リセットをGPIOにしてしまった書き込み出来ないATmega88Vですが,これはリセッタを自作して復活させました。久々にAVRで遊んだわけですが,もう少し慎重にやらないといけません。
ということで,久しぶりに仕組みを考え,ハードを設計して組み立て,ソフトを書いてバグを取って,という一連のパズルを楽しみました。目的がないとやる気が起きない不精者のホビーストですが,やっぱりモノづくりは楽しいものです。