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が点滅してくれると思います。点滅してくれたら成功です。