Arduino を使った ATtiny10 の書き込み (2)

Arduino を AVR918 相当のデバイスとして機能させるスケッチ「Arduino918」を作って、ATtiny10 の書き込みに成功しました。
バイナリ・スケッチ・サイズは 2612 バイトです。
スケッチのアーカイブ・ファイルと readme ファイルを以下の Yahoo ボックスに置きました。

Arduino918

注意点としては、

  • avr911.zip に含まれる実行可能オブジェクトの avrosp.exe を PC 上の書き込みソフトウェアとしてそのまま使うので、あらかじめ Atmel のサイトからダウンロードしておく必要がある
  • avrosp.exe は Windows 用のアプリケーションなので、LinuxMac OS X から利用するためにはソースからコンパイルすることが必要
  • PC のシリアル・ポートは COM1 から COM8 までをサポートしており、COM9 以上を使うにはソースの手直しが必要なこと

があげられます。
以下に、アーカイブ・ファイルに同梱の readme ファイルの内容を示します。

Arduino を ATtiny10 書き込み器として使うためのスケッチ
- Arduino918

2011/12/10 pcm1723

●はじめに

通称「米粒 AVR」と言われる 6 ピン SOT-23 パッケージの ATtiny10 は、内部フラッシュメモリのプログラミング・インターフェースに従来の方式ではなく、TPI (Tiny Programming Interface) と呼ばれる新しい方式を使っているので、この方式に対応していない装置では書き込むことができません。

TPI 方式で書き込むための手段のひとつとして、Atmel 社のアプリケーション・ノート

  • AVR911: AVR Open Source Programmer
  • AVR918: Using the Atmel Tiny Programming Interface (TPI)

で説明されているソフトウェア/ハードウェアを使う方法があります。
AVR911 では、ホスト PC 上で動作させる、オープンソース書き込み器コントロール・アプリケーション・ソフトウェア「avrosp」について説明してあり、そのソースファイルおよび実行可能オブジェクトのアーカイブ・ファイル「avr911.zip」も用意されています。
avrosp は Windows のコマンド・プロンプトで動作する (GUI ではない) コンソール・アプリケーションで、機能的には Atmel 純正のプログラミング・ツールと同様のもので、AVR109、AVR910 で定義されている「書き込み器ハードウェア」に対応しています。
AVR918 では TPI の説明のほかに、AVR911 対応の「書き込み器」を ATmega324 上に実装したサンプルについても説明しており、そのソースファイルをまとめたアーカイブ・ファイル「avr918.zip」も用意されています。 
以下、この「ハードウェア」のことも「AVR918」と呼ぶことにします。
AVR918 は、ホスト PC とはシリアル・ポートを介して接続します。 これにATmega324 の USART0 モジュールを使用します。
AVR918 側と、ターゲット・マイコンの ATtiny10 との間の TPI 接続には、ATmega324 のUSART1 モジュールを使用します。
Arduino Mega では、複数の USART モジュールを持つ ATmega1280 を使用しているので、AVR918 相当の機能を実現するのも、比較的に容易だと思いますが、(普通の) Arduino では USART モジュールを 1 個しか持たない ATmega168/ATmega328 を使っているので、少しプログラムに手を加えなければなりません。
このスケッチ「Arduino918」は、

  電源電圧 5 V で 16 MHz クロックの ATmega168/
    ATmega328 を使った  Arduino (互換機) を、
    AVR918 相当の機能を持った書き込み器ハードウェア
    として使うためのもの

です。 
ターゲット・マイコンとしては ATtiny10 だけに対応しています。

●ハードウェア

ATtiny10 と、Arduino (互換機) との間の接続を示します。
USART の代わりに SPI を利用しています。

  Arduino (pin)          (pin)  ATtiny10     
  ------------+          +----------------
    (SS#)  10 |--[R]-----| 6 (RESET#/PB3) 
              |          |                
    (MOSI) 11 |--[R]--+--| 1 (TPIDATA/PB0)
              |       |  |                
    (MISO) 12 |--[R]--+  |                
              |          |                
    (SCK)  13 |--[R]-----| 3 (TPICLK/PB1)
  ------------+          +----------------

ここで、「R」は出力同士が衝突しないための保護用の抵抗で、数百Ωから数 kΩ程度に選べばよく、その値は重要ではありません。
ATtiny10 の内部フラッシュ・メモリ書き込みのためには、ATtiny10 の電源電圧を 5 V とする必要があります。
簡単のために、電源電圧 5 V の Arduino (互換機) を使い、ATtiny10 には Arduino から電源を供給して、Arduino とターゲットとは同時に電源が投入されるものとします。
ATtiny10 の RSTDISBL フューズビットがプログラムされていて、外部リセット禁止の状態でフラッシュ・メモリ書き込みを行うためには、6 番ピンの RESET 端子に +12 V を加える必要があり、上記の接続では書き込めません。
また、ターゲット・マイコンをアプリケーション回路に実装したまま書き込みを行う、いわゆる ISP (In System Programming) を行うためには、ハード/ソフト両面でもう少し配慮が必要になります。
もともとの AVR918 がそうなっているのですが、フラッシュ・メモリ書き込みが終了しても、ハード的にポートを出力から入力に切り換えるだけで、ソフト的には TPI 接続を終了させる手続きを行っていません。
そのため、ターゲット・マイコンのリセットを手動で行っても、フラッシュに書き込んだプログラムは走り出さず、再度 TPI コマンドが来るのを待っている状態になります。
書き込んだプログラムを動作させるには、いったんターゲット・マイコンの電源を OFF にしてから、再度、電源を投入する必要があります。
TPICLK として利用しているディジタル 13 番ピンは、Arduino 基板上で「L」と表示されている LED に接続されているので、TPI の読み書きに対してこの LED が点灯しますが、これは意図的なものではありません。
アクセス終了後は、「プルアップされた入力ポート」の状態になるので、数十kΩのプルアップ抵抗を流れるわずかな電流により、LED がほんのりと光る状態になります。
開発には秋月 AE-ATmega 基板に部品を実装したもの (アキヅキーノ) を使っており、「本物」の Arduino ではテストしてありません。

コンパイル方法

開発・テストは Arduino-0022 の環境で行いました。 
それ以外の環境ではテストしてありません。
ダウンロードしたアーカイブ・ファイル

   Arduino918-111210a.zip

を展開してできた「Arduino918」フォルダを、現在お使いのスケッチブック・フォルダにコピーし、Arduino IDE のメニューで、File / Sketchbook / Arduino918 と選んでいけば、スケッチが開きます。
複数のファイルで構成されているので、エディタのタブも複数現れます。
あとは、通常通り「Upload to I/O Board」ボタンを押せばアップロードできます。
バイナリ・スケッチ・サイズは 2612 バイトです。
正常にアップロードできれば Arduino 側の準備は完了です。

●操作方法

まず、Atmel の web サイトから、アプリケーション・ノート AVR911、AVR918 および avr911.zip をダウンロードしておきます。
avr911.zip を展開すると、多数のソースファイルと共に、Windows 用の実行可能オブジェクトavrosp.exe が現れますから、これをそのまま利用します。
PC と Arduino との接続は、Arduino IDE で使用しているシリアル回線をそのまま使います。 ただし、avrosp.exe はコマンド・プロンプトで使用するコンソール・アプリケーションなので、「mode」コマンドを使って、シリアル・ポートの設定を行っておく必要があります。
avrosp を実行する前に、コマンド・プロンプト上で次のコマンドを実行します

  mode com1 baud=115200 data=8 parity=n dtr=off

ここで「com1」は実際に Arduino との接続に使っているシリアル・ポートの番号を指定します。 (com3、com7 など)
Arduino では、DTR を使ってオートリセット機能を実現しているので、「dtr=off」を指定しておかないと、うまく行かない場合があります。
このシリアル・ポートの設定が正しくないと avrosp が avr918 を見つけられずにエラーになる場合があります。
毎回、この行を手入力するのは大変ですから、「バッチファイル」を作成して、その中に記述しておくと便利です。
avrosp コマンドのオプションの詳細については、アプリケーション・ノート AVR911 を参照してください。
あるいは、オプションなしで単に「avrosp」だけを実行するとヘルプが表示されます。
ひとつ例を示すと、

  avrosp -cCOM1 -dATtiny10 -s -q -O

は「COM1」で接続した avr918 からシグネチャ (-s)、フューズビット (-q)、キャリブレーション値 (-O : 英大文字の「オー」) を読み出す指定になります。
-c オプションを省略すると、自動で COM1 から COM8 までスキャンする指定になります。
COM7 に割り当てられた USB 仮想シリアル・ポートに対しても、うまく動作しました。
COM9 以上には対応していません。
-d はターゲット・デバイスの指定で、-dATtiny10 は ATtiny10 を指定することになります。
実際には、「ATtiny10.xml」ファイルを読み込んで必要な情報を得ているので、avr911.zip を
展開したフォルダに同梱されている「ATtiny10.xml」ファイルも avrosp.exe ファイルを置いたフォルダにコピーしておく必要があります。
実行結果は次のようになります。

AVR Open-source Programmer $Revision: 1163 $ (C) 2004 Atmel Corp.

Serial port timeout set to 5 sec.
Found AVR ISP on COM1!
Entering programming mode...
Reading signature bytes: 0x1e 0x90 0x03
Parsing XML file for device parameters...
Parsing '.\ATtiny10.xml'...
######
Saving cached XML parameters...
Signature matches device!
Reading fuse bits...
0xffff
Reading OSCCAL from device...
0x98
Leaving programming mode...

●AVR Studio からの利用

  • 接続シリアル・ポートが COM1 から COM4 に限られる
  • チップ・イレース/書き込み/読み込み/ベリファイしかできない
  • HEX ファイル名は独自に記憶されており、プロジェクトとは関係がない

という制限がありますが、AVR Studio 環境から (GUI で) 利用することもできます。
AVR Studio のメニューの Tools / AVR Prog... を選べばダイアログが開き、HEX ファイルを選んで書き込むことができます。
バイス選択のリストボックスには関係のないデバイスが表示され、それ以外は選択できませんが、特に問題なく書き込めるようです。
AVR Studio バージョン 4.19 について試しており、AVR Studio5 については試していません。
フューズビットやロックビットの設定については avrosp を利用する必要があります。