アプリケーションノート 3561

MAX-IDEの使用にあたって


要約: MAX-IDEは、MAXQ®マイクロコントローラファミリのための、フル機能のアプリケーション開発/デバッグ環境です。MAX-IDEは、MAXQのすべての標準評価キットで動作するように設計されており、プロジェクトベースの開発環境、MAXQの標準デバッグ機能へのアクセス、統合マクロアセンブラ、およびJTAGインタフェースを使用したインサーキットアプリケーションのローディングを実現しています。

概要

MAX-IDEは、MAXQ™マイクロコントローラファミリのための、フル機能のアプリケーション開発/デバッグ環境です。MAXQのすべての標準評価キットで動作し、以下の機能が用意されています。

  • MAXQアセンブリアプリケーション用プロジェクトベースの開発環境
  • すべてのMAXQマイクロコントローラ用の標準ヘッダファイルを含むMAXQマクロアセンブラを内蔵
  • JTAG/TAPインタフェースとROMブートローダを使用したインサーキットアプリケーションのローディング(フラッシュまたはEEPROMプログラムメモリを備えたMAXQマイクロコントローラ用)
  • JTAG/TAPインタフェースを経由して利用可能なインサーキットデバッグ機能(ブレークポイント機能、ステップバイステップのプログラム実行、およびメモリ/レジスタの内容表示を含む)
参考資料
詳細については、MAXQ2000評価キットのデータシートを参照してください。このデータシートは、評価キットCDまたはオンラインからダウンロードすることができます。

MAX-IDEのインストール

システム要件

  • オペレーティングシステム:Windows® 98、Windows NT、Windows 2000、Windows ME、またはWindows XP®
  • 少なくとも1つの空きシリアルCOMポート(MAXQ評価キットとの通信に必要)、またはUSB-to-serialアダプタと1つの空きUSBポート

インストールプログラムの実行

  1. MAX-IDE用のインストールパッケージはMAX-IDE.zip
  2. このパッケージをダウンロードして解凍し、setup.exeを実行してMAX-IDEをハードドライブにインストールします。
  3. [InstallShield]ダイアログで、[Typical installation]を選択すると、評価キットを用いてMAXQアプリケーションを開発するのに必要なすべてのファイルがインストールされます。
  4. インストールが完了すれば、[スタート]メニューからMAX-IDEを起動することができます。

MAX-IDEのインストールファイル

MAX-IDEのメイン実行ファイルとヘルプファイルは、MAX-IDEのルートディレクトリにあります。デフォルトでは、このディレクトリは、Program Files\MAX-IDEです。その他のファイルは、以下のサブディレクトリにあります。

  • Compilersサブディレクトリには、MAX-IDEでインストールされたすべてのコンパイラとアセンブラのための実行ファイルとデータファイルが格納されています。ここには、少なくともMAXQの標準アセンブラが含まれます。使用する配布バージョンによっては、他のアセンブラやコンパイラもインストールされる場合があります。
  • Devicesサブディレクトリには、ライブラリ、ドライバ、および構成ファイルが格納されています。これらは、すべてのMAXQマイクロコントローラと評価キットのためのアプリケーションを対象としたものであり、さらにこれらと通信するためのものです。
Examplesサブディレクトリには、すべてのMAXQマイクロコントローラのためのコードサンプル(<デバイスのディレクトリ>/xxx_Demo内)、および標準のインクルードファイルとライブラリ(<デバイスのディレクトリ>/api内)が格納されています。

JTAGインタフェースのセットアップ

Serial-to-JTAGアダプタボード

MAX-IDEは、JTAG IEEE規格1149に準拠した専用のJTAGテストアクセスポート(TAP)インタフェースを経由して、MAXQマイクロコントローラのブートローダとデバッグエンジン機能にインタフェース接続されます。このインタフェースは、TMS (Test Mode Select)、TCK (Test Clock)、TDI (Test Data In)、およびTDO (Test Data Out)の信号で構成され、通常、ポート端子で多重化されます。

図1は、すべてのMAXQマイクロコントローラの評価キットに搭載されているSerial-to-JTAGアダプタが、PCのシリアルCOMポートとMAXQマイクロコントローラのJTAGインタフェース間のインタフェース層を提供する仕組みを示しています。

図1. MAXQ用のSerial-to-JTAGインタフェース
図1. MAXQ用のSerial-to-JTAGインタフェース

JTAGインタフェースの信号とケーブル

Serial-to-JTAGアダプタボードは、両端に2 x 5のソケット(0.100"間隔)を備えた10芯リボンケーブルを用いてMAXQ評価キットボードと接続されます。このケーブルで伝送される信号を以下の表1に示します。

表1. JTAGインタフェースの信号
Pin Number Signal Type Signal Name Signal Description
1 Input to MAXQ TCK JTAG/TAP Test Clock
2 Ground GND Ground
3 Output from MAXQ TDO JTAG/TAP Test Data Out
4 Reference VREF Supplied by MAXQ kit to set the reference level for JTAG signals output by the Serial-to-JTAG board
5 Input to MAXQ TMS JTAG/TAP Test Mode Select
6 Input to MAXQ nRST Open-drain drive, connected to MAXQ reset line
7 None KEY Keyed pin for JTAG cable alignment
8 Power VCC5 +5.0V (±5%) supply provided by JTAG board
9 Input to MAXQ TDI JTAG/TAP Test Data In
10 Ground GND Ground

評価キットの接続

使用する評価キットの種類によっては、Serial-to-JTAGインタフェースボードまたは評価キットボード、あるいはその両方で電源が必要となる場合があります。両方のボードを設定するための手順をここで簡単に説明します(表2)。手順の詳細については、評価キットのデータシートを参照してください。Serial-to-JTAGボードまたはMAXQ評価キットボードで使用する電源はすべてDCのみ(センターポストがプラス)であることに留意してください。

表2. 評価キットのセットアップ
Evaluation Kit JTAG Power Supply Kit Power Supply Jumper Settings JTAG Header
MAXQ2000 5V, ±5% None JTAG—Close JH1, JH2, JH3Kit—Close JU11; Close 1+2 on JU1, JU2, JU3 J4

MAX-IDEで使用することができるように、MAXQ評価キットとSerial-to-JTAGボード(図2)をセットアップする方法:

  1. 上述のようにSerial-to-JTAGボードに電源を接続します。
  2. 上述のように評価キットとSerial-to-JTAGボードのジャンパを設定します。キットの特定の機能にアクセスするためには、評価キットボード上でジャンパやDIPスイッチを追加で設定することが必要となることがあります。詳細については、評価キットのデータシートを参照してください。
  3. 2 x 5の10芯リボンケーブルをSerial-to-JTAGボードのP2ヘッダから評価キットボードの対応するヘッダに接続します。コネクタは一方向にのみ接続可能なように調節されています。調節されていない場合は、赤いワイヤが両方のヘッダの同じ端子に接続されるようにしてください。
  4. ストレートシリアルケーブルをSerial-to-JTAGボードのJ1からPCのCOMポートに接続します。
  5. すべての電源をオンにします。
図2. MAXQの評価キットとSerial-to-JTAGボード
図2. MAXQ2000の評価キットとSerial-to-JTAGボード

MAX-IDEでのプロジェクトの処理

新しいMAXQアセンブリプロジェクトの作成

MAX-IDEで新たにMAXQアセンブリ言語のプロジェクトを作成するには、以下の手順にしたがいます。

  1. [MAX-IDE]メニューから[Device][MAXQ JTAG]を順に選択します。
  2. [Project][New Project]を順に選択します。無題のプロジェクトが作成されます。
  3. [Project][Save Project As]を選択します。プロジェクト(.prjファイル)を保存したい場所を選択します。
  4. 新しいアセンブリ言語ファイルを作成するには、[File][New File]を選択します。ファイルにアセンブリコードを入力した後、[File][Save As]を選択し、新しく作成した.asmファイルをプロジェクトディレクトリに保存します。次に、[Project][Add Files]を選択し、新しく作成したファイルを選択してプロジェクトに追加します。
  5. 既存のアセンブリ言語ファイルをプロジェクトに追加するには、単に[Project][Add Files]を選択し、プロジェクトに追加するファイルを選択するだけです。
  6. インクルードファイルは、わざわざプロジェクトに追加する必要はありません。アセンブリプロセス時に自動的に読み取られます。
MAXQ2000のアセンブリファイルの例を以下に示します:

$include (..\api\maxQ2000.inc)

org 0000h

main:
    jump  $

end
上記の$include行は、インクルードファイルの場所によって異なります。$includeorg命令の詳細については、本書の「MAX-IDEアセンブラの使用」の項を参照してください。

アセンブリファイルとインクルードファイルに関する注記
  • すべてのMAXQマイクロコントローラに共通のシステムレジスタ(アキュムレータ、データポインタ、ループ制御レジスタなど)は、MAX-IDEアセンブラであらかじめ定義されています。デバイスごとに異なる周辺機器レジスタは、インクルードファイルで定義する必要があります。標準インクルードファイルは、各MAXQマイクロコントローラ用のMAX-IDEのインストールに含まれています。したがって、上の例で示したインクルードファイルはMAXQ2000用になります。
  • プリプロセッサ命令(等式、定義、マクロなど)が、プロジェクト内のファイルからファイルに持ち越されることはありません。MAX-IDEアセンブリプロジェクトに複数のアセンブリファイルが含まれる場合は、いずれのプリプロセッサ命令またはインクルードファイル命令も、この命令を使用する各アセンブリファイルに含まれていなければなりません。
  • プロジェクト内のアセンブリファイルの数にかかわらず、各アセンブリファイルの末尾に「end」ステートメントを記入する必要があります。
  • インクルードファイルの末尾には、「end」ステートメントを配置しないようにしてください。
  • 複数のアセンブリファイルがプロジェクトに含まれている場合、すべてのファイルのすべての識別子が実質的にパブリックになります。すなわち、いずれのアセンブリファイルのコードも、そのプロジェクト内の他のアセンブリファイルで定義されたルーチンを呼び出したり、ラベルを参照したりすることができるということです。

既存のプロジェクトを開く

以前に作成したMAX-IDEプロジェクトを開くには、メニューから[Project][Open Project]を選択し、開きたいプロジェクトの.prjファイルを選択します。Serial-to-JTAGボードと評価キットボードを正しく接続しないで電源を投入した場合にMAXQ JTAGプロジェクトを開くと、エラーメッセージが表示される場合があります。

プロジェクトを作成して開くと、プロジェクトに含まれるアセンブリコードファイルが左側のパネルに一覧表示されます。ファイル名をダブルクリックすると、以下の図3に示すように、そのファイルが開いてMAX-IDEで編集することができるようになります。

図3. MAX-IDEのプロジェクト環境
図3. MAX-IDEのプロジェクト環境

コードの実行とデバッグ

プロジェクトのコンパイル

プロジェクトファイルをコンパイルするには、メニューから[Debug][Make]または[Debug][Build All]を順に選択し、ツールバーのこれらのコマンドに対応するショートカットボタンをクリックするか、F7 ([Make]と同じ)を押します。MAXQアセンブラが起動します。エラーが発生しなければ、「Compiling...Build Successful」のメッセージが[Messages]ウィンドウに表示されます。構築によって何らかのエラーがある場合、そのエラーも[Messages]ウィンドウに表示されます。

プロジェクトの実行

プロジェクトのコンパイルが正常に完了すれば、以下のいずれかの方法を使用してデバッガでプロジェクトを実行することができます。

  1. [Debug][Run] (F5)を選択すると、JTAGインタフェースを経由して、コンパイルされたプロジェクトコードがMAXQマイクロコントローラにロードされて実行が開始されます。プログラムの実行は、[Debug][Stop] (Shift+F5)を選択するまで、または[Pause]ボタンをクリックするまで、あるいはブレークポイントが現れるまで継続されます。
  2. [Debug][Step Into] (F11)を選択すると、コンパイルされたプログラムがロードされて、ソースコードの最初の行で実行が停止します。
  3. [Debug][Run to Cursor] (Control+F10)を選択すると、コンパイルされたプログラムがロードされて実行が開始されます。実行は、実行ポイントが、編集カーソルの配置された行に到達するか、ブレークポイントに到達するまで(いずれか早い方)、継続されます。カーソルがソースコード行に置かれていない場合にこのオプションを選択するとエラーが生じます。
あらかじめ決められた位置でプログラムの実行を停止させるブレークポイントは、以下の3つの方法のいずれかでセットまたはクリアすることができます。

  • ブレークポイントをセットしたい行にカーソルを移動し、[Debug][Toggle Breakpoint]を順に選択します。
  • ブレークポイントをセットしたい行にカーソルを移動し、ツールバーの停止信号のアイコンをクリックします。
  • 編集ウィンドウで、ブレークポイントをセットしたい行の行番号をクリックします。
ソースコードではない行にブレークポイントを配置することはできますが、これは無効であることに注意してください。MAXQマイクロコントローラでは、一度に設定することが可能なブレークポイントは4つまでです。したがって、[Run to Cursor]を選択した場合、ブレークポイントは1つ使用されたことになり、3つしかセットすることができないことになります。

[Debug][Stop]を選択すると、あるいはツールバーの[Stop]アイコンをクリックすると、プログラムの実行は完全に停止します。しかし、実行が最初の行(Step Into)、カーソル行(Run to Cursor)、またはブレークポイントを設定した行で停止した場合、プログラムは、ステップバイステップモードで実行されることがあります。ステップバイステップモードには、[Pause]ボタンをクリックして移行することもできます。このモードでは、現在の実行ポイントが緑の矢印でマークされ、以下のコマンドを使用することができます。

  • [Debug][Step Into] (F11)、[Debug][Step Over] (F10)、および[Debug][Step Out] (Shift+F10)は、すべてアセンブリデバッグモードでは同じ動作になります。すなわち、1つの命令を実行し、実行ポイントを次の命令に移動します。
  • [Debug][Run]は、上述のように現在の実行ポイントから、次のブレークポイントに到達するまで実行が継続されます。
  • [Debug][Run To Cursor]は、上述のように現在の実行ポイントから、カーソル行に到達するまで実行が継続されます。
[Debug]メニューの[High-Level Debug][Low-Level Debug]の設定は、アセンブリ言語のデバッグモードで実行するときには無効であることに留意してください。

プロセッサのレジスタを表示して編集

プログラムがロードされて、少なくとも1つの命令が実行されると、デバッガを使用してMAXQマイクロコントローラのレジスタを表示して編集することができます。[Window][Show][Registers]を順に選択するとレジスタセットの画面が表示されます。これらの値は、デバッガでコードを実行するにつれて更新されます。書込み可能なレジスタは、その数値フィールドをダブルクリックして新しい値を16進、10進、または2進で入力することによって編集することができます。

MAXQ2000キットに関する注記:LCDドーターボードが取り付けられている場合、レジスタPO0、PD0、PO1、PD1、PO2、PD2、PO3、またはPD3の値を手動で編集しないでください。LCDを取り付けた状態でこれらの端子出力に値を静的に設定すると、LCDディスプレイに損傷を与えるおそれがあります。

プロセッサのメモリを表示して編集

プログラムがロードされて、少なくとも1つの命令が実行されると、MAXQマイクロコントローラの内部メモリを表示して編集することができます。[Window][Show][Memory]を順に選択すると内部メモリの画面が表示されます。画面上のドロップダウンリストから選択することで、コード、データ、またはスタックメモリを表示することができます。メモリは、コードとスタックスペースについては16ビット幅で、データスペースでは8ビット幅で表示されます。データまたはスタックスペースのメモリ値は、メモリの位置をダブルクリックして新しい値を入力することによって編集することができます。

MAX-IDEアセンブラの使用

MAX-IDEには、マルチパスアセンブラが用意されており、これを使用してMAXQのアセンブリ言語でアプリケーションを開発することができます。このアセンブラには、インクルードファイル、シンボリック等式、条件付きアセンブリ、およびマクロの使用が可能なシングルパスのプリプロセッサが含まれています。アセンブラとプリプロセッサは、MAX-IDE環境に完全に統合されています。

マクロとその他のプリプロセッサ命令の使用方法の例については、「Macro」プロジェクト例を参照してください。

一般構文

MAXQアセンブラとプリプロセッサは、どちらも大文字/小文字を区別しません。アセンブリのステートメントは、以下の書式にしたがいます:

[label:]   [opcode   [parameter [, parameter]]]    [;comment]
以下のコードで実例を示します:

main:
move   Acc, A[2]             ; copy A[2] to active accumulator
上に示す「main」ラベルのような識別子には、[a-zA-Z_?$0-9]の文字を含めることができますが、0~9の数字で始めることはできません。識別子は127文字の長さまで入力可能です。

アーキテクチャ、命令セット、アドレス指定モード、およびMAXQマイクロコントローラファミリのコアレジスタの詳細な説明については、MAXQファミリのユーザガイドを参照してください。

ソースファイル

MAX-IDEのプロジェクトウィンドウに一覧表示されるすべてのアセンブリソース(.asm)ファイルは、プロジェクトをコンパイルするときに、ウィンドウに表示された順序でアセンブルされます。リンカは用意されていないため、複数のファイルは、1つのファイルに結合されてからアセンブリされた場合と同様の方法でアセンブルされます。

ソースファイルには、インクルード命令、等式/定義、マクロ、条件付きアセンブリブロック、およびステートメントを含めることができます。いずれのソースファイルも、最後の行はEND命令で構成される必要があります。

end

インクルードファイル

インクルード(.inc)ファイルは、明示的にプロジェクトに追加する必要はありません。インクルード命令によって自動的に読み込まれて解析されます。これによって、インクルードファイルは、そのすべてのテキストがインクルード命令の代わりにソースファイル内にあるものとして解析されるようになります。

(source file):                        (equates.inc):
$include(equates.inc)        --->     MASK1  equ  0FFh
                                      MASK2  equ  0FEh
(resume parsing in source    <---
file)
インクルードファイルには、インクルード命令、等式、マクロ、およびDB/DWデータステートメントを含めることができますが、アセンブリルーチンを含めることはできません。インクルードファイルは必ずしもEND命令で終わる必要はありません。

MAX-IDEには、各MAXQマイクロコントローラの標準インクルードファイルが用意されています。このインクルードファイルが、マイクロコントローラの周辺機器レジスタセット、およびユーティリティROMが提供する関数のアドレスを定義しています。これらのインクルードファイルは、すべてのアセンブル言語プロジェクトで使用することが可能です。これらのファイルは、MAX-IDEのメインインストールディレクトリの下のExamplesサブディレクトリにあります。

定数

ステートメントまたは等式定義の即値として使用するための定数値は、以下の4つの形式のいずれかで記述することができます。

  • 10進数(デフォルト) - 末尾が文字でない、または「d」である。例:10、07d
  • 2進数 - 末尾が「b」である。例:01b、1101101b
  • 16進数 - 0~9の数字で始まって、末尾が「h」である。例:10h、09FFEh
  • 単一文字 - ASCIIのバイト値に変換される。例:「A」
以下の演算子も定数と等式定義でのみ使用することができます。したがって、これらのステートメントの計算は、定数の値が解析される前に、プリプロセスの段階で実行されます。

   move    Acc, #(1+1)         ; 2 : Addition
   move    Acc, #(4-1)         ; 3 : Subtraction
   move    Acc, #(2*2)         ; 4 : Multiplication
   move    Acc, #(25/5)        ; 5 : Division (truncated to integer)

   move    Acc, #(MIN(6,7))    ; 6 : Minimum of two values
   move    Acc, #(MAX(6, 7))   ; 7 : Maximum of two values
   move    Acc, #'A'           ; ASCII value of 'A'

   move    Acc, #(550h | 055h) ; 555h  : Logical OR
   move    Acc, #(550h & 055h) ; 050h  : Logical AND
   move    Acc, #(550h ^ 055h) ; 505h  : Logical XOR
   move    Acc, HIGH(#1234h)   ; 12h   : Select high byte of word
   move    Acc, LOW(#1234h)    ; 34h   : Select low byte of word
   move    Acc, NOT(#0000h)    ; FFFFh : Bitwise negation
   move    Acc, #001h << 7     ; 080h  : Shift left
   move    Acc, #080h >> 7     ; 001h  : Shift right

等式

等式はEQU命令を使用して定義され、通常、定数値が使用される場所で数値に置き換えるために使用されます。等式は、定数について上記で定義したすべての形式と定数演算子を使用することができます。ラベルは定数として認識されません。

ONE equ 01
TWO equ 02

   move    Acc, #ONE
   move    Acc, #(ONE+TWO)
等式は、その後に続く等式の定義でも使用することができます。

ONE equ 01
TWO equ ONE+ONE

定義

定義を使用すると、Cスタイルのテキストのままでの置換が可能となります。余分な処理は必要ありません。インクルードファイルで周辺機器レジスタを定義する場合によく使用されます。置換テキストは1行に限定されます。認識される継続文字はありません。Cスタイルのマクロは認識されません。

#define PO[0] M0[0]

move    Acc, PO[0]           ; Parses as 'move Acc, M0[0]'

データキーワード

DBとDWの命令は、未処理のバイト(ストリング値のバイトを含む)やワードを現在位置の16進ファイルに挿入する場合に使用されます。

db   055h, 0AAh, 055h, 0AAh    ; byte values
dw   0AAAAh, 05555h            ; word values
db   "MAX-IDE Environment "    ; byte value for each char (padded to even count)
これらデータ値はコードスペースに挿入されることに留意してください。このため、2つの命令ステートメントセットの間にDBステートメントを挿入する場合、定義されるバイト数はワードアラインメントのアセンブリエラーを防ぐために偶数でなければなりません。

条件付きアセンブリ

条件付きステートメントによって、特定のブール条件が満たされた場合にのみコードブロックをアセンブルすることができます。以下の形式になります。

IF (<boolean statement>)
   statements
   ...
ENDIF
ブールステートメントは、定数、等式、およびブール演算子(=、!=、<、<=、>、および>=)を使用して定義されます。コードとインクルードステートメントだけが、条件付きアセンブリブロック内で使用することができます。マクロと等式は使用できません。

DEBUG equ 0
DOINC equ 1

IF (DEBUG != 0)
   call RoutineDbg
ENDIF

IF (DEBUG = 0)
   call Routine
ENDIF

IF (DOINC = 1)
$include(defines.inc)
ENDIF

マクロ

マクロによって、関数が呼び出されるたびに、直列的に展開されてアセンブルされるコードブロックを使用して関数を定義することができます。以下の形式になります。

<identifier> MACRO [[PARAM <parm1>] [whitespace AND/OR comma] [<parm2>] ...]
[LOCAL <local1> [whitespace AND/OR comma] [<local2>] ...]
<macro assembly statements, local labels>
...
ENDM
マクロの最も簡単なタイプは、参照されるたびにコードの挿入だけを行うというものです。挿入されたコード内の、等式、定義、およびネストされたマクロ呼出しはすべて正常に処理されます。

ThreeNops MACRO
   nop
   nop
   nop
ENDM

ThreeNops        -->      nop
                          nop
                          nop

マクロはオプションとして1つ以上のパラメータを定義することができます。これは、マクロが参照されるときに渡される値です。これらの値は展開されるコードに貼り付けられます。以下のマクロは、スタックスペースの1レベルを犠牲にして、書込み可能なあらゆるレジスタ(Accを除く)に「INC」関数を提供するパラメータを使用しています。

Inc MACRO PARAM Register
   push    Acc
   move    Acc, Register
   add     #1
   move    Register, Acc
   pop     Acc
ENDM

Inc LC[0]        -->         push Acc
                             move Acc, LC[0]
                             add  #1
                             move LC[0], Acc
                             pop  Acc

マクロにはローカル識別子も含めることができます。この識別子は、マクロの各参照で一意になるように、展開されるコード内で名前が変更されます。

LoopN MACRO PARAM Count
LOCAL L1
   move    LC[0], Count
L1:
   djnz    LC[0], L1
ENDM
上記のマクロでは、マクロが参照されてそのコードが挿入されるたびに、「L1」ラベルの名前が別の一時的な値に変更されています。