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をインストール.

プログラム例

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言語で開発できるとかなり楽ですね.

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.