AVRでプログラムを動かすためには,パソコン上でプログラムを書いて, AVRに書き込む必要があります.
ダウンロードの仕方が分からない場合や面倒くさい場合は, 言ってくれればフラッシュメモリで渡します. (ロボ研の共有フォルダにもおいておきます)
Windowsの人はWinAVRをインストール.
MacOSの人はOSX-AVRが便利です.
Linuxやその他の人は,avr-gccを使ってください. 方法は後藤君に聞いてください.
コンパイルしたプログラムをAVRに転送するソフトです.
USBaspという回路を使って書き込みます. avrdudeが標準的ですが,2006年05月に公開されたavrspxが使いやすい.
avrspxの方が使いやすく,書き込み速度も速いようです. MacOS用は無いのか?ってなわけでMacOSに移植したものを置いておく (USBasp専用.FreeBSDでも使えました)
WinAVRに付属しているavrdudeはUSBaspに対応していない(気がする).
AVRの動作モードは幾つかあって, ヒューズというものを設定する必要が有ります. ヒューズというと一度書き換えると終わりみたいですが,何度も書き換えられます.
今回は,ATMEGA88の動作クロックを8MHzに設定します.
これは,最初に一度だけやれば,次回からは必要ありません. もちろん,AVRを新しいものに交換したりした場合は,もう設定しなおす必要があります.
以下のコマンドを打ち込んでください.
avrspx -pu -d60 -fl11100010
ソフトから書き込み速度の調節が出来ないので,ジャンパを差し込む必用があります.
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 led_test.elf led_test.c avr-objcopy -O ihex -R .eeprom led_test.elf led_test.hex
まず,avr-gccでコンパイルして,objcopyで書き込むためのhex形式のファイルに 変換しています.
書き込み時には,マイコンの方の電源を入れておくのを忘れないでください. 電源を切ったまま,何度も書き込もうとしたり,書き込みの最中に電源をON/OFFすると, ヒューズの設定がおかしくなって,それ以降,書き込めなくなることがあるようです.
avrdude -c usbasp -p m88 -U flash:w:led_test.hex
avrspx -pu led_test.hex
LEDが点滅することを確認してください.
毎回,コマンドを入力するのは面倒なので,バッチファイルかシェルスクリプトを作っておくと楽です.
#!/bin/sh 書け>後藤君
書け>後藤君
ドラッグ&ドロップでコンパイルや書き込みが出来るようになってます.
コンパイルは,ソースファイルを「gcc-m88.bat」にドラッグ&ドロップ. エラーが出ずに「~.hex」というファイルが出来ればOK. エラーが無ければそのままコマンドプロンプトが閉じる.
書き込みは,出来た hex ファイルをwrite.batにドラッグ&ドロップ. これも,エラーが無ければそのままコマンドプロンプトが閉じる.
@echo off SETLOCAL set PATH=C:\WinAVR\bin;%PATH% cd %~dp1 echo compiling %~nx1 ... avr-gcc -mmcu=atmega88 -Wall -O2 -o %~n1.elf %~nx1 %2 %3 set ERR=%ERRORLEVEL% IF %ERR% NEQ 0 goto ERROR avr-objcopy -O ihex -R .eeprom %~n1.elf %~n1.hex set ERR=%ERRORLEVEL% IF %ERR% NEQ 0 goto ERROR del %~n1.elf exit /B :ERROR pause exit /B %ERR%
@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%