AVR 0-Series UPDI書き込み ATMega3209/4809等

ATmega3209 を買ってきたら いつものAVRISP MK2 では書き込めず、 新しい方式の UPDI 書き込み機が必要 とのことだったので、 Universalno で書き込み機を作ってみました。

旧Atmel 現Microchip の 新型AVR 0-Series はプログラムの書き込みに 従来のAVRISP MK2 で使われていた ISP書き込みの代わりに UPDI という1線通信で書き込みからデバッグまでできるようです。

ちょうど買ってきた ATmega3209 がこれだったので、手持ちの書き込み機で対応できず 困ったのですが、 ネットを探すと avrdude と Arduino を使って書き込みが出来るようだったので、挑戦してみました。

構成

構成はAVR Studio 等でコンパイルしたHex を avrdude というコマンドラインのソフトを使ってシリアルポートを制御し、USB-Serialアダプタで接続された Arduino を操作して Arduino のポートから UPDIによって ATmega3209 のプログラムを書き換える。 という構成です。

ハードウェア

まずハードウェアですが、 通常Arduino はシリアルポートを開いたときにDTRによってリセットがかかるようになっています。 これが avrdudeによって操作される際に障害になるようで、 USB Serial 変換部分か、Arduino本体の DTR – Reset 信号線をパターンカットします。
その場合ファームウェアの書き換えの際にはタイミングよくリセットボタンを押さなければならなくなります。

Universalno の場合は書き込み端子が用意されていますが、そのすぐ横に avrdude用接続端子を作るのがおすすめです。 そちらの端子はDTR以外を通常の書き込み端子に接続しておけば、 avrdude を使うときはそちらに、 通常のスケッチ変更する場合は通常の書き込み端子に差し替えるだけで良いので便利です。

UPDI 信号線は 6番ピンに 4.7kΩの抵抗を介して取り出します。 UPDIで書き込みする場合は この信号線の他、VCCとGNDの3本が必要です。

ファームウェア(スケッチ)

Arduino に書き込みスケッチは以下のの github からダウンロードしてきました。

https://github.com/ElTangas/jtag2updi

そのままデスクトップにzipをダウンロードしてきて解凍し Arduino で sourceフォルダの中の jtag2updi.ino  を開くと何も書かれていませんが、そのままコンパイルして転送すると問題なくファームウェアがArduino に入ります。
なお Arduino IDE で開く際には source フォルダの名前を jtag2updi に変更しておきましょう。

また、シリアルポートの番号を avrdude で使用するので一緒に確認しておきましょう。

ソフトウェア (avrdude)

avrdude は実は Arduino IDE でも使用されています。 私はダウンロードしてくるのが面倒だったので、 Arduino に入っている avrdude を使うことにしました。
Windows の場合それは 以下のフォルダに入っています

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin

ここに 先程 github でダウンロードしてきた zip の中にある avrdude.conf ファイルを入れておきます。 ちなみにこのavrdude.conf のファイル内にある ATmega3209 のシグネチャは間違っていて、 本当は 0x1E9531 なのに 0x1E9553 になっていました。
これはnotepad++ などのエディタを使って書き換えておきましょう。

※16075行目 の部分。 ちなみに ATmega3208 も間違っていたので,合わせてPull-requestを投げておいた。

avrdude の使い方

実際の使い方ですが、 コマンドプロンプトを起動して avrdude のあるディレクトリまで行き、以下のコマンドを叩きます。

avrdude.exe -c jtag2updi -P com7 -p m3209

これで正しく接続されていれば以下のような応答が返ってきます

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e9531 (probably m3209)

avrdude done. Thank you.

ファームウェアを書き込むには以下のように打ち込みます。

avrdude.exe -c jtag2updi -P com7 -p m3209 -U flash:w:example.hex

そして以下のような表示が出れば書き込みは成功です。

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.04savrdude: Device signature = 0x1e9531 (probably m3209)
avrdude: NOTE: Programmer supports page erase for Xmega devices.
Each page will be erased before programming it, but no chip erase is performed.
To disable page erases, specify the -D option; for a chip-erase, use the -e option.
avrdude: reading input file “example.hex”
avrdude: input file example.hex auto detected as Intel Hex
avrdude: writing flash (298 bytes):Writing | ################################################## | 100% 0.13s

avrdude: 298 bytes of flash written
avrdude: verifying flash memory against example.hex:
avrdude: load data flash data from input file example.hex:
avrdude: input file example.hex auto detected as Intel Hex
avrdude: input file example.hex contains 298 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.08s

avrdude: verifying …
avrdude: 298 bytes of flash verified

avrdude done. Thank you.

ヒューズビットについてですが、 AVR 0-Series では HFUSE や LFUSE というものは存在しないようです。 AVR Studio を見てもこのような画面になっていました。

これは avrdude からは このようにアクセスするようです。

avrdude.exe -c jtag2updi -P com7 -p m3209 -U fuse0:r:con:h (0番目をHexで読み取りの例)

対応はデータシートにこのようにリストされていたので、これが正しいと思います。

もし Atmel ICE を持っているなら

純正の 書き込み機を持っているなら, 下の図のように接続すると Atmel Studio をつかって書き込む事もできます。

1: UPDI
2: GND
6: VCC (5V or 3.3V)

最後に

これで ATmega3209 へのファームウェア書き込みは完了です。

ところで この度 ATmega3209 を使った 16x16LED マゾバッチ を作りました。
QFP または QFN を手半田し、さらに256個の 0603 LED が実装できます。
Ogaki Mini Maker Faire 2018 で実装タイムアタックを実施するので ぜひ起こしください。

Ogaki Mini Maker Faire 2018 の配置は 1F の17 です。
みんなのラボ も一緒に出ています。 よろしくおねがいします。

コメントを残す