エントリー

2022年02月の記事は以下のとおりです。

AVRの新シリーズとPICKIT4

  • 2022/02/09 13:36
  • カテゴリー:make:

 先日,SRAMとEEPROMを相互に読み書きする治具をAVR(ATmega88V)で作ったわけですが,実はブレッドボードで作りました。ブレッドボードはこれまで何かと窮屈ですし,綺麗に作る事が出来ない上に,苦労して作ったのにすぐに壊してしまうと言うはかなさが残念で,あまり積極的に使ってこなかったのです。

 まあ,結局の所ハンダ付けが好きだったという事に尽きるのですが・・・

 ですが,今年の冬の寒さは厳しくて,屋外並みに寒い作業部屋では耐えられず,暖かいリビングで作業をするために,ブレッドボードを使って見たところ,これがめっぽう面白いのです。

 DS1742Wの読み書きを行うプロジェクトは終わってしまいましたが,ちょっとさみしかったので,気になっていたAVR関係の宿題をやってみることにしました。

 私のAVRの開発環境は10年以上更新されておらず,IDEはAVR Studio4.19,コンパイラはWinAVR,ライタはデジットのAVRWRT2という,ミニマムかつ古くさいものです。そう,AtmelがMicrochipに買収されるだなんて,夢にも思わなかった時代のままです。

 ですが,tiny2313とかtiny13を使っている分にはこれでもう十分で,むしろ変に更新してしまうと,リビルドしたときにギリギリまで使い切ったメモリに入りきらないという話が出てきたりするので,そのままにしてあります。

 しかし,これではデバッグも厳しいですし,新しい品種に対応しません。秋月最安値のtiny13が値上がりして,代わりに最安値に躍り出たtiny202に移行しようにも,この環境ではコンパイルさえ出来ないのです。

 昨年の春にPICKIT4は買ってあったので,tiny202もこれで開発すれば良いのですが,それにはMPLAB XなりMicrochip Studioを導入しなくてはいけませんし,なによりAtmelがMicrochipに買収されたという現実を受け入れることから始めなくてはいけません。

 なにせツール類をアップデートせず,AVRをマイコンではなく汎用電子部品として使っていた私ですので,最新の状況にするには不安が伴います。

 AVRシリーズはどのくらいMicrochipに統合されているのだろう?
 AVRのコンパイラはXC8だけ?XC8ってフリーで使えるの?
 それまで書いたコードはリコンパイルで使える?
 PICKIT4でAVRってちゃんと使えるんかい?
 tiny202って旧シリーズのAVRとは何が違ってる?

 まあ,案ずるより産むが易し。AVRを使うと言うよりも,新しいマイコンを開発環境ごと新規に導入したので勉強し直しだ,くらいに考えて試してみましょう。

 まず,Microchipとの統合具合ですが,最近はかなり総合が進んでいるように思います。というのは,PICKIT4でAVRの開発をするのが当たり前になっているような感じですし,MPLAB Xを使って例もよく見るようになっているからです。

 ですが,私はAtmel Studioを引き継いだMicrochip Studioを使うことにしました。これでもちゃんとPICKIT4をサポートします。

 コンパイラはgccもちゃんと使えます。これは安心。XC8はフリーでも使えますが,最適化が出来ないので,メモリの小さな安いマイコンでは影響があるように思うので,私は使いません。

 そうなるとソースの互換性ですが,ほぼ大丈夫だと思います。思います,と言うのは正直に言って試していないからなのですが,実は知らない間にマクロの使い方が随分変わってしまっていて,リコンパイルする気が失せてしまったからです。

 例えば,_BV(PC0)なんていう書き方はもうしなくて,今はPIN0_bmと書いたりします。DDRBもPORTB.DIRと書きますし,これは本当に新しいマイコンを覚えるようなもんです。

 もちろん,古い表記でもビルドは通りますし,ちゃんと動きます。けど,わざわざ新しく書くコードで古い書き方を踏襲するのもおかしいので,この際新しい書き方を覚えることにしました。

 で,最初の一歩,ハードウェア界のHelloWorldたるLチカを書いて,PICKIT4でデバッグです。UPDIは非常に楽で,たった3本繋ぐだけでデバッグも書き込みもシームレスにこなしてくれます。これはいいですねえ。

 PICKIT4は高電圧書き込みも行えますので,私のようなうっかりヒューズビットを間違って設定してしまう人も救えます。

 ということで,tiny202 + PICKIT4 + MicrochipStudioで一連の作業が出来ました。やってみると簡単です。

 次はI2Cです。8ピンの小型マイコンではI2Cが使えるとなにかと便利で,LCDからEEPROMからセンサから,ピンを消費することなくペリフェラルを増やせます。しかも使う端子は2本だけ。

 tiny13やtiny2313では,私はGPIOを叩いてソフトでI2Cマスタを実装して使っていましたが,ATmegaシリーズではTWIというハードウェアが入っているので,随分と楽になりました。

 そのTWIが,tiny202には入っています。これは助かったと,早速使って見ようと思ったのですが,なかなか大変でした。

 こういう場合,同じTWIですのでコードの互換性はあると思うじゃないですか。レジスタ構成まで同じとはいいませんが,レジスタ名や手順などは同じじゃないかと期待していました。

 しかし,コードをベタ移植しても全然動きません。クロックが異なるせいかもと思って修正をしましたがだめでした。

 こういう場合は真面目にデータシートを読むに限ります。するとATmegaのTWIとtiny202のTWIは全然違うものだとわかりました。スタートコンディションの出し方も異なるほどですので,レジスタ構成だけではなく手順も異なるくらい全然違うものというのが正解でしょう。

 なんとか辻褄を合わせてようやく動き出しました。(実は回路も間違えていたので全く動かなかったのです)

 LCDもEEPROMも動いたので,これでI2Cは大丈夫でしょう。

 てなわけで,AVRの新シリーズを一通り動かしてみました。IDEもライタもデバッガも新しくなり,その上ソースを記述する作法や約束事も新しいとなれば,もう本当に新しいマイコンに手を出したこととなにもかわりません。

 ですが,そうだとしても,低価格,8ピン以下の小型が揃っている,多ピン大容量品もしかもDIPも手に入る,アーキテクチャが綺麗でCで書いても我慢しないですむ,そして世界中にユーザーがいる,というメリットはAVRの個性そのものであり,覚え直してでも使う価値があるものだと思います。

 特にtiny202などは,低価格なのに豊富なペリフェラルを備え,CPUにもハードウェア演算器を持つなど,安いマイコンでもここまで便利になったのかと思えるものに仕上がっています。

 惜しいのは,昨今の半導体不足のあおりを受けてか,秋月でも価格が上がったり入手が出来なくなっていたりすることでしょう。tiny13はかつて50円だったもんが110円と高騰していますし,tiny202は私が買った45円から50円に値上がりしてしかも在庫切れです。tiny202は安いときで1つ35円くらいだったこともあるわけで,それを考えるとホビーストにも厳しい状況が続いていると言わざるを得ません。

 私の場合,そのマイコンが使いこなせるとわかったとき,手元に在庫を持つようにしているのですが,今回改めて棚卸しをすると,おそらく死ぬまでに使い切らないくらいのAVRを抱えていました。tiny2313のフラットパッケージなんて,こんなにたくさんあってどうするのよ・・・



Zfcを修理に出す

 いかにZマウント,いかに最新の機種,とはいえ,基礎体力に根本的な差があるZfcとD850ですが,気軽さや小ささでZfcにはそれなりの出番があります。

 ですが,昨年くらいから,シャッターボタンを押し込んでもシャッターが切れないことがしばしば起こるようになりました。

 あれ,おかしいなと思っているとカシャッとシャッターが切れたりしますし,そうかと思うと2回連続でシャッターが切れたりします。このくらいの押し込みでシャッターが切れると思っていても,その通り切れることもあれば切れないこともあり,どうも安定しないのです。

 これはよろしくありません。強く押し込めば切れるのでしょうが,それではブレを防ぐ為に苦しい修行を重ねてようやく体得した「握るようにシャッターボタンを押す」という技が無駄になります。

 このまま悶々として使っていても精神衛生上よろしくないので,思い切って修理に出すことにしました。

 保証期間中ですので,持ち込み修理をすれば返却に配送を使ってもらっても無償です。ただ,電車賃をかけて,わざわざオミクロン株がまん延している町中に飛び込むのもバカバカしいので,小さめの箱に入れて発送します。

 1月25日に発送,翌日ニコンが受け取ってそのまま修理進行,2月4日に修理が完了し翌日受け取りました。

 結果ですが,シャッターボタンのスイッチを交換して頂いていました。これは期待出来ます。事実,最初はなんの問題なく,やっぱり購入直後は問題がなかったんだなあと思ったのです。

 しかし,何度か使っているとやはり再発,やはり解決していませんでした。

 そこはもう過度な期待をしておらず,こんなもんだとニコンが言えばそのまま引き下がるつもりであったこともあり,これ以上文句を言う気もないのですが,D850では同じように使っても起きないことですので,やはりZfcは手を抜いているということだと思います。

 まあ,もともとクラスも違いますし,押し心地も底を打った感じも全然違いますので,同じ物を求めるのは酷だろうと思います。こういうところで差が出るものなのですね,高級機とそうでないものの間には・・・

 幸い,2回シャッターが切れる問題はまだ出ていません。しかし時間の問題でしょう。
 
 そして今回の修理には失敗が2つ。

 1つは交換された部品の返却をお願いし忘れていたこと。特に今回のような念のための修理では,交換された部品も十分使える場合が多いのでなにかと役に立つのです。

 もう1つは,ISOダイヤルがグラグラすることをきちんと伝えきれなかったことです。発送時に思い出したのでメモに手書きして送ったのですが,見事にスルーされてしまいました。シャッターダイヤルと比べて見ると,明らかにグラグラするんですが,他の個体を見ていないので,これでいいのかどうかがわからないのです。

 相手も仕事でやっているわけですから,こちらもちゃんとお願いをしないといけません。次は気を付けないとなあと思うのですが,それにしても今回は得られるものが少ない修理だったと思います。


TDS3054BのRTCの電池を交換するためにAVRで治具を作る

 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で遊んだわけですが,もう少し慎重にやらないといけません。

 ということで,久しぶりに仕組みを考え,ハードを設計して組み立て,ソフトを書いてバグを取って,という一連のパズルを楽しみました。目的がないとやる気が起きない不精者のホビーストですが,やっぱりモノづくりは楽しいものです。

 

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

2022年02月

- - 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 - - - - -

検索

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

ユーザー

新着画像

過去ログ

Feed