[トップページへ戻る]

HID TPIライター

2012年4月
V-USBを応用してHID TPIライターを作りました。米粒AVRと呼ばれるATtiny10用です。12V電源を利用し、RESETピンをI/O利用しているATtiny10にも書き込めます。

正直に言うと「FT232Rモジュール利用 AVR TPIライター」が遅くて不便だったので、リンク先記事の一番下にある図「TPIライター製作案」(3)のライターを作りました。
他に、「V-USBをINT1割り込みで使用してみる」「自作12Vモジュールの使い道として」という理由もありました。

2012/07 追記
ATtiny10用ソケットを作ってみました。ネタ工作です。このページの一番下にあります。
2012/07 追記2
ATtiny20,ATtiny40に対応しました(v1.10)。
2012/08 追記
64bit版OSに対応しました(v1.20)。Windows7(64bit)で動作確認しています。
2012/09 追記
ATtiny20,ATtiny40の書き込み処理の不具合を修正しました(v1.30)。


HID TPI Writer
HIDTPIW : AVR-HID TPI Writer
ダウンロードhidtpiw_proj.zip HIDTPIW v1.30
※ファーム(hexファイル, Cのソース)+ライターソフト
開発環境: WindowsXP/SP3, .NET Framework 3.5/SP1
動作確認環境: 上記 および Windows7/SP1(64bit)
  • HIDTPIWはATtiny10/20/40/他用のライターと書き込みソフトです。
  • SPI方式でもなく高電圧パラレル/シリアル方式でもない、TPI方式のライターです。
  • 当ライターは部品としてATtiny2313を使用しています。
    従って、当ライターを製作するには別途AVRライター(SPIライター)が必要です。
【参考】
FT232Rモジュール活用 FT232-AVRライター」 ←秋月電子FT232RモジュールをSPIライターにする方法。
AVRライターを選ぶ 〜始める人の1台目、慣れた人の2台目〜」 ←AVRライターいろいろ紹介。

使用例 (ver 1.30)
左:拙作FTTPIW(ver 1.00)では1024byteの書き込みだけで80秒かかっていました。それに比べると当ライターは劇的な速さです。ファームを作り込めば更なる高速化が期待できますが、これ以上の速度は追求していません。
右:V-USBはUSBハブを中継すると転送速度がアップすることがある、ということが知られています。手持ちのUSBハブ(サンワサプライ USB-HUB220WH)で試したところ、書き込みが6秒、読み込みが10秒ほど縮まりました。

ATtiny20,ATtiny40への書き込み例 (ver 1.30)
USBハブなしでの速さです。TPIプログラミングの仕様上、書き込みに比べて読み込みには時間がかかります。

回路図と配線図
回路図

写真ではMAX662Aの代わりに自作
12Vモジュールを使用しています。
【参考】
ATtiny10使用 3倍圧チャージポンプ
モジュール

上段はV-USBの回路です。USBのD+線をATtiny2313のPD3/INT1ピンに接続することに注意してください。
下段左はMAX662Aを使用した5V→12Vの昇圧回路です。RESET制御線は負論理なのでトランジスタはPNP型です。

配線図
LEDの電流制限抵抗は配置が少し違います。
クリスタル振動子は基板直付けではなくピンソケットに挿しています。負荷容量のコンデンサは2穴幅のものです。
左下は高さ6mmの小型電解コンデンサ、右上は通常の高さ11mmのものです。
切れっ端の基板を使ったので左端1列は穴がありません。USBコネクタのところだけ自前で穴を開けています。
ICを横切る4本の被服線(図の緑線)はUEWで配線しました。

完成サイズ:33x47mm

12V電源を使用しないタイプ
12V電源を使用せずに作るなら、ATtiny2313のPD5(RESET制御線)を、ターゲットデバイス(ATtiny10他)のRESETピンに接続するようにします。ライターのファームは変更ありません。

12V電源を使用しないライターでは、RESETピンをI/O利用しているATtiny10他を操作することができません。

【参考】
12V電源を使うのだったらついでにと、高電圧シリアルプログラミング対応を考えました。RESETピンをI/O利用している8ピンAVRに使います。ここまでやるとSPIライターにもなります。上手く作ればファームは1つにまとまりそうです。ライターソフトはそれぞれに作る必要があります。ハードだけ共通、ソフトは別物ということです。

使い方とオプションスイッチ
ヘルプ画面
……。見ての通り「雰囲気英語」です。オプションの意味が思い出せればよし。※日本語だと文字数が多くて画面に収まらない。
使い方とオプションスイッチは拙作ライター「FTAVRW」「FTTPIW」と同様です。※元々はavrsp.exe(ChaN氏)を参考にしています。
ATtiny10/20/40で動作確認しました。ATtiny4/5/9にも対応したつもりですが動作未確認です。


使い方:書き込み方法
方法1
コマンドライン入力で実行します。
'hidtpiw'の後にHEXファイル名を指定します。オプションスイッチも一緒に指定します。

方法2
hidtpiw.exeのアイコン/ショートカットアイコンに、HEXファイルをドラッグ&ドロップします。オプションスイッチは別途iniファイルに記述しておきます(後述)。

ヒント/注意
  • ファイル名やオプションスイッチの記述順は特に決まっていません。
  • HEXファイル+ヒューズ設定が統合された形式のファイルには対応していません。
  • HEXファイルは複数のファイルを指定することもできます(テーブル配置などの利用)。
    その際、アドレスが重なった部分があると、後ろのファイルの内容が有効となります。
    例: >hidtpiw file1.hex file2.hex
    file1.hexとfile2.hexでアドレスが重なっている部分があると、その部分はfile2.hexの内容が有効になる。
使い方:コマンド指示
ターゲットAVRからケーブルを抜かずに、AVRの動作を開始することができます。いわゆる「ライターを論理的に切り離す」機能です。コマンドラインから「go」コマンドを入力します。例: >hidtpiw go
動作中のAVRを書き込み待機状態に戻すには「stop」コマンドを入力します。例: >hidtpiw stop
ただ、「stop」コマンドを実行せずとも、AVRの動作中にいきなりhexファイルをドラッグ&ドロップしても書き込みはできるので、「stop」コマンドはあまり使わないかもしれません。

コマンド 説明
go ライターをターゲットAVRから論理的に切り離し、AVR内のプログラムを実行します。
技術的には、ライターのI/Oピンをハイ・インピーダンスにしています。
stop ターゲットAVRにリセットをかけ、プログラム書き込みモードに遷移します。

オプションスイッチ
オプション 説明
-rp -rp<n>
-rf
ターゲットAVRの内容を読み出します。
順に、プログラムコード(Flashメモリの内容)、現在のヒューズ設定。
※ヒューズ設定の表示はavrsp.exe(ChaN氏)に付属するfuse.txtの書式を参考にしました。
プログラムコードはインテルHEX形式で表示します。ファイルへ保存するにはリダイレクトしてください。例: hidtpiw -rp >flash.hex
プログラムコードは1レコード内のデータ数を1〜255byteで指定できます。デフォルトは16byteです。
例: hidtpiw -rp32 >flash.hex ※1レコードあたり32byteで出力。
-r ターゲットAVRに関する情報を表示します。
署名バイトやメモリサイズなど。
-v 書き込みせず、ベリファイのみ行います。
ターゲットAVRからプログラムコードを読み出し、指定したHEXファイルの内容と照合します。
-v- 書き込み後、ベリファイしません。
プログラムコードを書き込んだ後、通常は自動的にベリファイしますが、それをスキップします。
-e ターゲットAVRのプログラムコード(Flashメモリのコード領域)を消去します。
ロックビットは解除されます。ヒューズ設定は影響を受けません。
プログラムコードを書き込むとき、ライターソフトは自動的に消去処理を実行しています。
-fl<b> -fl<h> ヒューズバイト(Configration Bits)を設定します。※'l'は小文字のエル。
※他のAVRに倣い、ここではヒューズLowバイトと呼んでいます。
<b>は8桁の0/1で指定します。例: -fl11111001 ※'0'がプログラム、'1'がアンプログラム。
<h>は1byteの16進数で指定します。大文字小文字は区別しません。「0x」は付けません。例: -flF9
-l<b> -l<h> ロックビットを設定します。※'l'は小文字のエル。
<b>は8桁の0/1で指定します。例: -l11111100 ※'0'がプログラム、'1'がアンプログラム。
<h>は1byteの16進数で指定します。大文字小文字は区別しません。「0x」は付けません。例: -lF6
-dev<n> PCに接続した当ライターのインデックスを指定します。デフォルトは0番。
当ライターと同じVID/PIDのV-USB機器をPCに接続している場合、当ライターが0番でないことがあります。1,2,3,..とインデックスを指定し、当ライターが動作するか試してください。例: -dev2
-br<n> ライターとターゲットデバイス間のボーレートを設定します。デフォルトは-br115200 (115200bps)
何らかの理由で書き込み速度を落とす必要がある場合にこのオプションを指定します。
115200bps, 38400bps, 9600bps, 4800bpsで動作確認済みです。
-w
-w1
-w2
1回の処理が終わった後のキー入力待ちをどうするかです。デフォルトは'-w'。
-w : 常時キー入力待ちをする。
-w1 : エラー発生時のみキー入力待ちをする。
-w2 : 常時キー入力待ちをしない。
アイコンへドラッグ&ドロップする使い方をしていると、実行時にコマンドプロンプトが開き、結果を表示したあと勝手に閉じてしまいます。エラーが発生してもメッセージが読めません。そのためこのオプションを指定し、PAUSE状態にします。
あらかじめコマンドプロンプトを開いてコマンドラインからキー入力する使い方をしている場合は、キー入力待ちをする意味がないので(コマンドプロンプトは勝手に閉じない)、'-w2'指定でよいです。
高度な設定
-t<name> 何らかの理由で署名バイトが読めないターゲットAVRに対し、名前を指定してライターに認識させます。AVRの型番の「AT」を除いた部分を記述します。例: -ttiny10 ※ATtiny10として認識させる。
-prw<n> 立ち上がりが遅い自作12Vモジュールを使用する場合に、出力電圧の安定待ち時間をミリ秒単位で指定します。100msを指定する例: -prw100
MAX662Aを使用する場合、このオプションを指定する必要はありません。

iniファイル
hidtpiw.ini
オプションスイッチをhidtpiw.iniに記述しておくと、hidtpiw.exe実行時にそれが反映されます。
hidtpiw.iniはhidtpiw.exeと同じフォルダに置きます。
iniファイルとコマンドラインに、値が違う同じオプションスイッチがあった場合、コマンドラインの方が有効となります。
例: iniファイルに'-w1'が記述されていて、コマンドラインから'-w2'を指定すると、'-w2'の方が有効となる。

V-USBをINT1割り込みで使用する
V-USBはUSBのD+線をINT0割り込みに接続して駆動するようにできています。TPIライターを作るにはRXD,TXD,XCKピンが使用できると都合がよいです。しかしATtiny2313ではXCKがINT0と兼用ピンになっているので、V-USB技術を使ったTPIライターが作れません。
ATmega48シリーズはXCKとINT0は別のピンに割り当てられているので、その点は悩むことなくTPIライターが作れます。ですが、それでは面白くありません。※一部機能が壊れたATtiny2313が手元にあり、捨てるにはもったいないので再利用したかった。

コメントによるとV-USBはINT0以外のハードウェア割り込みでも駆動することができるので、そのように改造することにしました。具体的には usbdrv.h と usbdrvasm.S 内にある、INT0関係の定義値(下記コメントに記述された USB_INTR_XXXXX)をINT1の定義値に書き換えればOKです。
具体的には、usbconfig.hに記述されている INT0関係の定義値のコメントマークを外して有効化し、INT1に対応する値に書き換えればOKです。それらは自動的に usbdrv.hと usbdrvasm.S内の該当箇所に反映されます。[2014/02 訂正]

[usbdrv/usbconfig.h]
/*
General Description:
This file is an example configuration (with inline documentation) for the USB
driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
wire the lines to any other port, as long as D+ is also wired to INT0 (or any
other hardware interrupt, as long as it is the highest level interrupt, see
section at the end of this file).
*/
/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
* usually don't need to set them explicitly. Only if you want to run
* the driver on a device which is not yet supported or with a compiler
* which is not fully supported (such as IAR C) or if you use a differnt
* interrupt than INT0, you may have to define some of these.
*/
/* #define USB_INTR_CFG MCUCR */
/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE GIMSK */
/* #define USB_INTR_ENABLE_BIT INT0 */
/* #define USB_INTR_PENDING GIFR */
/* #define USB_INTR_PENDING_BIT INTF0 */
/* #define USB_INTR_VECTOR INT0_vect */
INT1用に書き換えた様子(vusb-20121206にて動作確認済み)[2014/02 追記]
/* #define USB_INTR_CFG MCUCR */
  #define USB_INTR_CFG_SET ((1 << ISC10) | (1 << ISC11)) ←書き換えた
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE GIMSK */
  #define USB_INTR_ENABLE_BIT INT1 ←書き換えた
/* #define USB_INTR_PENDING GIFR */
  #define USB_INTR_PENDING_BIT INTF1 ←書き換えた
  #define USB_INTR_VECTOR INT1_vect ←書き換えた


◆ ◆ ◆
TPIライターは今のところATtiny10以外に使うあてがなく、ATtiny10自体もあまり使わないAVRです。
そんなに頑張ってライターを作り込んでも仕方がないので、そこそこのところで切り上げました。

2012/07 追記2
デジット(通販は共立エレショップ)でATtiny20(14ピンSOP),ATtiny40(20ピンSOP)の取り扱いが
始まりました。ATtiny10ではピンが足りず、しかし小型軽量であって欲しい場合に活躍しそうです。




ATtiny10用ソケット
2012/07 追記
秋月電子のSOT23変換基板を使って、素(す)のATtiny10を読み書きできるようなソケット(アダプタ)を作ってみました。上手く行ったらいいな、というネタ工作です。かなり微妙な結果になりました。
凹型のところにATtiny10をセットし、ふた(黄色い棒)で押さえます。 ライターにマウントした様子。
ピンソケットに差し込むだけです。
10数回アクセスして偶然1回読み込めました。ふたの押さえつけ方がポイント。※普通は「失敗作」と言います。

電子パーツ店で売っているSOT23ソケットは1万円やら何やら、激安品でも5千円します。高い物にはそれなりに理由があったわけです。数百円で自作できるなんてウマい話はありませんでした。というオチ。※でも作ってみて楽しかったです。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system