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 公開