TOP | blog

2023-03

PIC32MX

キャッシュの初期化ロジックを書こうとしてデータシートを調べていたのですが、 マニュアルにもデータシートにもどこにもレジスタのアドレスに関する記載がありません。 SoCのブロック図をよくよく眺めてみると、 PIC32MX2はそもそもキャッシュとなるべき周辺回路を有していないのでした。 物理で存在しないレジスタを探していたのか、私は。

SRAMウエイトを指定するレジスタは存在します。 SRAMは初期値で1ウエイトが入る設定になっています。 こちらは正しく初期化する必要があります。 PIC32MX2のSRAMは0ウェイトで動くはずですが、 実際のところはプログラムの実行が暴走するかどうかを回路上で確認しないと定まりません。 USB応用を目的にしていますので、CPUは48MHzで動かす予定です。 48MHzで1ウエイト要るのか、それとも要らないのかを調べることになります。

USBasp

USBaspは汎用プロトコルとして外部設計されており、 ISPプロトコルを使う限りデバイスを問わない特徴があります。 そのこともあって今はもう保守されていませんが、 その後発見された不具合があるためソースを修正する必要があります。

USBaspのファームウェアは何かと古いコードなので最新のコンパイラではエラーが出ます。 いくつか修正してファームウェアのコンパイルが通りました。 しめしめ。

あとは組み立てです。 RAMはほとんど使っていない様子ではあるもののROMの利用は4KBをちょっと越えた程度あります。 8KBのデバイスでないと納まりません。 デバイスの値段を考えて、原作どおりATmega8をそのまま採用する方向にしましょう。 USBバス側は3.6VのZDを使う案が原作どおりですが少し落として3.3VのZDにします。 バスのプルアップは3.3Vで吊るべきですが、 計算してみると大きな問題がなさそうなので原作どおり2.2kΩで5Vに吊っても良いかもしれないと考えています。 終端抵抗の安全性は先に計算したところなので、原作どおり68Ωを採用します。 ソフトウェアでタイミングを得ている場所があり、 ファームウェアで思わぬバグが出ると嫌なので水晶振動子の選択は12MHzのまま触らないことにします。 水晶に抱かせるコンデンサは22pFを試して動けばそれで良いことにします。 ISP端子側にはN-MOS FETのレベルコンバータを取り付けることを考えています。 本来は電源断の保護をする回路を付けなければなりませんが、 リレー類を抱かせるとお値段が高騰するので省略です。 コネクタはハーネスの都合で6Pのヘッダを使うこととし、ISP protocol専用の配線をします。

USBaspでTxDとRxDが配線されている理由がよくわからなかったのですが、 AVR918の文書を参照するにTPIで使われるもののようです。 ATtiny4/5/9/10/20/40は使う予定がほぼないので配線をサボっても大丈夫かな?

クロック発生器の枯渇

秋月でエプソン製SG-8002DCの販売数量制限が掛かっており、品切れが近づいています。 プログラミングに使う工具は既に品切れになっています。 メーカ側でも生産完了品なので供給は既に断たれています。 市価300円相当であり「特注するよりは」安いということでしたが、 枯渇により気軽にほいほい書き込んで使うわけにはいかなくなりました。 今後は用途を絞って使ってゆくことになります。

この品物はプログラマブル発振器であり、店頭で扱いがない珍妙な周波数を用意するために重宝します。 もちろん短所もあります。

とはいえ、その程度のことが大きな制約になるものでもなく、 周波数が自由である点は大きな長所になっています。 後継となる5Vデバイスはないようです。 3.3VでよければSGR-8002DCが相当品です。 SGR-8002DCにはプログラマがないため販売店で少量ずつ書いてもらうことになります。

主にAVRを標的としたマイコン工作では、 キリのよい4MHz, 8MHz, 10MHz, 12MHz, 16MHz, 20MHzのいずれかしか使わないことが多いため、 大量に出回っている標準品の水晶発振子で賄えます。 このデバイスの枯渇そのものは実際のところあまり深刻なものではありません。 しかしながらデジタルオーディオ工作ではキリのよろしくない特定の周波数が求められるため、 その特定の周波数が得られないと少々困ったことになります。 CDプレーヤで使われている周波数であればまだ海外通販を頼ることができます。 水晶振動子であれば発振器よりは安価に手に入るでしょう。 海外通販を頼むのは何かと面倒ですけども、入手可能な周波数は充実しています。 試作で済まない場合は海外通販を頼むのが正解でしょう。

オーディオセットでも使われていない奇妙な周波数が欲しくなったらどうしたらいいでしょうか。 そんな工作はしないと割りきるのでしょうか。

デバイスの入手難もさることながら、 プログラミング工具のサポート期限が気になります。 デバイスがあっても工具が無ければ意味がありませんし、 その工具が使えなくなっても意味がありません。 SG-Writer IIはWindows専用の工具です。 Windowsのバージョンが上がると使えなくなる恐れがあります。 これもまた悩ましい問題です。

クロックのために任意波形発生装置を買って使う? 60MHz程度まで振れるものが市販されていますし、 実験ならそれを使うのが妥当かも知れませんね。 机上が大げさになってしまいますが。

ICソケット問題

ICソケットには板バネ構造の平ピン式と丸ピン式があります。 平ピン式は平たいピンしか挿せませんが、安価であり、半導体部品を挿す用途には必要にして充分です。 酸化防止のめっきがされておらず、一点接触で保持されることになるため振動に弱いという弱点があります。

丸ピン式は酸化防止のめっきが施されていることが多いことを高信頼性の理由に挙げてよいと考えます。 丸ピン式は半導体部品の他に丸い足を持つ部品を挿すことができます。 用途が広いということは挙げてよいと考えます。 秋月扱いの部品でいうならば細ピンヘッダには丸ピンソケットを使うことが定石と考えます。 抵抗の足を挿す等の無理をする予定があるのなら、迷わず丸ピンを使います。

繰り返しの挿抜に関して平ピンと丸ピンのどちらが優れているかという情報は持っていませんが、 経験的にはバネの数が多い丸ピンのほうが安心できるように思います。 実験用途であれば丸ピン式で統一してかまわないでしょう。 一方、譲渡等を前提においた量産用なのであれば、 板バネ式の平ピンソケットも積極的に検討したほうが良いのでしょう。

avr-gcc再構築

Linuxにavr-gccをインストールする手順は従来どおりです。 GMP, MPFR, MPC, ISLライブラリを先にインストールしておき、 それらを使う形でcross binutilsをインストールします。 最後にcross gccをインストールします。 手順は一度作っておけばよく、他のtargetについても応用ができます。

処理系だけあってもライブラリが無いので、 追加でライブラリをインストールします。 旧家のnongnu.orgにあるリポジトリは2016年を最後に保守されていません。 途中でforkが作られたりしましたが現在はgithubに中央的なリポジトリが作られており https://github.com/avrdudes/avr-libc で維持されている様子です。

floatまわりのサポートライブラリが増えていてコンパイルに時間が掛かりますね。 昨今、非力なマイコンでfloatを使いたい人が多いのでしょうか。

AKI-AVR-PRG改訂ファームウェアで書き込めるデバイス

avr910互換aki-avr-prgファームウェアとしてakibow氏による改良品が昔に配布されていました。 現在は配布されていないようです。

ざっくり挙げてみましたが、 書き込めるメニューとしてはAT90S2313, ATtiny2313, ATmega8ぐらいしかめぼしい品種がないですね。 その他の品種でISPプロトコルを扱うものはAVRISP mkIIあるいはUSBaspを使って書き込むことになります。 なおAT90S1200Aを除外してAだとかPだとかのサフィックスが付く物はプログラマ的に別品種です。

AKI-AVR-PRGは給電式のデバイスでありまして、通常の受電式ではありません。 このためISP端子を応用基板そのままに使う用途には適しません。 28PDIPにも対応していないため、28PDIPを使うためには別途アダプタを作る必要があります。 ISPではないICソケット式のプログラマにも用途はありますから、 どこかの時点で用意しておきたいところです。

AVRの将来性

AVRのアーキテクチャはマイクロコントローラに最適化されており、 現状より拡大しようがありませんし、縮小しようもありません。 初期よりはだいぶ拡張された製品ではありますが、 それでも8bitの範囲を越えるものではありません。 AVRの強みはgccにあるので、gccの支援が無ければ利用者層が少なかっただろうと推測されます。 この先、何年ぐらい供給が続くか、が運命を握っています。

AVRが出始めの頃は「なんだろうこれ」だったわけですが、 gccが対応してからはあっという間にスタンダードになりました。

8bitのアーキテクチャに人気が無くなるということは今の時点では考え辛いのですが、 それでも、将来32bitのアーキテクチャに置き換わることはあり得ない話ではありません。 電池式小型家電は専用ICで作られるようになるのでしょう。

汎用ロジック入力

いまどきの事情としては3.3V電源回路への対応は欲しいところです。

電源電圧のレベル差を吸収する回路としてはBSS138 N-MOS FETでクランプする方法が考えられます。 SMDを手はんだするのはしんどいので秋月のモジュールを採用しましょう。 この場合、必然的にプルアップが入ります。 プルアップを容認できるかどうかは応用回路側でどう配慮するかに掛かっています。

自己書き込みに対する策としては、ジャンパで切り離すかまたは74HC4066のアナログスイッチを配します。 マイコン本体をICソケットに挿すことにして別途書き込んでもらうことも一案です。 貫通穴部品を採用しICソケットを手配するならば「何もしない」ことも十分に案になります。

USBとVcc

USBaspを採用するにあたり、コントローラの電源電圧を考える必要があります。 とはいってもクロックが12MHzなので、オリジナルのATmega8では5Vしか選択の余地はありません。 ATtiny2313AもしくはATtiny44Aを使う前提で3.3Vを選んでもよいかなという程度です。

USB1.1の信号は3.3Vの振幅で定義されています。 バス電源が5Vなので5Vと思いがちですがそうではありません。 普段意識することはありませんがUSBaspではUSB側の3.3V振幅を得るのにダイオードクランプが採用されています。 68Ωを通して3.6Vのツェナーダイオードに渡しており、電圧差で20.6mAほど流す計算なのですが、 ずいぶんギリギリの設計をしたもんだなと思います。 3.6Vのダイオードが使われている理由は誤差を見込んでもなお USBホスト(パソコン側) の信号を短絡しないためです。 設計によっては3.3Vのダイオードを採用している例もみられます。 3.3Vのダイオードで USBホスト(パソコン側) の信号を短絡する事故が起こらないかどうかはよくわかりません。 ただし、USBのホストは短絡を起こしても壊れないことを求めているようでもあります。

個人的には、USBの配線をツイストペアとみなすのであれば、 終端兼負荷の抵抗を100Ωぐらいに増やすのが正解だろうと考えています。 USBaspのオリジナル回路そのままよりはFabISPとUSBtinyISPを加味した 間の子(あいのこ) を取るのが良いかもしれません。 なお規格上は90Ωに整合することを求められているようであります。 さてここで問題がひとつあります。 AVRのデジタルI/Oピンはどの程度のインピーダンスを持つのでしょうか。 考えてみるとVcc=3.3Vなのであれば68Ωのまま触らないほうが正解であるように見えなくもありません。

データシートに話を戻しますと、 代表特性グラフによればVOH=4.0VにおいてIOHは38mAありますので、 I/Oピンは電位差1Vについて38mAを流す(それしか流れない)だけのインピーダンスを持ちます。 逆数を求めますと26.3Ω前後となります。 このインピーダンスに最大最小の規定はありませんが、 AVRマイコンのGPIO端子が持つだいたいのインピーダンスとして計算に含めるべきです。 外付けする68Ωに26Ωを足しますと94Ωとなります。 これはUSBが求める規格である90Ω前後と符合します。

そして計算して得られた94Ωをダイオードクランプすることを考えます。 94Ωを5Vから3.3Vの電位差1.7Vで除して得られる電流は18mAです。 代表特性における計算上も、 68Ωとダイオードクランプ方式においてなお安全圏にあると考えることができることが確認されました。

20mAを流す計算をしたピンが2本できました。 最大定格では200mAまでICCを流すことが許されますので、 差し引き160mAまで他のI/Oで電流を使うことができます。 LEDを灯す程度なら十分に賄えるでしょう。

ATmega8

USBaspを実装する目的でATmega8を調達しました。 ATmega8はATmega328の先祖であり、小型メモリ版です。 特価180円と安価なために気軽に使うことができると期待しています。

USB

AVRでUSBを実装する場合、ソフトウェア専用ではLOW-SPEEDになります。 これではHID準拠品ぐらいしか作れません。 ハードウェア搭載のメニューにはSMDしかありません。 FULL-SPEEDが出せるかどうかで自由度がかなり違います。

もっとも、実用上は外付けでUARTをつなげば目的を達せられることも多いことから、 ほぼ見た目の問題かもしれません。 UARTで済ませることが現実の解法かなと思います。

LEDチカチカ

LEDチカチカに適当なマイコンは何が良いか。 この程度の用途ではお値段が最優先になりますので、 今はまだ特価100円で手に入るAT90S2313がよろしいかと思っています。 コントローラ自体が100円ぐらいでないとLEDチカチカにはもったいないかなと思います。 消費電流が大きいのは我慢。 プログラムメモリ1Kステップは少ないですがLEDチカチカの用途としてはだいたい十分です。

電源電圧は5V系統がよろしいでしょう。 コントローラで遊ぶだけなら3.3V系統でもかまいませんが、そのままでは青系や白系のLEDが扱えません。 LEDをチカチカするためには5Vの電源が必要なのです。

Arduinoでチカチカしてもいいのですが主基板は使いまわしますし専用というわけにはいきません。 固定で使うために2K円以上出すのは厳しいです。

為替マジックか在庫処分マジックでもない限り、 古いデバイスについて今後値段が下がることは考えられません。 値段の安い新しいデバイスがDIPで発売されることも考えにくい情勢にあります。 アナログ回路の需要があるとはいえDIPの市場は萎む一方だろうということも、 値段が下がらないと考える要因のひとつです。

真空管から半導体に移り変わったように、 今後は貫通穴実装から表面実装へと移り変わる過渡期にあります。 今はまだ部品が買えますが、10年後は真空管のような扱いを受けているかもしれません。 ちょうど組み立てパソコンがそうであるように、 完成基板モジュールを組み合わせるだけの時代が来るのかも知れません。

環境設営

マイコンは速度さえ求めなければだいたいのことはできる便利な部品ですが、 プログラムを書いてあげなければ何もできません。 そのプログラムを書くための環境を組み立てることは、割と面倒な作業です。 市販のソフトウェア製品はかなり値段が高いということが相場ということもあります。 AVRであればArduino IDEに対応しないと見向きもされない傾向があるように思いますが、 それはそういうことなのかなという感じがします。


This is copyrighted material. copyright © 2023 clare. all rights reserved.