AVR-DA」カテゴリーアーカイブ

UPDI Programmer を作る

今更も今更ですが、現在の 8bit AVR シリーズのプログラミング方法は 3線式 ISP から 1線式の UPDI へと切り替わっています。かつて AT90S 時代からお世話になった ISP プログラマでは書きこめず、1万円近くする PICkit 4 のようなデバッガが必要な気がして、最初は敷居が高く感じました。

実際には、UPDI プログラマは USB-シリアル IC を使って非常に簡単に作成できます。pyupdi がそのようなプログラマの例です。ISP プログラマの作成は一般的にマイコンが必要だったため、”卵と鶏の問題”がありましたが、その意味でも UPDI の方が敷居は低くなっていると言えます。私はいろいろあって普段は PICkit 4 を使っているのですが、安価なプログラマがあると活用の幅が広がります。


今回製作した UPDI プログラマ
の写真は上記です。特に意図はなかったのですが、ケースに UPDI と書くのは既存のケースと似てしまいました。

複数電圧に対応する回路を追加する

USB シリアル IC の CH340N を使用して作成します。オリジナルの回路では、USB-シリアル側の IO 電圧と AVR の電源電圧を合わせなければいけません。AVR はトレラント IO (VDD より高い入力電圧の対応) ではないので、広い電圧範囲に対応するためには、中間にレベルコンバータを入れる必要があります。

ちょうどいいレベルコンバータが手元になかったので、4-Input AND の日立 HD74LV21A をレベルコンバータのように使いました。CH340 を VCC = 5V で動かす場合、VOH = 5V, VIH = 2.3V となっています。HD74LV-A は 2-5.5V 動作、入力 5V トレラントなので、これを AVR 側の電源で動かすことで、2.3-5V 程度の電源範囲に対応します。(VBUS の誤差を許容する場合は、およそ 2.5V – 5.5V になるでしょう。

ついでに、プログラマとして使わないときは UART モニタとして使えるよう、スイッチでプログラマ、モニタを切り替えられるようにしました。ただしこの機能は今のところあまり使っていません。頻繁にプログラム書き換えを行うとき、PC 側のターミナルの接続、切断操作が煩わしいことが理由です。

作成した回路図を下記に示します。D1 はシリコンダイオードではだめで、小信号用 SBD を使用します。D2は直接 VTG で駆動せず、Tr で受けて 5V 側で駆動した方がよかったですね。

ロジックは 74LV21 でなくても、論理が反転しなければ何でもいいです。接続が少し妙ですが TSSOP をユニバーサル基板に手配線する都合でこのようになっています。


UPDI_schematics_PDF

実際に動かした限りでは、AVR の VDD = 1.8V 付近でも動作するようです。一応、USB 未接続の状態で VTG を入れることはできません。直ちに壊れることはないでしょうが。いろいろ考えると、レベルコンバータとして設計された IC を使用する方がよいかもしれません。私の使用状態ではこの回路で十分です。

回路の実装

マイコンの書き込み

プログラマは Python ベースの pymcuprog を使用します。python がインストールされている環境で、

pip install pymcuprog

とやればインストールできます。実行には Windows 7 以降が必要で、試した限り Windows XP 環境では動かないようです。

マイコンの接続チェックは、プログラマを接続して電源が入った状態で

pymcuprog ping -t uart -u com7 -d attiny202

のようにすれば、正しく動作しているかどうかわかります。-u で USB-シリアルに割り当てられた COM ポートを指定します。-d のデバイス指定はどうも必須のようです。

書き込みは、-f オプションで hex ファイルを指定して

pymcuprog write -t uart -u com7 -d attiny202 -f UPDI_Test.hex --erase --verify

のようにすれば OK です。

Microchip Studio から使う

Microchip Studio の場合、Project Property の Tool で Custom Programming Tool を選択してコマンドを入れれば、IDE から書き込みができると思います。

pymcuprog write -t uart -u com7 -d attiny202 -f "$(OutputDirectory)\$(OutputFileName).hex" --erase --verify

(実行結果)

AVR-DA の内蔵プルアップ特性

AVR-DA シリーズのデータシートには、IO ポート内蔵のプルアップ抵抗の電気的特性はあまり詳しい記述がありません。代表特性として VDD=3V, VIN = 0V のとき 150uA(typ) 200uA (max) を保証しています。

また、VDD と Weak Pull-Up 電流のグラフ (Fig 38-82) が掲載されています。電流は VDD 電圧に依存するように書かれていますが、測定条件が明確ではありません。


– ここまで図表は AVR64DA28-32-48-64 DS Rev.B より引用

マイコンの内部回路によりますが、
1. PU 抵抗の形成に MOSFET を使っている場合
2. PU 抵抗のイネーブルを FET SW で切り替えている場合
などの条件では、抵抗値が非線形となることが考えられます。たとえば AT90S シリーズはかなり非線形な特性でした。

内蔵プルアップを積極的に使う応用を作るうえでこのあたりが気になったので、実測してみました。

VDD=2.5, 3.3, 5V で、プルアップに設定した PE2 ピンに対して VIN を0-5V, ±0.6mA 制限でスイープして、グラフにプロットした入力電流 Iin を青線で示しています。0<VIN<VDD の範囲でほぼ線形とみなすことができます。R=20kΩ の破線とよく一致します。
なお、VIN>VDD では寄生ダイオードが導通するので大きな逆電流が流れます。数十mA を超えると IC によってはラッチアップしてしまいます。

一応、ポートを変えて PD5, PF0 ピンでも同様に確認してみましたが、ほとんど同一の特性でした。常温では プルアップ抵抗 R_PU=20kΩとみなして問題なさそうです。

VIN = 0V の電流値は先ほど示した FIg.28-82 のグラフと一致します。しかし、FIg.28-82 から、パッシブな抵抗に比べて相当大きい温度係数 (~2000ppm/K = 0.2%/K) をもつことに注意が必要です。