PICアセンブラコードのファイルを分割する ~アセンブラとリンカ~

この文章は前回の話
http://blogs.yahoo.co.jp/gomisai/1557240.html
の続きです。今回はソースコードからリンカに渡すことができる形式であるオブジェクトファイルを生成する方法と、生成されたオブジェクトファイルをリンカでHEXファイルにまとめる方法を説明します。

全部説明するのも大変なのでしっかり説明されているサイトの補足のためのメモと言うことで。ただし、リンク先の説明はMPLABのバージョンが少々古いようですので、多少手順は違うかもしれませんが、大筋では同じでしょう。
電子工作の実験室 リンクの仕方
http://www.picfun.com/asm10.html

ちなみに、私の使っているMPLAB IDEのバージョンは7.40.00.00です。

全体の流れ
大まかな手順としては

1.ソースコードを書く
2.MPASMWIN.exeを使ってオブジェクトファイルを生成
3.作成したオブジェクトファイルとリンカースクリプトファイルmplink.exeでリンク

の3つの段階になります。1.については前回説明したとおりですので、今回は2.と3.を。
MPLAB IDEから行う方法は電子工作の実験室さんでも説明されていますし、なんとなくわかると思うのでMPLAB IDEから呼び出されている実行ファイルについて少し書きましょう。

オブジェクトファイルの生成
MPASMWIN.exeはMPLAB IDEをデフォルトの設定でインストールしている場合は、
C:\Program Files\Microchip\MPASM Suite
にあるはずです。ためしに実行してみてください。GUIのウインドウが立ち上がります。
分割しないソースコードを普通にアセンブルする場合は、Brows...でアセンブルしたいファイルを選択して、Assembleを実行します。ふだんMPLAB IDEからアセンブルを実行している人はなじみがないかもしれませんが、MPLAB IEDからアセンブルする場合でも内部ではこのプログラムを呼び出しています。
分割する場合は、このウインドウの右のほうにあるGenerated Fileの項目のなかのObjectにチェックを入れます。この状態でAssembleするとリンカに渡すことのできるオブジェクト形式のファイル(拡張子.o)が生成されます。リンクするASMファイルはすべてこの方法でオブジェクトファイルにします。

リンクの方法
リンカであるmplink.exeも同様に、MPLAB IDEをデフォルトでインストールしていれば、
C:\Program Files\Microchip\MPASM Suite
にあるはずです。ただし、こちらはCUIのコマンドラインのプログラムなので、コマンドプロンプト(MSDOSプロンプト)から実行しなければなりません。
電子工作の実験室 リンクの仕方
http://www.picfun.com/asm10.html
の下のほうに「(参考)MPLINKの詳細」という項目があると思うので、コマンドの引数はそれを参考にしてください。個々で唐突に「MPLINKを動かす為のコマンドをまとめた起動用ファイルでバッチ処理に使う(拡張子は .lkr)」と言う言葉が出てきますが、これはリンカースクリプトファイルのことで、
C:\Program Files\Microchip\MPASM Suite\LKR
の中にあるはずです。対応するデバイスのリンカースクリプトファイルを指定してください。

PICアセンブラコードのファイルを分割する ~ファイルの記法~

この文章は前回の話
http://blogs.yahoo.co.jp/gomisai/1497479.html
の続きです。今回はソースコードを分割したときの各ファイルの記法について書きます。

このときに使わなければならない擬似命令の説明は以下のサイトの説明が読みやすいと思います。
電子工作の実験室 リロケータブルな書き方
http://www.picfun.com/asm09.html

擬似命令の意味は上記のサイトを参考にしてもらうとして個々の擬似命令に関して、使いどころと機能に関する補足を。

ほかのファイルのサブルーチンやレジスタはそのままでは使えない
同一のファイル内にあるルーチンは通常の手順でCALLGOTOをすることができますが、別ファイルにあるルーチンに対してはそのままではアクセスできません。
同様に、あるファイル内で領域を確保した汎用レジスタも別ファイルからはそのままアクセスはできません。
これを使えるようにするための擬似命令がGLOBALEXTERNです。
GLOBALはそのファイル内で定義したルーチン/レジスタをほかのファイルから呼び出されるものであることを宣言します。
EXTERNは、GLOBALとは逆にそのファイル内で呼び出しているルーチン/レジスタがほかのファイルで定義されたものであると言うことを宣言する擬似命令です。

プログラム領域の割り当て
プログラムを複数ファイルに分割しない方法では、プログラム領域のアドレス指定にORG擬似命令を使っていたと思いますが、分割する場合はORGは使えません。代わりにCODE擬似命令を利用します。
この擬似命令を使って番地を指定することもできますが、通常は番地を指定するのはリセット時の0番地と割り込み時の4番地のみで、それ以外の(普通の)モジュールではCODEの後のアドレスは省略します。省略すると、リンカが自動的に適切なアドレスを割り当てる処理をしてくれます。

データ領域の割り当て
汎用レジスタの確保にどの擬似命令を使っていたかは人によって異なると思います。多くの人はEQUを使っているかと思いますが、CBLOCKを使っている人や分割していなくてもUDATAを使っている人もいると思います。
私の推奨はUDATAです。プログラム領域に対するCODEと同様に、アドレスは省略するのが普通です。省略した場合、ほかのファイル内で確保されているデータ領域と被らない様に、リンカが汎用レジスタを自動的に割り当ててくれます。
UDATAにはUDATA_OVRUDATA_SHRという亜種があります。
まず、UDATA_OVRについて、この擬似命令はほかのファイル内でUDATA_OVRで確保されたデータ領域があった場合に、割り当てるレジスタを被らないように”しません”。これを用いることにより使用するレジスタの数を節約することができるので、一時レジスタを確保する場合に使います。なお、同一のUDATA_OVRで確保された領域は互いに被ることはありません。
UDATA_SHRは、データ領域を確保する際に共有データ領域からデータを確保します。共有データ領域のレジスタはどのバンクからでもアクセスすることができます。したがって、アクセスする際に後述するBANKSELを利用する必要がなくなります。ただし、PICの種類により共有データ領域が存在しないものもあるので注意が必要です。
以上の3つに関して、ひとつの擬似命令の中で定義されたラベルは連続したアドレスに確保されることになります。したがって、ひとつのUDATA他で定義される一連のラベルは複数のバンクにまたがることはできません。

分割アセンブルによる弊害
CODEUDATAを利用することにより、明示的にアドレスを指定しなくてもリンカが自動的に割り当ててくれるため、ソースを書くのが容易になります。一方、ソースを書いている段階ではアドレスが確定していないということは欠点でもあります。
レジスタ/ルーチンのバンク/ページがそれぞれバンク0/ページ0に収まっているサイズの場合はともかく、そうでない場合はバンク/ページの特定ができなくなるためです。これに対処するための擬似命令が、BANKSEL/PAGESELです。

上であげた「電子工作の実験室 リロケータブルな書き方」のリンクリンク先の下のほうからソースコードを分割したときのサンプルコードがダウンロードできます。ダウンロードして眺めれば大体理解できると思います。

今回はここまで、次回は「アセンブラとリンカ」について書くつもりです。

PICアセンブラコードのファイルを分割する ~分割のすゝめ~

最近雨後のたけのこのごとくPICマイコン関連の入門書が発売されています。私がPICマイコンをはじめたのはほんの数年前ですが、当時と比べても比べ物にならない印象を受けます。
また、PICマイコン入門のためのWebページも数多く存在するので、特に私がPICマイコン入門のための文章を書くことや、PIC開発環境について書くこともなかろうと思っていたのですが、アセンブラでソースコードを複数のファイルに分割する方法について説明しているサイトや書籍があまりないように感じたので簡単なメモ程度に書こうと思います。
したがって、前提として分割しない普通のPICのアセンブラでのプログラミングのやり方がわかっている人を対象としていますのであしからず。

ソースの分割の意義
・コードの使い回しが容易になる
・コードの可読性が上がる
通常ソースコードを分割するときにはある種の機能のまとまりごとに一つのファイルにまとめます。例えば、秋月電子通商などで売っているキャラクタLCDの制御ルーチンとしては、LCDの初期化、カーソルの移動、キャラクタデータの書き込みと言ったサブルーチン郡を書くでしょう。これらのサブルーチンをメインルーチンの書いてあるファイルとは別のファイルに保存しておけば、キャラクタLCDを使うほかの回路のためのプログラムを書くときにキャラクタLCD関連のサブルーチンだけを書いてあるファイルを持ってくることにより簡単に使いまわすことができます。
上記の意味では、以前に書いたプログラムからコピー&ペーストするだけでもよいと言う人もいるかもしれませんが、ほかにも可読性が上がると言う利点もあります。
他人のマイコンのプログラムを読む場合、まず最初に全体でどのような機能を果たしているのか理解してから、各部分の制御の方法を細かく見ていることになると思いますが、プログラムを書く段階から機能ごとに分割するよう心がけておけば、後から確認がしやすくなります。

今回はここまで、次回は「各ファイルの記法」について書くつもりです。

[参考文献]
電子工作の実験室 MPASMの使い方
http://www.picfun.com/asmframe.html
くまさんのホームページ 電子工作
http://www5b.biglobe.ne.jp/~kuma3/html/homemade/pic_soft.html
人力検索はてな
http://q.hatena.ne.jp/1091338800

コール・クライネス 第41回演奏会


ものすごく激しい雨の中、東工大が誇る混声合唱団コール・クライネスの演奏会を聞きにいきました。

会場は錦糸町でしたがものすごく迷いました。雨の中。ほんとに迷いました。18:30開場、19:00開演で、開場前にJR錦糸町駅についたのに、迷いに迷ってずぶぬれになりながらコンビニの店員さんに道を聞いてやっとたどり着いたのが開演直前。
なにが錦糸町駅北口より徒歩3分だよ、20分以上さまよったよ。まぁ、事前に場所を確認しとけば間違いなく3分以内についたけどさ。

それはともかく、内容はすごかったです。さすが日本一の学生合唱団。
なんていうか、音として迫力と深みがありますね。うまく表現できませんが、鈍器でガツンとやられたようなというか、体の内部に爆発物を仕掛けられたかのようなそんな感じでした。

やはり人間の躯は、最高の楽器であると感じました。
しかし、ほかの楽器がすごくなかったわけではありません。特に今回びっくりしたのがパイプオルガンです。ってか、でかいっすよパイプオルガン。
ホールに入ったときからあったはずなのに、パイプオルガンのところに人が行くまで意識の中に入ってきませんでしたよパイプオルガン。

いやぁ、本当によかったので今日の日記はオチはなしです。クライネスの皆さん、本当にお疲れ様でした。

フォントなに使ってますか?

結論から先に書きますと、コーディングをするときに使うフォントは0とOの見分けがつきやすいものを使いましょう。と言う話です。

キーボードの位置的に言っても思いのほか0とOは打ち間違えやすいポジションにあります。
特にoが小文字なら0と見分けがつきますが、私のようにpicマイコンのアセンブラを書くに当たってCaps Lockを固定している場合はっきり言って見分けがつきません。

とはいえ、こんなことは昔からわかりきっているので現在のフォントの多くは(特にコーディングに使う等幅フォントは)0のわっかの中にスラッシュやドットが入っていて見分けがつくように作られているものがほとんどです。今まで気にしたことがない方のほとんどのデフォルトのフォントは「MS ゴシック」という0とOの見分けのつきづらいものであると思います。なので、この際ほかのフォントに乗り換えて見ませんか?

最近というほどではありませんが、使っている人が多いと思われるのが「Osaka-等幅」です。以下のサイトで配布されています。
http://osakattf.hp.infoseek.co.jp/

ちなみに私が使っているフォントは「Bitstream Vera Sans Mono」というフォントです。OpenOfficeをインストールしたらついてきたフォントなのですが、これがなかなか読みやすいフォントでした。
OpenOfficeのダウンロードは以下のサイトから。
http://ja.openoffice.org/

フォントだけがほしい方は以下のサイトからダウンロードしてください。(英語)
http://www.gnome.org/fonts/

ただ、上記の「Bitstream Vera Sans Mono」にも些細な問題がありまして、配布元を見た方は大体想像がつくかと思いますが、日本語フォントが含まれていません。最近私はコードの中にはアスキーコードしか書かなくなったのであまり気にならないのですが、普通に考えればコメントの中は日本語を書きたいと思うのが人情でしょう。

何とかする方法としては3つぐらいありまして。
 ・欧文フォントと日本語フォントを別々に指定できるテキストエディタを使う。
 ・Windows 2000/XPのFont Link機能を使う。
 ・日本語フォントを含むほかのフォントと合体させて新しいフォントを作る。
です。

1番目は説明の必要はないですね、そのままです。ただ、MPLAB IDEにはそんな機能はないのでMPLAB IDEが使いたい人は2番目か3番目を選ぶことになります。

2番目はレジストリをいじるので私はやってみたことがありません。やりたい人は以下のサイトを参考にやってみてください。
http://blue.ribbon.to/~akene/fontlink.htm

3番目の方法はTTEditというソフトを使うのが簡単です。以下のサイトからダウンロードできます。
http://musashi.or.tv/ttedit.htm
購入すると5,000円かかりますが、30日間試用ができるのでその間にちょちょいとやってしまえばお金はかかりません。

レビュー:となりの801ちゃん

内輪ねたばかり書いているのもよくないので、今世間で大流行している「となりの801ちゃん」という漫画についてでも書きましょう。
近所の書店では手に入らないこともあるほど有名な本なのでレビューするまでもないかもしれませんが(笑)
ま、社会の流行に乗り遅れている一部の方のために、一応念のため参考リンクをあげておきましょうね。
http://indigosong.net/
http://www.ohzora.co.jp/sp/801/

内容はオタク男子と腐女子の恋愛をコミカルなタッチで描かれた秀作です。私のようにオタクや腐女子と言った類の人たちとはまったく接点を持ち得ない一般人にこそぜひ読んでいただきたいと思える一品です。

至ってノーマルな私から見ても、少しだけこんな彼女がいてもいいんじゃないかなぁ・・・とか思ってしまう側面もあります。
あ、ちなみに私には今はおろか生まれてこの方彼女なんか存在したことはありませんよ

それはともかく、私に腐女子彼女がいたらどうでしょうね。
やはり休日のデートは秋葉原でしょうか。

 ~ 山の手線車内 ~
「そういえば、秋葉原デパート今年末で閉店するらしいね。」(参考:http://slashdot.jp/articles/06/12/03/2350206.shtml
「ねー。ヨドバシカメラも建ったし、最近あわただしいよね。」
「あ゛~、これでもう伊呂波でとり丼食えなくなるのか。」(参考:http://food6.2ch.net/test/read.cgi/don/1135163003/)
「昼ならだるまぁラーメンでいいじゃん。基盤屋さんから近いんでしょ?」
「基盤屋いうなって。それに歩き回ると米が食べたくなるの。」
「で、五味斎はアスカとレイのどっち側に座るの?」
「それなんて心理検査?」
 ~ 秋葉原改札口 ~
「じゃあ、一時にだるまで!」
「けっきょくだるまなんだ・・・」
彼女はとらのあな・アニメイトコース。私は秋月・千石コース。彼女とは一時お別れだ。

って、ここまで腐女子の彼女との妄想デートを書いてみましたが、これじゃあフツーの女の子とのフツーのデートですね。
やっぱり私は一般人なので腐の人とのデートなんか想像もつきません。

と言うわけで今日はこの辺で、Yahoo!動画でアニメでも見たあとお風呂にでも入ろうと思います。
私が今鬼はまりなのが「幻想魔伝 最遊記」個性的で格好いい四人の主人公の絆が物語の魅力を際立たせ、熱狂的ファンを獲得したテレビシリーズの第一弾なんですよぉ~。もうはじめのほうの話は見れなくなっちゃってますけど、ぜひ見てくださいね。
http://streaming.yahoo.co.jp/p/t/00173/v00388/
でも、作画が時々変な気がします。三蔵とか・・・

理想のOPアンプとの幸せなクリスマス




理想のと聞いてOPアンプしか思い浮かびませんでした。
元ネタはこちらです。
http://pya.cc/pyaimg/pimg.php?imgid=35618
http://pya.cc/pyaimg/pimg.php?imgid=36046

残念ながら世の中には理想のOPアンプも理想の恋人も存在しません。
それどころか、あらゆる面で理想に近いと言うことも望み薄です。

何らかの特性を重視した素子の選択をするとほか特性がおろそかになる。あちらを立てればこちらが立たず。難しいところです。
しかし。ちょっと待ってください。あなたは本当にそんな特性を求めているのですか?あなたの求めるものは理想上でしか実現できないものなのですか?

否!断じて否である!!

むしろ少しぐらい至らないところがあるからこそ、いや、欠点がたくさんあるからこそ、その子の長所が引き立つんだろうが!!
そう・・・欠点は長所を引き立てるんだ・・・欠点があることは悪いことじゃない・・・むしろ欠点多ければ多いほどいい・・・むしろ欠点だらけでいい!

あれ?ってことは俺最強じゃね?

と言うわけで秋葉原で見ることのできる子達の名前とお値段を!

・NJM4580 \50
・OP07    \100
・LM358   \20
・LMC662  \150
・LF412   \150
・五味斎  priceless ※ジャンク品につき質問・返品不可

今日の無駄話

大積層を見に行ったはずが、後輩と無駄話をしてしまった件のうち、電子工作っぽい話をいくつか。

1.エレキの一年生にしたありがたくないお話。
エレキの二年生に出してもらった最初の課題は、Hブリッジだそうです。
とはいえ、なんに使うHブリッジなのかよくわかってない感じだったので、まずは仕様をはっきりさせるところからはじめたらいかがか?と言っておきました。結局のところ
 → 自分の作ろうとしているものをちゃんと理解する。
 → 必要な素子の必要とされるパラメータがわかる。
 → データシートが読めるようになる。
と言うことが大事なんでしょう。極端な話、単にHブリッジっていうだけなら、ブレットボードに1815と1015をぷすぷすするだけでもHブリッジなんだから。まぁ、まずはドライブする負荷の決定からでしょうね。

2.OPアンプの選び方。
とりあえず、秋月で売ってるOPアンプぐらいは一通り眺めてもバチは当たらないでしょう。
http://akizukidenshi.com/catalog/items2.php?c=opamp&s=popularity&p=1&r=1&page=
よく使うやつについて一言ずつ。
 ・NJM4580  GB積が大きい。電流も取れるらしい。
 ・OP07   入力オフセット電圧が低い。バイポーラOPアンプとしては入力バイアス電流も小さい。
 ・LM358   安い。単電源。
 ・LMC662  単電源。出力レールtoレール。CMOS。
 ・LF412   J-FET入力。J-FET入力OPアンプとしては入力オフセット電圧が低い。

3.PICでI2Cマスタ
PICでI2Cを使う場合、スレーブならともかく、マスタとして使うのならMSSPモジュールを使うより下位のSSPモジュールのほうがわかりやすいです。SSPモジュールを内蔵したPICのデータシートのうち、日本語で書いてあるのはPIC16C7Xのデータシートですかね。
http://ww1.microchip.com/downloads/en/devicedoc/16c7xbj0.pdf

4.PICのアセンブラの擬似命令
fill擬似命令。nopを10個とか書くとき
とか書けば一行でかけます。まぁ、それだけ。
        fill    (nop),D'10'
デバイスのインクルードファイルをインクルードすれば、ifdef擬似命令を使えば汎用のPIC12/16初期化ルーチンがかけます。

        include "PIC16F84A"

        ifdef   CMCON
        banksel(CMCON)
        movlw   B'00000111'
        movwf   CMCON
        endif

PIC16F648AのようにCMCONがあるデバイスではifdef~endifまでがアセンブルされますが、上記のようにPIC16F84AのようにCMCONが存在しない(言い換えるとインクルードファイルの内部で定義されていない)デバイスでは初期化を行いません。ま、便利だと思う人もそう思わない人もいると思いますが。

あとは、macro擬似命令だとかwhile擬似命令だとか。しかし、あまりやりすぎると自分にしか読めないコードになる諸刃の剣。

明日は、秋葉に行こうとと思います。

大積層を見に行ったはずでした。

今日は、以前所属していたものつくりサークルの電気自動車の車体の型の製作を見学しにいきました。
の、はずでしたが結局差し入れを渡した後は自分の後輩とだらだらしゃべって結局大積層自体はこれっぽっちも見ずに帰りました。

「あれ?ひょっとして大積層終わっちゃった?」
「とっくに終わりましたよ。」

俺は何しにいったんだろう・・・結局、写真の一枚も取れなかったとさ。

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRScilabmachikaneyamaKKRPSoCOPアンプPICCPA強磁性モンテカルロ解析常微分方程式トランジスタode状態密度インターフェースDOSPDS5022ecaljスイッチング回路定電流半導体シェルスクリプトレベルシフト乱数HP6632A温度解析ブレッドボードI2CR6452A分散関係トランジスタ技術可変抵抗確率論数値積分反強磁性セミナー非線形方程式ソルバ絶縁バンドギャップ熱設計偏微分方程式バンド構造GW近似カオス三端子レギュレータLEDフォトカプラシュミットトリガISO-I2CA/DコンバータLM358USBカレントミラーTL431マフィンティン半径PC817C数値微分アナログスイッチ発振回路サーボ直流動作点解析74HC40532ちゃんねる標準ロジックチョッパアンプLDAアセンブラFFTbzqltyイジング模型ブラべ格子開発環境補間量子力学電子負荷BSchパラメトリック解析単振り子基本並進ベクトル熱伝導繰り返しGGAMaximaTLP621ewidthSMP相対論抵抗位相図ランダムウォークスピン軌道相互作用六方最密充填構造不規則合金FETコバルト失敗談QSGWcygwinスレーターポーリング曲線スイッチト・キャパシタラプラス方程式gfortranキュリー温度状態方程式条件分岐格子比熱TLP552LM555TLP521三角波NE555過渡解析FXA-7020ZRWriter509テスタ詰め回路MCUマントルダイヤモンドQNAPデータロガーガイガー管自動計測UPS井戸型ポテンシャルawk第一原理計算仮想結晶近似ブラウン運動差し込みグラフ平均場近似fsolve起電力熱力学OpenMPスーパーセル固有値問題最適化最小値VCAシュレディンガー方程式VESTAubuntu最大値面心立方構造PGAOPA2277L10構造非線型方程式ソルバ2SC1815fccフェルミ面等高線ジバニャン方程式ヒストグラム確率論マテリアルデザイン正規分布結晶磁気異方性interp1フィルタ初期値ウィグナーザイツ胞c/aルチル構造岩塩構造スワップ領域リジッドバンド模型edeltBaOウルツ鉱構造重積分SIC二相共存ZnOquantumESPRESSOCapSensegnuplotmultiplot全エネルギー固定スピンモーメントFSM合金ノコギリ波フォノンデバイ模型ハーフメタル半金属TeXifortTS-110不規則局所モーメントTS-112等価回路モデルパラメータ・モデルヒストグラムExcel円周率GimpトラックボールPC直流解析入出力文字列マンデルブロ集合キーボードフラクタル化学反応三次元Realforce縮退日本語最小二乗法関数フィッティング疎行列シンボル線種ナイキスト線図陰解法負帰還安定性熱拡散方程式EAGLECrank-Nicolson法連立一次方程式P-10クーロン散乱Ubuntu境界条件MBEHiLAPW軸ラベルトランスCK1026MAS830L凡例PIC16F785LMC662AACircuit両対数グラフ片対数グラフグラフの分割specx.f

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ