« AVR実験室(9) | トップページ | AVR実験室(11) »

2010年3月22日 (月)

AVR実験室(10)

3月7日掲載のAVR用プログラムについて、少しずつ説明していこうと思います。このプログラムはAVRのアセンブラで記述しています。AVRマイコンもほかのマイコンと同様C言語でもプログラムの作成ができますが、マイコンの動作を理解するにはアセンブラを使用することを私はお勧めします。マイコンごとに異なる言語になるため、煩わしいかもしれませんが、どれか一つのアセンブラ言語が理解できれば、ほかのものを理解するのは、それほど困難とは思いません。私自身、もう○十年前になりますが、Z80のアセンブラを散々いじくりまわしましたが、その時の経験が今のワンチップマイコンの理解に役立っていると感じています。また、AVRマイコンはRISCであるため、命令の種類が少ない(汎用レジスタが多いので、それの組み合わせを入れると多くなりますが)ので、覚えるのは苦にならないと思います。
さて、先のプログラムですが、ヘッダー、レジスタ定義、割込みベクタテーブル、プログラム本体(主プログラムと割込み処理プログラム)、定数の5つに大きく分かれます。

【1 ヘッダー】
#include <m88def.inc>
これは使用するマイコン固有のRAMサイズやアドレス等の定義ファイルを取り込むための宣言部分になります。プログラムそのものを生成するわけではありませんが、これを利用することで、使用するマイコンを別のものに入れ替えたときに、プログラム本体に大きな修正をせずにすみます。つまり、特定のRAMアドレスやIOポートなどをアドレスではなく名称で指定できるようになります。本プログラムの中では、「SPH」、「SPL」、「RAMEND」といったものが該当します。それぞれ、m88def.incファイル内で次のように定義されています。
(m88def.incファイルからの抜粋)
;***** I/O REGISTER DEFINITIONS ($3F-$00) **********************************
.equ  SPH        =$3E
.equ  SPL        =$3D

;***** DATA MEMORY DECLARATIONS ********************************************
.equ  RAMEND     = $4FF

アセンブラのプログラム作成するに当たり、このファイルを折に触れて参照してください。

【2 レジスタ定義】
.def Work_Main = R16
AVRマイコンのレジスタはR0~31の32個あります。プログラム中でわかりやすいように、また、同じレジスタを重複して使用することがないように、使用するレジスタに名称を付けています。これは必須ではありませんが、推奨です。なお、独自の機能があるため、m88def.incファイルで既に定義されているレジスタもあります。また、R0~R15は定数を直接代入したり、参照することができません。定数を代入して、各種設定等に使用する場合には、R16~31を使用します。

【3 割込みベクタテーブル】
.cseg

;interrupt table
.org 0
rjmp RESET ;Reset

.csegでプログラムエリアであることを示します。.org 0で、次に続くプログラムが0番地から開始されることを示します。0番地はマイコンが最初に処理する命令となります。実際には、システムリセットによる割込み処理です。また、ATmega88には計26個の割込みがあるため、0番地から連続する25までは、各割込み発生時に最初に処理される命令(実際にはジャンプ命令が書かれることが多い)を記述します。rjmp RESETは、RESETというラベル(プログラムの特定番地を名称で表したもので、アセンブラが番地を自動計算します。)へ処理を移す(relative jump=相対ジャンプ)という命令です。

【4 プログラム本体】
(1)初期設定
RESET:

;inhibit interrupt
cli

;set stuck point
ldi Work_Main,high(RAMEND)
out SPH,Work_Main
ldi Work_Main,low(RAMEND)
out SPL,Work_Main

RESET:は上記3で説明したラベルです。マイコン起動時に最初に処理するプログラムを記述しています。cliは割込み禁止です。組み上げたマイコンシステムに合わせた初期設定が終わるまで、予期しない割込みが発生しないよう、割込み処理をすべて受付ないようにしています。続いてSPHとSPLという2つのレジスタの初期設定をしていますが、これはスタックポインタというレジスタです。スタックポインタは、割込みやサブルーチン等で処理の途中で別の処理に一旦移るとき、戻ってくるプログラムの番地を保存する場合等に使用されます。そのため、まず最初に設定します。RAMENDはマイコンのRAMの最後の番地を示します。スタックはRAMの後ろの番地から、前の方に順に使用されます。

本日は、ここまで、続きは日を改めて。

|

« AVR実験室(9) | トップページ | AVR実験室(11) »

ワンチップマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: AVR実験室(10):

« AVR実験室(9) | トップページ | AVR実験室(11) »