AVRに書き込む
AVRでプログラムを動かすためには,パソコン上でプログラムを書いて,AVRに書き込む必要があります.
ソフトのインストール
ダウンロードの仕方が分からない場合や面倒くさい場合は,言ってくれればフラッシュメモリで渡します.(ロボ研の共有フォルダにもおいておきます)
コンパイラ
Windowsの人はWinAVRをインストール.
MacOSの人はOSX-AVRが便利です.
Linuxやその他の人は,avr-gccをmakeして使ってください.苦労するかもしれませんが….
ライタ
コンパイルしたプログラムをAVRに転送するソフトです.
USBaspという回路を使って書き込みます.avrdudeが標準的ですが,2006年05月に公開されたavrspxが使いやすい.
avrspxの方が使いやすく,書き込み速度も速いようです.MacOS用は無いのか?ってなわけでMacOSに移植したものを置いておく(USBasp専用.FreeBSDでも使えました)
- USBasp USBasp対応のavrdude
- AVR-Wiki SandBoxにavrspxがあるhttp://avrwiki.jpn.ph/wiki.cgiに移動?
- avrspx_b10_10_osx.tar.gz USBasp専用avrspx for MacOS X
WinAVRに付属しているavrdudeはUSBaspに対応していない(気がする).
ヒューズの設定
AVRの動作モードは幾つかあって,ヒューズというものを設定する必要が有ります.ヒューズというと一度書き換えると終わりみたいですが,何度も書き換えられます.
今回は,ATMEGA88の動作クロックを8MHzに設定します.
これは,最初に一度だけやれば,次回からは必要ありません.もちろん,AVRを新しいものに交換したりした場合は,もう設定しなおす必要があります.
avrspxを使う場合
以下のコマンドを打ち込んでください.
avrspx -pu -d60 -fl11100010
avrdudeを使う場合
ソフトから書き込み速度の調節が出来ないので,ジャンパを差し込む必用があります.
avrdude -c usbasp -p m88 -U lfuse:w:0xe2:m
詳しくは,後藤君に聞いてください.
コンソールについて
コンソール上でコマンドを打ち込んでプログラムを実行できるようにしておきましょう.
Windowsの場合は「コマンドプロンプト」を使います.コマンドプロンプトは,スタートメニューのプログラムの「アクセサリ」の中に入っています.
コマンドを打ち込む前に,作業用のディレクトリ(フォルダ)に移動しましょう.目的のディレクトリに移動するためには,
cd ディレクトリ名 [Enter]
とします.
フォルダをウインドウにドラッグ&ドロップすると,ディレクトリ名が貼り付けられるので活用しましょう.
プログラム例
PORTDのLEDをON/OFFするプログラムです.内容の解説は次回やるので,ここではなんとなく雰囲気だけ見てください.テキストエディタにコピーして貼り付けて,led_test.cという名前で保存してください.
#include <avr/io.h> // 指定された時間だけ待つ void wait(uint16_t w){ while(w--){ volatile uint16_t i=200; while(i--); } } int main() { DDRD=0x0F; for(;;) { PORTD = 0x0F; // ON wait(1000); // 少し待つ PORTD = 0x00; // OFF wait(1000); // 少し待つ } }
コンパイル
以下のコマンドで,AVRに書き込むための.hexファイルが作成できます.
avr-gcc -mmcu=atmega88 -Wall -O2 -o a.out led_test.c avr-objcopy -O ihex -R .eeprom a.out led_test.hex
まず,avr-gccでコンパイルして,objcopyで書き込むためのhex形式のファイルに変換しています.
書き込み
書き込み時には,マイコンの方の電源を入れておくのを忘れないでください.電源を切ったまま,何度も書き込もうとしたり,書き込みの最中に電源をON/OFFすると,ヒューズの設定がおかしくなって,それ以降,書き込めなくなることがあるようです.
avrdudeの場合
avrdude -c usbasp -p m88 -U flash:w:led_test.hex
avrspxの場合
avrspx -pu led_test.hex
LEDが点滅することを確認してください.
スクリプト,バッチファイル
毎回,コマンドを入力するのは面倒なので,バッチファイルかシェルスクリプトを作っておくと楽です.
MacOS/Linux用
gcc-m88.sh
#!/bin/sh avr-gcc -mmcu=atmega88 -Wall -O2 -o a.out $* avr-objcopy -O ihex -R .eeprom a.out ${1%.*}.hex
write-m88.sh
#!/bin/sh avrspx -pu -d2 $*
Windows用
ドラッグ&ドロップでコンパイルや書き込みが出来るようになってます.
コンパイルは,ソースファイルを「gcc-m88.bat」にドラッグ&ドロップ.エラーが出ずに「~.hex」というファイルが出来ればOK.エラーが無ければそのままコマンドプロンプトが閉じる.
書き込みは,出来た hex ファイルをwrite.batにドラッグ&ドロップ.これも,エラーが無ければそのままコマンドプロンプトが閉じる.
gcc-m88.bat
@echo off SETLOCAL set PATH=C:\WinAVR\bin;%PATH% cd %~dp1 echo compiling %~nx1 ... avr-gcc -mmcu=atmega88 -Wall -O2 -o %~n1.out %~nx1 %2 %3 set ERR=%ERRORLEVEL% IF %ERR% NEQ 0 goto ERROR avr-objcopy -O ihex -R .eeprom %~n1.out %~n1.hex set ERR=%ERRORLEVEL% IF %ERR% NEQ 0 goto ERROR del %~n1.elf exit /B :ERROR pause exit /B %ERR%
write.bat
@echo off SETLOCAL cd %~dp1 echo writing %~n1.hex ... avrspx -pu -d2 %~n1.hex set ERR=%ERRORLEVEL% IF %ERR% NEQ 0 goto ERROR exit /B 0 :ERROR pause exit /B %ERR%
この文書の履歴
- 2006-06-29 慌てて作成
- 2006-09-23 MacOSでもavrspxを
- 2009-07-08 少し修正