2012-08-10
OSX mountain lionでAVRの書き込み with avrdude
おおむねここを参考にする。
http://jun1chi.blogspot.jp/2011/07/macarduino-atmega168pft232rl.html
ピンアサインはここ。
http://sprocessing.blogspot.jp/2009/01/avrispmkii.html
重要な事実が書いてある。
http://d.hatena.ne.jp/nisuseteuryalus2/20110403
次に、これが意外と盲点なのですが、電池でいいので5V電源を用意します。そしてピンに直接さして外部電源として供給します。
(゜Д゜) ハア??
ここでかなりはまりました。
% avrdude -c avrisp2 -P usb -p t2313 -U flash:w:tiny2313.hex:i -v -B 19200
avrdude: Version 5.11.1, compiled on Aug 10 2012 at 22:53:07
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file is "/usr/local/Cellar/avrdude/5.11.1/etc/avrdude.conf"
User configuration file is "/Users/shohei/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb
Using Programmer : avrisp2
Setting bit clk period : 19200.0
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200109639
avrdude: stk500v2_recv_mk2: error in USB receive
AVR Part : ATtiny2313
Chip Erase delay : 9000 us
PAGEL : PD4
BS2 : PD6
RESET disposition : possible i/o
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 6 4 0 no 128 4 0 4000 4500 0xff 0xff
flash 65 6 32 0 yes 2048 32 64 4500 4500 0xff 0xff
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
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
calibration 0 0 0 0 no 2 0 0 0 0 0x00 0x00
Programmer Type : STK500V2
Description : Atmel AVR ISP mkII
Programmer Model: AVRISP mkII
Hardware Version: 1
Firmware Version Master : 1.10
Vtarget : 5.2 V
SCK period : 19569.47 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 1.98s
avrdude: Device signature = 0x1e910a
avrdude: safemode: lfuse reads as 64
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
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 "tiny2313.hex"
avrdude: writing flash (110 bytes):
Writing | ################################################## | 100% 76.84s
avrdude: 110 bytes of flash written
avrdude: verifying flash memory against tiny2313.hex:
avrdude: load data flash data from input file tiny2313.hex:
avrdude: input file tiny2313.hex contains 110 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 72.90s
avrdude: verifying ...
avrdude: 110 bytes of flash verified
avrdude: safemode: lfuse reads as 64
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK
avrdude done. Thank you.
なんかむちゃくちゃ遅い。。。
http://www.mikrocontroller.net/topic/96528
-Bオプション外すと心持ち早くなった気がする。。?
書き込む前にavrdudeのターミナル(-tオプション)で
-BオプションかけてBaud rate設定しといて
書き込むのが今のところの最善策かな。
Baud rateが早いほうがいいか遅いほうがいいかはよくわからない。
書き込みの様子。
OSX mountain lionでAVRのコンパイル
http://awawa.hariko.com/eclipse_avr.html を参考に
crtm168.o(-mmcu=atmega168を指定した時)とかcrttn2313.o(-mmcu=attiny2313を指定した時)
とかがないと言われるので、
この2つを/usr/local/AVR/avr/libに置く。
そしてなぜかArduinoのライブラリの場所を指定するとうまくいく。
(ライブラリを2回見ている?)
テストファイル
copy.cの中身
% cat copy.c
#include<avr/io.h>
int main(void) {
uint8_t i;
i = 0;
DDRB = 0xff;
while (1) {
i++;
PORTB = i;
}
}
% avr-gcc -L /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/lib/ -mmcu=attiny2313 copy.c
または最適化
% avr-gcc -L /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/lib/ -mmcu=attiny2313 copy.c -O2 -Os
hex生成
% avr-objcopy -R .eeprom -O ihex a.out copy.hex
できた
% cat copy.hex :1000000012C017C016C015C014C013C012C011C052 :1000100010C00FC00EC00DC00CC00BC00AC009C07C :1000200008C007C006C011241FBECFEDCDBF02D04F :1000300007C0E6CF8FEF87BB80E08F5F88BBFDCF27 :04004000F894FFCF62 :00000001FF
% avr-objdump -d a.out a.out: ?ե???????? elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 12 c0 rjmp .+36 ; 0x26 <__ctors_end> 2: 17 c0 rjmp .+46 ; 0x32 <__bad_interrupt> 4: 16 c0 rjmp .+44 ; 0x32 <__bad_interrupt> 6: 15 c0 rjmp .+42 ; 0x32 <__bad_interrupt> 8: 14 c0 rjmp .+40 ; 0x32 <__bad_interrupt> a: 13 c0 rjmp .+38 ; 0x32 <__bad_interrupt> c: 12 c0 rjmp .+36 ; 0x32 <__bad_interrupt> e: 11 c0 rjmp .+34 ; 0x32 <__bad_interrupt> 10: 10 c0 rjmp .+32 ; 0x32 <__bad_interrupt> 12: 0f c0 rjmp .+30 ; 0x32 <__bad_interrupt> 14: 0e c0 rjmp .+28 ; 0x32 <__bad_interrupt> 16: 0d c0 rjmp .+26 ; 0x32 <__bad_interrupt> 18: 0c c0 rjmp .+24 ; 0x32 <__bad_interrupt> 1a: 0b c0 rjmp .+22 ; 0x32 <__bad_interrupt> 1c: 0a c0 rjmp .+20 ; 0x32 <__bad_interrupt> 1e: 09 c0 rjmp .+18 ; 0x32 <__bad_interrupt> 20: 08 c0 rjmp .+16 ; 0x32 <__bad_interrupt> 22: 07 c0 rjmp .+14 ; 0x32 <__bad_interrupt> 24: 06 c0 rjmp .+12 ; 0x32 <__bad_interrupt> 00000026 <__ctors_end>: 26: 11 24 eor r1, r1 28: 1f be out 0x3f, r1 ; 63 2a: cf ed ldi r28, 0xDF ; 223 2c: cd bf out 0x3d, r28 ; 61 2e: 02 d0 rcall .+4 ; 0x34 <main> 30: 07 c0 rjmp .+14 ; 0x40 <_exit> 00000032 <__bad_interrupt>: 32: e6 cf rjmp .-52 ; 0x0 <__vectors> 00000034 <main>: 34: 8f ef ldi r24, 0xFF ; 255 36: 87 bb out 0x17, r24 ; 23 38: 80 e0 ldi r24, 0x00 ; 0 3a: 8f 5f subi r24, 0xFF ; 255 3c: 88 bb out 0x18, r24 ; 24 3e: fd cf rjmp .-6 ; 0x3a <main+0x6> 00000040 <_exit>: 40: f8 94 cli 00000042 <__stop_program>: 42: ff cf rjmp .-2 ; 0x42 <__stop_program>
2012-07-27
ArduinoでAVR開発環境を作る
いま飛び込んできたニュース。
なんとArduinoでAVRの開発環境が作れるらしい。
- Aruduino IDEで ATtiny/ATmega 開発環境を作る
http://www.geocities.jp/arduino_diecimila/use/arduino_dev.html
- ArduinoISPを使う
http://www.geocities.jp/arduino_diecimila/use/attiny.html
AT tinyでステッピングモータを動かす
http://cap.dcnblog.jp/jisaku/2007/12/post-91a9.html
2011-10-30
AVRマイコンライタの製作
PICに引き続きAVRの環境を構築した。
AVRはPICと違ってGNUをサポートしてるらしい。
Cでの開発環境も整っているみたいなので面白そう。
参考にしたのは、武藤先生の面白チャレンジ!インターネットガジェット入門
開発環境はWindows7です。
手順は、
(1)AVRライタの製作
(2)cファイルをコンパイル→hexファイル生成→AVRに書き込み
(3)LEDの点滅テスト
まず、AVRライタの製作から。
材料は、
・Atmel AT mega 168 20PU(400円)
・ブレッドボード(200円くらい?)
・ジャンプワイヤ
・クリスタルオシレータ(水晶発振子。秋月、5個200円。今回は12MHzを使用)
・FT232RL USBシリアル変換モジュール(950円)
・USB AオスーUSB miniオス ケーブル(120円)
図のように構築する。空中配線はご愛嬌。
製作したライタをUSBケーブルでPCに接続すると、自動的にデバイスドライバがインストールされる。
(2)次にWinAVRをインストールする。
その前にCygwinを入れておく。gcc-core,gcc-g++,wget,tar,vim,unzipなどのLibs(ライブラリ)をインストールしておく。
sourceforgeからWinAVRをダウンロード、インストール。
武藤先生のサーバからテストコードをとってくる。
http://web.sfc.keio.ac.jp/~takefuji/led0-168.zip
中に入ってるled-0168.pnprojをダブルクリックすると、Programmer's notepadが立ち上がる。
(Programmer's notepadはWinAVRのパッケージに入ってるソフトウェア)
mainファイルは以下。
main.c
/* LED flash using atmega168 designed by takefuji on sept. 22, 2009*/ #define F_CPU 1.0E6 //1MHz #include <avr/io.h> #include <util/delay.h> int main(void) { for(;;){DDRC=0x20; PORTC=0x20;_delay_ms(500); PORTC=0x00;_delay_ms(500);} }
Toolsメニューの"Make all"でビルドするのだが、ここでビルドが通らない。
エラーメッセージを確認すると、
#include <util/delay.h>
がない、といっている。
WinAVRのフォルダを確認すると、確かに入ってない。
検索するとWinAVR/include/avr/delay.hに入っていたので、環境変数PATHにC:\WinAVR\includeを追加して
#include <avr/delay.h>
に書き換えたらビルド成功。(環境変数の追加はいらないかも)
次に、WinAVRをインストールすると作成されたavrdudegui.exeを起動。
以下のように設定する。コマンドラインオプションに注意。
接続後、FuseのReadを実行して上記のようになれば成功。
さきほど生成した.hexファイルをFlashに指定してErase-Write-Verifyを実行。
(3)LED点滅試験
以下のように、テストボードを組む。
点滅の様子

