2009年05月24日

2009年05月24日: ATtiny13A のプログラミング

 ATtiny13A のプログラミングに挑戦中。何はともあれデータシートに目を通す。プログラムエリア 1 KBytes(!)、スタティックRAM 64 Bytes(!!)。狭ッ! パソコンのプログラミングですっかりお大尽スタイルが身に付いてしまっているから、メモリ節約の精神を育まなければならない。そもそも、初めてプログラミングに手を染めた時から、RAM は 64 KBytes 「も」あったんだからなあ。そうか、こういうのを業務としてがりがり書いている人たちがいて、その人たちが今の我々の電化生活を支えているんだな。今どきあらゆる電化製品にマイコンは組み込まれてるものね。当たり前のことだけど、改めて自分の手でこういうものに触ってみると、感慨深いものがある。

 必要な道具を揃えていく。まずはクロスコンパイラ一式。CrossPack というパッケージを使う。Mac OS 10.3 以上対応、ユニバーサルバイナリ。コマンドラインのツールのみだが、どうせそんなに大きなプログラムは書きようがないのだから、これで十分。

 次に、マイコンにプログラムを書き込むプログラマー。これはいろいろ調べたのだが、Arduino をプログラマーとして流用できるという記事を見つけた(Arduino AVR In System Programmer (ISP))。ページの下の方のコメント欄にあるリンクをたどって、mega-isp のページから avrisp.03.zip をダウンロード。解凍すると Arduino のスケッチが出てくる。配線は、スケッチの中のコメントに書いてある通りで、Arduino のピン 10, 11, 12, 13 をそれぞれ ATtiny13A の RESET, MOSI, MISO, SCK(ピン 1, 5, 6, 7)に接続する。また、ATtiny13A の Vcc, GND(ピン 8, 4)は Arduino の 5V, GND にそれぞれつなぎ、間にバイパスコンデンサ(セラミック 0.1μF)を入れる。Arduino のピン 7, 8, 9 には LED(8 は赤,7, 9 は緑)をつけて、150Ωの抵抗を介して GND につなぐ。

 avrdude を使ってテストしてみる。さっそくハマってしまった。

$ avrdude -b 19200 -c avrisp -p t13 -P /dev/tty.usbserial-A7006Uq3 avrdude: stk500_getsync(): not in sync: resp=0x15 avrdude done. Thank you.

 何が Thank you だよ、Sorry とか何とか言えんのかこら。これはえらく手こずったが、gdb でステップ実行すると正常に動作するのがヒントになって、解決できた。原因は「Mac, Linux では、Arduino の USB-serial ポートをパソコン側でオープンすると、そのたびに Arduino がリセットされ、ブートローダから実行が始まる。Arduino 2009 の場合はこれにおよそ 0.5 秒かかるので、その間はデータを送ってはいけない」ということだった。Duemilanove の公式リファレンスに書いてある(Automatic (software) Reset のところ)。avrdude のコマンドラインオプションか何かでディレイを設定できないかといろいろ調べてみたが、どうやら avrdude にパッチを当てないとしょうがないみたい。

--- stk500.orig.c 2009-05-23 22:56:56.000000000 +0900 +++ stk500.c 2009-05-23 22:57:00.000000000 +0900 @@ -660,6 +660,7 @@ { strcpy(pgm->port, port); serial_open(port, pgm->baudrate? pgm->baudrate: 115200, &pgm->fd); + sleep(1); /* Toshi Nagata; for use Arduino 2009 as an AVR writer */ /* * drain any extraneous input

 これでどうやら、ATtiny13A への書き込みは正常にできるようになった。なんとなく、マイコンのプログラミングは Windows 必須かなというイメージがあったのだが、Mac だけでなんとかなりそう。

Posted at 2009年05月24日 01:51:10
email.png