目次PIC入門


ソースプログラムの作り方




ソースプログラムに書かれた内容はアッセンブラーまたはコンパイラーというツールで解釈される言語で書かれなければなりません。MPASMというアッセンブラーを使う場合にはアセンブル言語を使います。C言語で書いた場合にはC言語が使えるコンパイラーが必要です。
コンパイラーでは1行に書かれた文を解釈してそれを実現するための命令群(通常は複数の命令)に展開します。アッセンブラーの場合には各命令を一つずつ書きます。C言語のような言語を使用した方が少ない文でソースコードを作ることができます。ただし、コンパイラーの性能により無駄な機械語が含まれることがあります。自動的に機械語に置き換えるからです。ソースプログラムの作り易さではコンパイラーが有利ですし、メモリーの効率的な利用ではアッセンブラーが有利です。

ソースプログラムを作るのにはメモ帳などのエディターを使って作ることができます。英字は小文字でも大文字でもOKです。
ここではMicrochip社のMPASMを使うことを前提にしてアッセンブル言語でソースプログラムを作る方法について説明します。


ソースプログラムの記法
    ソースプログラムに書く項目と条件を以下に示します。1行に書ける文字数は半角255文字までです。
    ソースプログラムは以下の書式で作ります。

      ラベルニーモニックオペランド;コメント
      ;コメント

    1行をコメントだけにすることもできます。当然、書かなくてもOKです。

    通常はタブを使ってニーモニック、オペランド、コメントの位置をそろえます。その方が見やすいからです。



ラベル必ず左端から書き始めます。
コロン( : )、スペース、改行のいずれかで終了させます。通常はスペースまたは改行を使います。
先頭の文字は英字またはアンダーバー( _ )で始める必要があります。
先頭の文字以外には英数字、アンダーバー、疑問符( ? )が使えます。
最大半角32文字までです。
アッセンブラーの予約語はラベルには使えません。アッセンブルした結果でエラーになった場合にはラベルを変更します。

"B"は"Binary"を表す予約語になっているのでラベルには使えません。他にも沢山あります。
ニーモニック
(命令)
2文字目以降から書き始めます。
同じ行にラベルが書かれている場合にはラベルの後にコロン、1つ以上のスペース、タブのいずれかを書いて区切ります。

通常はタブを使用して命令の位置をそろえます。
使える文字は英字またはアンダーバーです。
オペランド命令と1つ以上のスペースまたはタブのいずれかで区切ります。
オペランドの項目が複数ある場合にはカンマ( , )で区切ります。

見やすさのためにカンマの後にスペースを入れることもできます。
コメントセミコロン( ; )以降にコメントを書きます。
セミコロン以降の文字はすべてコメントと見なされます。
コメントと見なされるのは1行分のみです。
複数行にコメントを記載する場合には、各行のコメント開始の前にセミコロンを付ける必要があります。
日本語を使うこともできます。




アッセンブル疑似言語
    PIC16F84Aの命令(Instruction)は35種類ですが、この命令は実際にPICが動作するときに使用する命令です。
    ソースプログラムでもこれらの命令を書きますが、それ以外にアッセンブラー自身が使用する疑似命令(Directive)というものがあります。これらの疑似命令はアッセンブラーの処理動作を制御するためのものです。MPASMでは58種類の疑似命令があります。
    これらの疑似命令は必要に応じて使いますが、ソースプログラムの最後には必ず END を書く必要があります。
    ENDが無いとアッセンブラーは書かれた内容をソースプログラムとして認識しません。

    以下に良く使われると思われる疑似命令を説明します。

    [ ]省略可能なオプションexprexpression (式)
    < >付加オプション
    スペース
    |いずれかの選択




_ _CONFIGSet Processor Configuration Bits
書式_ _CONFIG<expr>
説明 コンフィグレーションビットの設定をします。
この疑似命令を使用する前にLISTまたはPROCESSORでプロセッサの種類が指定されている必要があります。


DBDeclare Data of One Byte
書式[<label>]DB<expr>[,<expr>,...,<expr>]
説明プログラムメモリ内の1バイトに定数を設定します。


DTDefine Table
書式[<label>]DT<expr>[,<expr>,...,<expr>]
説明連続したRETLW命令のテーブルを作ります。<expr>の値がリテラル値になります。


EQUDefine an Assembler Constant
書式<label>EQU<expr>
説明オペランドで指定した内容とラベルを対応させます。


ENDEnd Program Block
書式END
説明ソースプログラムの終了を示します。(必須)


INCLUDEInclude Additional Source File
書式INCLUDE<<include_file>>|"<include_file>"
説明 指定されたファイルをソースコードの一部として読み込みます。
オペランドで P16F84A.INC を指定すると、PIC18F84Aで使用しているラベル定義が読み込まれます。


LISTList Option
書式LIST[<list_option>,...,<list_option>]
説明 オペランドで指定する内容により各種の設定をします。
list_optionsを指定しない場合はリスト出力をONする機能だけになります。

OptionsDefaultDescription
b=nnn8タブスペースの数を指定
c=nnn1321行のカラム数を指定
f=<format>INHX8Mhex fileの出力フォーマットを指定
freeFIXED自由形式にする
fixedFIXED固定形式にする
mm=ON|OFFONリストにメモリマップを印刷する/しない
n=nnn601ページあたりの行数を指定
p=<type>Noneプロセッサの種類を指定
r=<radix>hex 数値の扱いを指定
hex, dec, oct
st=ON|OFFONリストにシンボルテーブルを印刷する/しない
t=ON|OFFOFF1行はみ出し分を繰り返す/返さない
w=0|1|20アッセンブラのメッセージレベルを指定
x=ON|OFFONマクロを展開する/しない

数字は全て10進数を使用します。


ORGSet Program Origin
書式[label]ORG<expr>
説明 プログラムの開始番地を指定します。
省略時は"0"と見なされます。


PROCESSORSet Processor Type
書式PROCESSOR<processor_type>
説明 プロセッサの種類を指定します。
PIC16F84Aの場合、オペランドで16F84Aを指定します。


SETSet an Assembler Variable
書式<label>SET<expr>
説明EQUと同様な機能ですが、SETの場合は一時的な設定で、他のSETで変えることができます。


IF
ELSE
ENDIF
Begin Conditional Assembled Code Block
Begin Alternative Assembly Block IF
End Conditional Assembly Block
書式 IF<expr>
........
ELSE
........
ENDIF
説明 IF文のオペランドに書かれた条件が真(true)のときだけ、IF文以下の命令がアッセンブルされます。
ELSE文が書かれている場合にはIF文以降ELSE文までの命令が対象になり、ELSE文からENDIFまでの命令はアッセンブルされません。
ELSE文の場合にはIF文の条件が偽(false)のときだけ、ELSE文からENDIFまでの命令がアッセンブルされます。
C言語のように命令(Instructions)への展開はしません。あくまでも、アッセンブル対象にするソースコードのブロックを制御するものです。


WHILE
ENDW
Perform Loop While Condition is True
End a While Loop
書式 WHILE<expr>
........
ENDW
説明 WHILE文のオペランドに書かれた条件が真(true)の場合、WHILE文からENDW文までの命令を繰り返しアッセンブルします。
オペランドの条件がゼロの場合に偽(false)となり、繰り返しが終わります。
WHILE文からENDW文までの間に書ける命令は最大255行です。また、繰り返し回数は256回までです。
C言語のように命令(Instructions)への展開はしません。あくまでも、アッセンブル対象にするソースコードのブロックを制御するものです。



数値および記号
    オペランドにはニーモニックで書かれた命令を実行するための情報を書きます。ここには数値や、ラベル、数式などが使われます。
    以下に数値データおよび数式の書き方を示します。

    数値データの書き方

      MPASMでは数値を表すのに以下に示す5種類があります。
      種 類書 式使用例
      10進数D'<digits>' または .(ドット)<digits>D'100' または .100
      16進数H'<hex_digits>' または 0x<hex_digits> または 0<hex_digits>HH'A8' または 0xA8 または 0A8H
      8進数O'<octal_digits>O'567'
      2進数B'<binary_digits>B'011001'
      ASCIIA'<characters>' または '<characters>'A'ABC' または 'ABC'


    演算記号の書き方

      MPASMで使用できる演算記号は沢山ありますが、良く使う演算記号のみを以下に示します。
      記 号意 味使用例
      $現在のプログラムカウンタの値 goto $+3
      現在のプログラムカウンターから3つ先のアドレスにジャンプする。
      ( 処理をブロック化する
      優先演算など
      (length+1)*256
      lengthレジスタの1を加えた後、256倍する。
      )
      *かけ算a*b
      /わり算a/b
      +足し算a+b
      -引き算a-b
      highアドレスの上位バイト movlw high TABLE
      TABLEというラベルが付いているプログラムメモリアドレスの
      上位バイト(有効なのは5ビット)をWレジスタに格納する。
      page制御をしているPICで該当ラベルのページを求める時
      などに使用します。
      lowアドレスの下位バイト movlw low TABLE
      TABLEというラベルが付いているプログラムメモリアドレスの
      下位バイトをWレジスタに格納する。
      >=大きいか等しい if a>=b
      a が b と同じかまたは大きければtrue。
      >大きい if a>b
      a が b より大きければture。
      <=小さいか等しい if a<=b
      a が b と同じかまたは小さければtrue。
      <小さい if a<b
      a が b より小さければture。
      ==等しい if (a==b)
      a と b が等しいときにtrue。
      !=等しくない if (a!=b)
      a と b が等しくないときにtrue。
      &ビットのAND flag=flag&CHECK_BIT
      flagレジスタとCHECH_BITの内容をビット単位でANDする。
      |ビットのOR flag=flag|CHECK_BIT
      flagレジスタとCHECH_BITの内容をビット単位でORする。
      &&論理AND if (a==b)&&(c==d)
      a が b でかつ c が d であったらtrue。
      ||論理OR if(a==b)||(c==d)
      a が b と同じかまたは c が d と同じであったらtrue。
      !論理否定 if !(a==b)
      a と b が等しいときにfalse。