AVRをとりあえず使ってみる。
Linux,Winでともに使えるライタを製作する。
gccも使ってみる。


   AVRをとりあえず動かしてみる

AVRはISP書き込みにより簡単に使用できるようです。そこで回路の製作、AVR Studioによるプログラムの製作、書き込みまでの流れを記録しておきます。

●回路の作成

ISPプログラミングと簡単な動作実験(LEDを点滅させる)を行うための回路を作成します。このような回路で実験してみました。AT90S1200を使いました。

回路図はこれです。

ISPコネクターは

の配置がATMELが推奨するピン配置のようです。(ただしATMELのスターターキットのピン配置は異なるとのことです。)

AT90S1200Aの場合はXTAL1,XTAL2には何もつながなくても内部1MHz発振により動作可能です。RESETは内部プルアップされているようですので上記の回路とします。

後からProgrammer(ライター)の作成に使用するためICソケットを使います。

●LEDを点滅させるプログラムを作成する

次にPB0に接続されたLEDを点滅させる簡単なプログラムを作ってみます。

プログラムはATMEL社からフリーで提供されているAVRstudioという開発環境を使ってみました。ここからダウンロードできます。ASTUDIO3.EXEを実行すると自己解凍してSetup.exeを実行しました。

プログラムを行うためにインクルードファイルをダウンロードします。先ほどと同じところにある、AVR000.exeをダウンロードして実行するといくつかのファイルができました。AT90S1200を使用しているので1200def.incをプログラム中でインクルードしました。アセンブラファイルはこれを使います。

操作は
(1)project->newよりプロジェクトを作ります。プロジェクト名、プロジェクト作成フォルダを入力し、AVR Assemblerを選択します。
(2)project管理windowのAssemblerFilesを右クリックしてAddFileよりアセンブラファイルを追加します。
(3)project->Assembleでアセンブルします。すると.hexファイルができます。

●フラッシュに書き込む

最初は書き込むための装置がありません。そこでトラ技1999/11号にも紹介された赤松武士さんのページ(すばらしいです)からプリンタポートISP書き込み用のプログラムをダウンロードして書き込んでみました。感謝!!。
書き込みケーブルの長さは結構短くしないと(30cmくらい)私の場合はうまくいきませんでした。書き込み用プログラムはAVRXS.exeを使用しました。

私の場合はパソコンのドライブ能力が不足しているせいか、買ってきたAT90S1200のうち2個に1個しかきちんと書き込みができませんでした。(後から作るライターでは書き込みできました)

●動かしてみる

ISPケーブルをぬいて電源をつなぐとLEDが点滅したら成功です。


ISP書き込みケーブルと実験基盤の写真です。
写真ではクロックにはキンセキのクロックを使用しました。XTAL1に入力します。


   マルチプラットフォームライタを作成する

書き込み実験ができましたので、マルチプラットフォームな書き込み機を製作しました。これはここにあるものと同じです。書き込みプログラムはLinux版がGNUでWin版がATMEL標準プログラムを使用できます。ATMEL標準プログラマです。(ApplicationNote : AVR910:In-SystemPrograming

●回路の作成

単純にRS232Cとのレベル変換のみです。回路図はこれです。


書き込み機の写真です。ISPコネクタの仕様は先ほどの実験基板と同じにしておきます。
クロックは4MHz動作が可能なものでしたらセラロック等でもいいと思います。

●ファームウェアの書き込み

書き込み機のファームを書き込みます。書き込むファームのはここにあります。いまはVer2.3のファームが一番新しいので、これとアセンブルしたHEXファイルをここに置いておきます。これを先ほどの実験基板を使って書き込みました。

●書き込みソフトのダウンロード

ATMELのwebページからWIN用の書き込みソフトをダウンロードします。ここからダウンロードできます。APROGWIN.EXEをダウンロードして展開すると実行ファイルができるのでこれを使います。


この画面が出たらOKです。

ためしに先ほどのLED点滅基板のチップに書き込んでみました。同じように動けばライターがきちんと動作しています。8535などがありませんが、8515など近いもので書き込んだらきちんと書き込みができます。内部的には同じなので大丈夫です。書き込みファームの方でもその辺のチェックはmegaAVRなど書き込みシーケンスの異なるものを除いて、行っていないようです。というより、2313,4414,8515系はファーム内では同じルーチンで動いているようです。


   setupしたgccを使ってみる

AVRのページのavr-gccを使って同じくLEDを点滅させてみます。

●AVRチップの準備

avr-gccはat90s1200に対応していません。そこでほぼpin-compatibleなat90s2313を使ってみます。回路は「とりあえず動かしてみる」の項目の中の回路はそのままにチップのみ交換すればOKです。

●Cプログラミング

アセンブラと大体同じようにLEDを点滅させるプログラムを作ってみます。プログラムはこれです。

#include <io.h>
/**** function prototype ****/
static void wait(int x);
main()
{
	outp(1, DDRB);
	for(;;){
		outp(0, PORTB);
		wait(10);
		outp(1, PORTB);
		wait(10);
	}
} 
/**** functions ****/
static void wait(int x)
{
	int i,j;
	for(i = 0;i < x;i++){
		for(j = 0;j < 1000;j++){
			j = j;	/*dummy*/
		}
	}
}


●コンパイル

ためしに
avr-gcc -mmcu=at90s2313 test.c -S
としてアセンブラリストを出してみましょう。結果はこうなります。
(バージョンによってアセンブラ出力結果は微妙に大胆に異なります。)

●書き込んでみる

このプログラムからHEXファイルを作ります。
avr-gcc -mmcu=at90s2313 test.c -o test.elf
avr-objcopy -O ihex test.elf test.hex
これでtest.hexができます。

ispコネクタをつけて前項で作成したライタで書き込みます。書き込んだらいきなりLEDが点滅してくれると思います。点滅してくれたら成功です。


戻る