マクロの定義して使用している引数名(例:value)と、メインのソースで使用しているラベル名が重複すると問題があるようだ。今後、マクロ定義で使用する引数名は必ずアンダースコア '_' で始まるように変えていこうと思う。(2007/05/11)
common.incの説明にマクロの使用例を追加しました。(2007/04/21)
いやー放置状態ですが、製作を進めないまでも現段階の説明くらい付けようと思います。作ったのはだいぶ前なので思い出しながらになりますけど。(2007/04/18)
ope.incを少し修正しました。最近はPICを使うことが無くてほったらかし状態です。自分で作って使ってるだけなのでモチベーションも上がりません。(2007/02/28)
ファイルも見せられるレベルじゃないですが、公開しておきます。分かる人だけ利用してください。(2006/10/22)
いつまでも非公開のままなのもアレなので暫定公開します。(2006/01/30)
PICマイコンのアセンブラ(MPLABに同梱のMPASM)での開発における手間をなるべく少なくすることを目標に、複雑な処理や一般的な処理などをテンプレート化・関数化していこうという計画です。今のところPIC16系を対象にしています。(2005/08/21)
目次
注意事項
- 製作中なので大幅に方針変更するかもしれません。
- 何度も書きますが、まだ出来てません。
- しばらく手をつけられないと思うので、分かる人だけ使ってみてください。
- 使い方はファイル内のコメントにある程度記述してあります。
詳細情報
基本ルール
ソースの形式
リロケータブル形式のアセンブラを前提に書かれています。例えば変数はUDATAで確保したメモリを前提としてます。
型名
V1やU1というのは引数や戻り値の型名を表しています。
Ux | Unsigned 符号なし変数 |
Sx | Signed 符号あり変数 |
Vx | Value 数値 |
W | Wreg Wレジスタ |
付属の数値はバイト数です。つまりU1であれば、unsigned char。S2であれば、shortと等価の意味です。
引数・戻り値
また、マクロ名の初めの型名は戻り値を意味し、後ろの型名は引数を意味します。
例1)戻り値なし、値1、値2、値3を引数とするマクロです。
memset_V1V1V1 MACRO start, c, n
例2)戻り値はWレジスタ。値と符号無し変数を引数とするマクロです。
W_read_ram_V1U1 MACRO start, idxU1
共通ファイル
テーブルジャンプ、メモリブロック初期化、間接参照、など良く使うサブルーチン的な機能を提供します。
オペレーション
変数フレームワーク(代入、足し算、引き算、掛け算、シフト)や、if〜goto文、if〜elseif〜else文を提供します。
- ope.inc
- 使用方法
割込処理
メイン処理・割り込み処理の記述を簡単に行えるようにします。また、コンテキスト保存・復帰などの基本的な機能を提供します。
- intr.inc
- 使用方法
UART
シリアルポートの設定や送受信の機能を提供します。ボーレートを指定するだけで誤差の最も少ないパラメータ設定をしてくれます。
A/Dコンバータ
A/Dコンバータの設定や読み込み機能を提供します。delay.incもセットで使用しますが、delay.incはまだまだ未完成です。
プログラムメモリ
プログラムメモリの読み書きを行う機能を提供します。
- pgmmem.inc
- 使用方法
EEPROM
EEPROMの読み書きを行う機能を提供します。
- eeprom.inc
- 使用方法
オシレータ設定
PIC16F819や88のような、内蔵オシレータを持つマイコンのクロック設定機能を提供します。内蔵クロックが安定したことを示すフラグはPC上のエミュレータでは再現されないようです、注意。
- osc.inc
- 使用方法
I2C
I2Cのマスターおよびスレーブ用の通信機能を提供します。
利用例
フルカラーLEDを使った自転車のライト
使用テンプレート | common.inc, ope.inc, osc.inc, intr.inc |
ソースリストと回路図はこちら。(2007/01/08)
製作メモ
- アルゴリズムのみのライブラリならば、オブジェクト形式やライブラリ形式で作成しても問題ないだろう。しかし、ハードウェアに依存する部分やアセンブル時に値を決定する場合などに対応させるためには、ソースレベルでのライブラリ化が適当だと考えた。(2005/08/21)
- ソースライブラリ化にあたり、コアな部分は関数化し、そのインターフェイスをマクロとすることで可読性の向上が望めるのではないか。実際にはMPASMのマクロ機能の限界から画期的な可読性とは言えない。プリプロセッサ的なソフトを経由すれば改善できるかもしれないが、そのセットアップまでユーザに負わせると導入のハードルが高くなってしまうだろう。(2005/08/21)
- 関数にするまでも無い処理や非効率的な処理はマクロで対応する。呼び出される関数だけアセンブル対象とする。(2005/08/21)
- 欠点。MPLAB SIMでのソースレベルデバッグがマクロ記述に完全対応していないこと。マクロ内の動きを追うことが難しいです。またマクロ記述されている行にはブレークポイントが設定できないという致命的な問題があります。#define _NOP_ NOP などとして_NOP_にブレークポイントを置くなどとして対応し、最終的に#define _NOP_ としてデバッグコード一括で削るなどの工夫が必要となる。(2005/8/21)
- ライブラリの一時変数に使うメモリの確保方法について悩む。きっかけはPIC16F873のリンカファイル記述。ユーザメモリの設定でDATABANKがなくSHAREBANKのみとなっていたこと。これだとUDATA記述のメモリ定義はリンカで弾かれてしまう。UDATA_SHRとしなくてはならない。873のために全ての一時変数をUDATA_SHRで定義する訳にも行かず。873で使用する場合はリンカファイルを各自でワークフォルダにコピー&書き換えで対応してもらうことで我慢していただく方向で。何かいいアイディア募集中。(2005/08/21)
- if文のインプリメントについて悩む。今のマクロだと if〜goto型なのだが、実際に使ってみるとC言語同様に if(〜) { .... } と書きたい場合が多い。そうなるとブロックの終点アドレスが必要となるため、一つのif文ごとに固有のラベルを自動生成させる必要が出てくる。固有の値をユーザに記述させれば何とかなるだろうが、使いにくくなるとも思う。(2005/08/23)
- 上のif文についてだが、固有の値をユーザに記述させる方式を試しに作ってみた。ネストするの桁をずらして書いていけば見やすいかも。なかなか便利だが、変換されるコードを見るとちょっと悲しくなる。(2005/09/01)
- どーでもいい話だが、プロジェクト名と同じ名前でソースファイルを作ると、ソース個々のリスティングファイルをプロジェクトのリスティングファイルで上書きされてしまうようだ。個々のリスティングファイルはテンプレートプログラミングのソースデバッグで必要なので注意しよう。(2005/09/03)
- if〜else文があるとelseifも欲しくなってくる。ただ、これはいくつ記述されるか分からないだけに対応が難しい。if文のたびに変数を定義する方法を考えている。近いうちに実装してみたい。(2005/10/16)
- if〜elseif〜else文の対応の目処がたった。あんまりやりたくなかったけど、変数をバリバリ使ってif文に番号を振っていく方法で。暇を見て全てのif文に反映させていく予定。(2005/11/17)
- 久しぶりに使ってみて、ope.inc内のif文に記述ミスがあったので修正しました。あとサンプルも現状に合わなくなっていたので直しました。(2007/01/07)
- 前から気になってたif文を修正。ページ切替コードの有無を選べるようにした。ジャンプ先が同じページの場合は従来どおり、「if_U1V1_goto」を用いる。他のページの場合はロングジャンプ版「if_U1V1_lgoto」を用いる。(2007/02/28)
- if〜elseif〜endif文でジャンプ部がページ切替コードを含んでいたのを取り除いた。ローカルジャンプしかありえないので。(2007/02/28)
- まずは出来てる範囲で説明を付けてくことにしようかと。(2007/04/18)