2012年5月18日金曜日

Linuxで使えるATtiny10 programmerを作る



昨年から秋月電子で取扱いの始まったATMELのATtiny10をいじっています。いや、本当は取扱いが始まってあまり時間の経っていない時にデバイスは入手したのですが、デバイスにプログラムを書き込むプログラマが手に入らず、テスト用のLEDチカチカプログラムを書いたものの、それが書き込めない状態がつい最近まで続いていました。WindowsプラスATMEL純正プログラマや、USBaspを使ったプログラマでデバイス書き込みをしている記事をちらほらと見ますが、どちらも望んでいるものからは少し距離がある感じでした。仕事も一段落して時間に余裕ができ、あまり長い間ほったらかしにするのもなんだしなぁ、、などと思ったりもし、”無いものは自分で作るか!”とプログラムを書いてそれなりに動くものが出来たのでそのプログラマを公開します。


1)必要なハードウェア

私の定番の実験基板であるFT232RLとATtiny2313を使ってみました。ライタがホストPCとUSBで繋がっていると電源を用意する必要がなく、シリアルポートの無いPCでも使えると考えると妥当な所ではないでしょうか。他のAVRシリーズのCPU同様tiny10も単一5Vでの書き込みと、resetピンに+12Vを与える高電圧書き込みが用意されています。後者はresetピンにアサインされているPORTB-3を汎用ピンとして使用する設定にした場合、resetピンに+12Vを与えた状態でデバイスにプログラム書き込む必要があります。高電圧書き込み用にレベルシフタも用意しました。


+12V印可のために2SA1015(pnp) 2SC1815(npn)を1本づつ使用して+5Vから+12Vにレベルシフト、これだけだと出力をGNDに落せないのでオープンコレクタ動作の2SC1815(npn)をもう1本追加して、計3本のトランジスタで構成されています。
これらの回路は下の図の様になります。


書き込みのテストでは、これらをブレッドボード上で接続して行いました。写真では分かりませんが青色LEDが1秒間隔で点滅を繰り返しています。


2)コンパイル

2)-1 ホストPC側ドライバ
"tpiwrite" は、Perlスクリプトで特別なモジュールも使用していないため、Perlがインストールされていればコンパイル無しで実行できます。tiny10用のIntel hexファイルを解釈してシリアル経由でプログラマにデータを渡します。全部で55行というコンパクトなプログラム(スクリプト)なので、動作はソースをみていただければ理解できるボリュームのものだと思います。

2)-2 tiny2313ファームウェア
"tpi.c" "usart.c" "waitA.S"のコンパイルに avr-gccが必要です。これらのプログラムは"avr-gcc (GCC) 3.4.6" "avr-gcc (GCC) 4.4.4"でコンパイルを確認しています。今のところ1800バイトぐらいフラッシュを使用していて、200バイトほど空きがあるのでもう少し機能の追加が可能です。

tar/gzipファイルを展開しソースをコンパイルしてください。"make"コマンドを実行するとコンパイル、リンク、hexファイルの生成を行います。適当なプログラマを使って生成されたhexファイルをtiny2313に書き込みます。

tiny10のresetピンを汎用IOピンに変更するには、tpi.cの336行目の"#if 0"を"#if 1"に変更して、tiny2313用のファームをコンパイルしてください。一度Config Byteを書き換えると次の書き込みからは、resetピンに高電圧(+12v)を加える高電圧書き込みでのプログラムの書き込みが必要です。(Config Byteのビット0を"1"にすれば、通常電圧で書き込みができます。)高電圧(+12v)書き込みを行う場合、"Makefile"の14行目行頭を#でコメントアウトして、15行目の#を外してコンパイルして下さい。("HVRST"をdefineする)


3)tiny10用hexファイルの書き込み

tiny2313 と tiny10 を接続して tiny2313 をリセットします。この状態で tiny2313 はホストPCからのデータ待ちになります。Perlスクリプト"tpiwrite"のあるディレクトリでターゲットhexファイル "hoge.hex"を引数にして以下のようにコマンドを実行します。

./tpiwrite hoge.hex

"tpiwrite"の44行目、

select(undef, undef, undef, 0.05);

が、writeデータの送出インターバルを決めています。hexファイルの書き込みに失敗する場合は、この"0.05"を少し大きめの値に設定して送出インターバルをあけてください。現環境で"0.01"での書き込みを確認しています。コマンドを実行すると、1word(2byte)ごとに書き込んだデータを"w12C0" "w2BC0"のように表示していきます。プログラムをすべて書き終えると、ホストPC上に"End of data"と表示されプログラムが終了し、tiny10上で書き込んだプログラムが実行されます。

tiny10用のサンプルプログラムとそのhexファイルを同梱しています。テスト書き込み用にお使いください。


4)それ以外のインフォメーション

制御コマンドや書き込みデータは、バイナリ化されずにそのままホストPCとtiny2313の間を行き来しています。ターミナルソフト(TeraTermなど)を、"38400bps/ストップビット1/8ビットデータ/パリティ無し/ハードフロー制御" に設定して、ホストPCとtiny2313を繋ぐとデータのやりとりを見ることができます。

このプログラムの作成にあたって、ATMELのATtiny 10 DocumantAtmel AVR918: Using the Atmel Tiny Programming Interface (TPI)そのサンプルプログラム 、 個人のWebページSimon Says Game Using an ATtiny10を参考にさせていただきました。

プログラムソース一式は、ここからダウンロードしてください。 このプログラムは、無保証、無サポートです。

++ Myself ++

普通(?)のサラリーマン -- 生活のすきま時間にキーボードとはんだごてを持ち替えてプログラミングと電子工作してます