AVRでC言語
WinAVRを使います.
C言語での開発
Cで開発できるとはいっても,PCと違ってSRAMの量やスタックは限られているので, どんなコードにコンパイルされるか想像しながら書けないときついと思います. 少なくとも,AVRの命令セットを頭の片隅に置きながらプログラムを書いた方が 良いでしょう.
あと,GCCを使うと,コードの最適化で思った処理時間と大幅に食い違う部分が 出てくることがあるみたいです(最適化を切るのも手ですが). 指定した時間待つディレイ関数をインラインアセンブラで書いておくと便利です. ミリ秒単位のタイミングならそれで十分です. 本当に時間の精度が必要ならアセンブラで書きましょう. (タイマー割り込みくらいならCでも使えるか)
開発環境
まず,AVR用のプログラムを作るためのコンパイラが必用です.
WinAVR (Windows用)
WindowsならWinAVRが簡単にインストールできていいです.
WinAVRをダウンロードします. SourceForgeからのダウンロードに慣れてないとかなり手間取るかもしれませんが, 良く見てリンクを辿っていけば,目的のファイルにありつけます.
困ったときは,AVR-Wikiの 情報や,データシートを参照すれば大抵解決します.
インストール
まず,言語の選択画面. 好きな言語でいいですが,とりあえずここでは「Japanese」にしておきます.
あとは適当に進めてください.
avr-gcc
その他のOSの場合は,avr-gccをインストール.
- 古いバージョンはmega88に対応していない?
- MacOS用の最新版は?
プログラム例
PORTBを全てON/OFFする例です.LED等を繋げて確認してみてください.
#include<avr/io.h>
void wait(uint16_t w){
while(w--){
volatile uint16_t i=200;
while(i--);
}
}
int main()
{
DDRB=0xFF;
for(;;) {
PORTB = 0x00;
wait(1000);
PORTB = 0xFF;
wait(1000);
}
}
コンパイル
私は以下のようなバッチファイルを作って使ってます(2313用). 使うAVRに合わせてmmcuの指定を変更してください.ATMEGA88ならatmega88.
@echo off
SETLOCAL
set PATH=D:\Dev\WinAVR\bin;%PATH%
cd %~dp1
echo compiling %~nx1 ...
avr-gcc -mmcu=at90s2313 -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
exit /B %ERR%
書き込み
詳しくは,使っているライタの使い方を参照してください.
USBasp用のavrdudeを使う場合の バッチファイルです.
@echo off
SETLOCAL
set PATH=D:\Dev\avr;%PATH%
set DEVICE=m88
REM DEVICE=2313,m88,etc...
cd %~dp1
echo writing %~n1.hex ...
avrdude -c usbasp -p %DEVICE% -U flash:w:%~n1.hex -U eeprom:w:%~n1.hex
set ERR=%ERRORLEVEL%
IF %ERR% NEQ 0 goto ERROR
exit /B 0
:ERROR
exit /B %ERR%
おわりに
C言語で開発できるとかなり楽ですね.
この文書の履歴
- 2006-04-XX 公開