Arduino ISP

お約束ですが、このページのいかなる記載においても著者は一切の責任をおいません。

素直にArduinoを購入すればシリアル接続でプログラムが焼けるのでISPする必要がない が、毎度の癖の貧乏性で、素のAVRを秋月で買ってきてISPから試してみた。

@kimio_kosakaさんのページを参考にスケッチを直接書いた644pとブートローダー が入っている328pをavrdudeで確認したところ。MacOS XでIDE 0023でArduinoISPを 使っています。
sh-3.2$ cd /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin
sh-3.2$ ./avrdude -P /dev/cu.usbserial-A7004BTR -c avrisp -C ../etc/avrdude.conf -p m644p -b 19200 -v -v

avrdude: Version 5.4-arduino, compiled on Oct  9 2007 at 11:20:31
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/hiroki/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port            : /dev/cu.usbserial-A7004BTR
         Using Programmer      : avrisp
         Overriding Baud Rate  : 19200
         AVR Part              : ATMEGA644P
         Chip Erase delay      : 9000 us
         PAGEL                 : PD7
         BS2                   : PA0
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10   128    0 no       2048    8      0  9000  9000 0xff 0xff
           flash         33     6   256    0 yes     65536  256    256  4500  4500 0xff 0xff
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel AVR ISP
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e960a
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DE
avrdude: safemode: efuse reads as FD

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DE
avrdude: safemode: efuse reads as FD
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

sh-3.2$ ./avrdude -P /dev/cu.usbserial-A7004BTR -c avrisp -C ../etc/avrdude.conf -p m328p -b 19200 -v -v

avrdude: Version 5.4-arduino, compiled on Oct  9 2007 at 11:20:31
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/hiroki/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port            : /dev/cu.usbserial-A7004BTR
         Using Programmer      : avrisp
         Overriding Baud Rate  : 19200
         AVR Part              : ATMEGA328P
         Chip Erase delay      : 9000 us
         PAGEL                 : PD7
         BS2                   : PC2
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65     5     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel AVR ISP
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as 5

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK

avrdude done.  Thank you.
RIMG0003

Arduino ISP使うためにFTつないだり110Ωつないだり、ISPのスケッチをアップするのが めんどくさくなってきたので USBtinyISP を作ってみようと思いつき、avrispで2313にmain.hex書き込んでみた。 なぜUSBtinyISPかというとArduinoのavrdudeコマンドがそのまま使えて コマンドのビルドの必要が無いからだ。

IMGP0817
sh-3.2$ ./avrdude -P /dev/cu.usbserial-A7004BTR -c avrisp -C ../etc/avrdude.conf -p t2313 -b 19200 -B 1 -U 
flash:w:/tmp/main.hex 

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.13s

avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/Users/hiroki/Downloads/usbtinyisp/spi/main.hex"
avrdude: input file /Users/hiroki/Downloads/usbtinyisp/spi/main.hex auto detected as Intel Hex
avrdude: writing flash (2046 bytes):

Writing | ################################################## | 100% 5.68s

avrdude: 2046 bytes of flash written
avrdude: verifying flash memory against /Users/hiroki/Downloads/usbtinyisp/spi/main.hex:
avrdude: load data flash data from input file /Users/hiroki/Downloads/usbtinyisp/spi/main.hex:
avrdude: input file /Users/hiroki/Downloads/usbtinyisp/spi/main.hex auto detected as Intel Hex
avrdude: input file /Users/hiroki/Downloads/usbtinyisp/spi/main.hex contains 2046 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 6.19s

avrdude: verifying ...
avrdude: 2046 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

sh-3.2$ ./avrdude -P /dev/cu.usbserial-A7004BTR -c avrisp -C ../etc/avrdude.conf -p t2313 -b 19200
 -U hfuse:w:0xdf:m -U lfuse:w:0xef:m        

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.13s

avrdude: Device signature = 0x1e910a
avrdude: reading input file "0xdf"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.03s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xdf:
avrdude: load data hfuse data from input file 0xdf:
avrdude: input file 0xdf contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.05s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xef"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.11s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xef:
avrdude: load data lfuse data from input file 0xef:
avrdude: input file 0xef contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.05s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.
スクリーンショット(2011-11-26 20.56.51)
sh-3.2$ ./avrdude -c usbtiny -C ../etc/avrdude.conf -p m644p -v -v

avrdude: Version 5.4-arduino, compiled on Oct  9 2007 at 11:20:31
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/hiroki/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port            : unknown
         Using Programmer      : usbtiny
         AVR Part              : ATMEGA644P
         Chip Erase delay      : 9000 us
         PAGEL                 : PD7
         BS2                   : PA0
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10   128    0 no       2048    8      0  9000  9000 0xff 0xff
           flash         33     6   256    0 yes     65536  256    256  4500  4500 0xff 0xff
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00

         Programmer Type : USBTINY
         Description     : USBtiny simple USB programmer

avrdude: Using SCK period of 10 usec
CMD: [ac 53 00 00] [00 00 53 00]
avrdude: AVR device initialized and ready to accept instructions

Reading |                                                    | 0% 0.00sCMD: [30 00 00 00] [00 30 00 1e]
CMD: [30 00 01 00] [00 30 00 96]
Reading | #################                                  | 33% 0.00sCMD: [30 00 02 00] [00 30 00 0a]
Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e960a
CMD: [50 00 00 00] [00 50 00 ff]
CMD: [50 00 00 00] [00 50 00 ff]
CMD: [50 00 00 00] [00 50 00 ff]
avrdude: safemode: lfuse reads as FF
CMD: [58 08 00 00] [00 58 08 de]
CMD: [58 08 00 00] [00 58 08 de]
CMD: [58 08 00 00] [00 58 08 de]
avrdude: safemode: hfuse reads as DE
CMD: [50 08 00 00] [00 50 08 fd]
CMD: [50 08 00 00] [00 50 08 fd]
CMD: [50 08 00 00] [00 50 08 fd]
avrdude: safemode: efuse reads as FD

CMD: [50 00 00 00] [00 50 00 ff]
CMD: [50 00 00 00] [00 50 00 ff]
CMD: [50 00 00 00] [00 50 00 ff]
avrdude: safemode: lfuse reads as FF
CMD: [58 08 00 00] [00 58 08 de]
CMD: [58 08 00 00] [00 58 08 de]
CMD: [58 08 00 00] [00 58 08 de]
avrdude: safemode: hfuse reads as DE
CMD: [50 08 00 00] [00 50 08 fd]
CMD: [50 08 00 00] [00 50 08 fd]
CMD: [50 08 00 00] [00 50 08 fd]
avrdude: safemode: efuse reads as FD
avrdude: safemode: Fuses OK

avrdude done.  Thank you.
以下のようにboards.txtを修正するとIDEから直接ISPでアップロードできるように なります。
sh-3.2$ grep usbtiny *
boards.txt:avrmega644p16.upload.using=arduino:usbtinyisp
このUSPtinyISPにはちょっと問題があって、MacOS起動前にUSBに接続している認識 されない。起動後にプラグインするとちゃんと認識する。HUBとの相性なんだろうか。 後から気がついたのだが秋月の2313は20PUと省電力版の10PUあって12Mのクロックを 使っているので20PUを使わなければならないところ10PUで作ってしまった。 とりあえず動いているからいいか。

クレア工房 さんのページを参考にしてArduino IDEに含まれるgccを直接使ってhexを作る Makefileを書いてみました。ちなみにMac IDE 0023のgccは4.3.2でした。
# with Arduino IDE 0023
# http://www.clarestudio.org/elec/avr/gcc-1.html
#

APPPATH=/Applications
TOOLPATH=Arduino.app/Contents/Resources/Java/hardware/tools/avr

PROG=test2313

$(PROG).hex: $(PROG).c
        $(APPPATH)/$(TOOLPATH)/bin/avr-gcc \
        -Os -I$(APPPATH)/$(TOOLPATH)/avr/include/ \
        -mmcu=at90s2313 -Wall -S -o $(PROG).s $(PROG).c
        $(APPPATH)/$(TOOLPATH)/bin/avr-gcc \
        -Os -mmcu=at90s2313 -Wall -c -o $(PROG).o $(PROG).s
        $(APPPATH)/$(TOOLPATH)/bin/avr-gcc \
        -Os -L$(APPPATH)/$(TOOLPATH)/avr/lib/ \
        -mmcu=at90s2313 -Wall -o $(PROG).elf $(PROG).o -lc
        $(APPPATH)/$(TOOLPATH)/bin/avr-objdump \
        -d $(PROG).elf > $(PROG).dump
        $(APPPATH)/$(TOOLPATH)/bin/avr-objcopy \
        -I elf32-avr -O ihex $(PROG).elf $(PROG).hex

clean:
        rm -f *.s *.o *.dump *.hex *.elf
出来たファイルはこんな感じ
sh-3.2$ file *
Makefile:      ASCII text
test2313.c:    ASCII c program text
test2313.dump: ASCII text
test2313.elf:  ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
test2313.hex:  ASCII text, with CRLF line terminators
test2313.o:    ELF 32-bit LSB relocatable, Atmel AVR 8-bit, version 1 (SYSV), not stripped
test2313.s:    ASCII assembler program text
MTM07で@morecat_labsさんのブースでGingerの基板を購入して部品を実装して USBtinyISPで88Pへ焼いてMacOS 10.6.8で試したがうまく行かない。 10.4ではechoでLEDの制御は出来るのでOSの問題と思われる。 /var/spool/uucp/の下にロックファイルも出来ていなくて、rootでlsofしても 出てこないのに使用中とはこれ如何に。さらにたちの悪い事に時々open出来る事がある。
sh-3.2$ sudo cu -l /dev/cu.usbmodemfd1431  
cu: /dev/cu.usbmodemfd1431: Line in use 
sh-3.2$ sudo echo -n "h*" > /dev/cu.usbmodemfd1431  
sh: /dev/cu.usbmodemfd1431: Resource busy 
もはやArduinoではないのだがATTiny2313を使ってリモコン送信機を作ってみた。 USBとの接続にはUSBtiny を使っている。USBtinyが1.5K位あり0.5Kしか使えなかったので三菱のディスプレーの 専用(2Byte送信)になっている。
ソースはここにに置いてあるが、仕組みはTimer0で38Kの信号を発生させて これの割り込み(76K)を数えてLow/Highを切り替えてパターンを生成しています。 コンパイルはmakeでArduino IDEのavr-gccを使っています。FTのチップを使った リモコンはFT232のチップが350円とちょっと高いのと1ピンしか使わなくもったい なので、100円の小さいAVRで作ってみようと思いました。汎用のリモコンにした かったが、2Kでは無理でした。適当な大きさと値段のAVR(28ピンはちょっと大きすぎ) がないので、とりあえずこのままかも知れません。

スクリーンショット(2011-12-10 12.32.58) IMGP0405 Copy_111
sh-3.2$ make check
python ./check.py main.elf
text: 1962, data: 2, bss: 62

USBtinyと同様のAVR上でソフトウエアでUSBを実現する V-USBも試してみた。

スクリーンショット(2012-05-03 12.29.22) IMGP0822

長年考えていた、フットスイッチでコンピュータをコントロールする事ができる かも。100円の2313で出来るので案外いいかも。コードのチェックアウトは以下。 HIDKeys.2007-03-29をベースにしています。USBのベンダーとプロダクトは オリジナルのままです。ビルドはmakeでMacOS X用のArduinoのgccを使っています。 Arduino 0023のgccでビルドすると2048バイトちょうどなので、利用するgccによっては 2Kに収まらないかもしれません。
svn co https://ubsa-osx.svn.sourceforge.net/svnroot/ubsa-osx/HIDKeys HIDKeys
2012年5月現在USBインターフェース付きのAVRはリリースされているが2313に比べると かなり高価です。将来安価になればそれでも良いでしょうが、DIPではリリースされ ない可能性があるのでUSBtinyやV-USBのは当面使われるのではないかと思われる。

USBTinyISPをV-USBに変更したプロジェクトがあったので、ちょっと試してみた。 結論から書くとあまりお勧めできない。

スクリーンショット(2012-05-26 13.29.59)

とりあえず書き込みが出来るようにはなったが、一度も書き込みを行っていない チップだとエラーになったりして、安定しない。またこのファームを焼いた8ピン AVRはRESETを信号線としてしまうので、普通のISP(SPI)では書き直しが出来なくなる。 こちらのリセットモジュール作成のページを参考にして作ってみた

IMGP1026

ATTiny85を使ったVUSBのモジュールを接続して、PCの電源を入れるとなぜか モジュールがハングアップしてしまう。ホットプラグしたときは問題なく認識されて 動作する。何とも不思議な現象でこの状態になったときにリセットピンをグランドに 落としてもリセットがかかっていないように見える。

接続したままでMac起動すると認識されない問題の理由がわかった。Mac起動時に USBがリセットされたときにAVRでWDTのリセットが発生する。その後にAVRはWDT カウンターがリセットされた状態となり再起動後は16msで再度WDTがかかり、 リセットを繰り返す状態であった。mainの最初にWDTカウンターを長めにセットする 事で、回避できた。

Copy_8

USBのハブなどの仕様の違いや、WDTをオフにする初期処理があったりで、発生しない ケースもあるのかもしれない。

AT90USB162が秋月で販売され始めたので、購入して開発環境をネットで調べた ところdfu-programmer といオープンソースでhexが焼けるらしい。0.6.2をMacでビルドする時の手順は以下の ようになる。(2013/09/28)
$ ls
dfu-programmer-0.6.2
libusbx-1.0.16
$ cd libusbx-1.0.16
$ ./configure
$ make
$ cd ..
$ cd dfu-programmer-0.6.2
$ cp ../libusbx-1.0.16/libusb/libusb.h src/
$ cp ../libusbx-1.0.16/libusb/.libs/libusb-1.0.0.dylib src/libusb-1.0.dylib
$ install_name_tool -id @executable_path/libusb-1.0.dylib src/libusb-1.0.dylib
$ ./configure LDFLAGS="-L."
$ make
$ cd src
$ ./dfu-programmer    
Type 'dfu-programmer --help'    for a list of commands
     'dfu-programmer --targets' to list supported target devices
     'dfu-programmer --version' to show version information
$ ./dfu-programmer at90usb162 get
Bootloader Version: 0x05 (5)
$ ./dfu-programmer at90usb162 flash /tmp/test.hex 
Validating...
4346 bytes used (35.37%)
スクリーンショット(2013-09-29 19.22.33)

AitendoでUSB ISPというモジュールがちょっと安かったので、試しに買ってみたが Win用の対応ライターしかなかったので、 こちらのページ を参考にUSB aspに焼き直してみた。

このモジュールでびんぼうでいいのをArduino IDEからブートを焼いてみたところ問題 なく焼けた。

続いてATMEGA64A-AUをこのモジュールで確認しようとしたところavrdudeで認識でき ない。翌日にUSB Tinyで確認したところ問題なく認識できた。

IMGP1532

opendous-jtagを試す為に久しぶりにdfu-programmerを使ってみた。新しいバージョン がリリースされていたので、ビルドしてみた。(2015/03/01)

$ cd dfu-programmer-0.7.2
$ cp ../libusb-1.0.19/libusb/libusb.h src/
$ cp ../libusb-1.0.19/libusb/.libs/libusb-1.0.dylib src/
$ install_name_tool -id @executable_path/libusb-1.0.dylib src/libusb-1.0.dylib
$ ./configure LIBUSB_1_0_LIBS="-L. -lusb-1.0" LIBUSB_1_0_CFLAGS="-Isrc/"
$ make
$ cd src
$ ./dfu-programmer at90usb162 get
Bootloader Version: 0x05 (5)

dfu-programmerで書き込む場合はeraseしてからflashしないとエラーになる。

dfu-programmerはビルドできて問題なく動作しているが、opendous-jtagの用意されて いるバイナリをを焼いても認識されない。おそらくCPUクロックが8Mでビルドされて いる為ではないかと思われる。opendous-jtagのビルドを試みたが、LUFAというAVRの USBライブラリを使っているが現在のライブラリコードではそのままではビルドできなさ そうなので、放置かな。

AVRを使い始めた当時もはまったような気がするのだがJJYのデコーダーが7K弱なので 328Pより50円安い168Pに焼こうとしてはまったのでメモを残しておく。Arduino 1.0.6 の168はPでない方の設定になている。このためboards.txtのnameの168を168Pにしてお く。これだけではだめでブートを焼くためにはavrdude.confの168のシグネチャを168P のものに変更する必要がある。これでブートは焼けるのだが、スケッチを焼くときには 元に戻しておかないと焼けない。あと何故かUSBaspでは認識できずブートが焼けず、 USBTinyISPでは焼けた。

Arduino 1.0.6の「ブートローダを書き込む」はマイコンボードで選択されたタイプの ブートローダプログラムの書き込みとFuseの書き込みをおこなっている。

久しぶりに新しいチップにブートを焼こうと思ったところ、USBTinyISPの6ピンコネクタが 変な事に気がついた。元々もボトムビューで回路図が書いてあったようで、逆に なってしまっていたようだ。


USBTinyISPは製品になってしまいフリーで作る情報が少なくなってしまったようだ。

最近だとATTiny44を使ったFabISPというのもあるみたいだ。(2019/8)

パッチで提供されていた、avrdudeのFT232サポートはVersion 6.2で取り込まれた。 またAT90USB162などを使ったAVRISP mkIIクローンもあった。AT90USB162はdfuで 書き込めるので、これらはISPを作るためのISPの問題はない。(2019/8)

上を調べていて気がついたのだがFTDIのMPSSEのサポートはavrdude Version 5.11 で入っていた。Arduino 1.0.6のavrdudeは5.11だった。

Copyright (C) 2011 Hiroki Mori All Rights Reserved.