23:36PICマイコンは時代を追ってベースライン→ミッドレンジ→ハイエンドと進化してきたが、日本で有名になったPIC16F84がミッドレンジのせいか、ベースラインPICに関する日本語の情報が少ない。そのためミッドレンジに慣れた者がベースラインを使おうとして戸惑うのをたまに見かける。そこで、ミッドレンジからベースラインへのマイグレーションを念頭に、この2つの違いを解説したい。ベースラインを使う意味があるかは微妙な所だが、安さで10F200や16F57を選ぶこともあるだろう。現在秋月で35円、aitendoで30円。自分の知る限り最安のマイコン。I/Oピンが20本あり、3.5円/ピン。自分の知る限りI/Oピンあたり価格が最安のFlashマイコン。比較の前に、まずベースラインとミッドレンジの見分け方について。型番で簡単に見分けられるのだが、これが知らないと分かりづらい。自分も最近まで知らなかった。PIC32MXとあるがこれらは単純なので割愛する。Fの部分がLFやCやHVのものもあるが割愛する)PICを分類するのにこの先頭の数字で分類されるのが一般的だが、実はこの数字はベースラインとミッドレンジの区別には役立たない。12Fがベースライン、16Fがミッドレンジであるとする誤った記述をたまに見かけるが注意が必要だ。(ただしハイエンドを見分けることはできる。18Fがハイエンドだ。)ではどこで見分けるかというと、英字の次の桁。これが(現在のところ、ごく一部の例外を除き)2か5ならばベースラインである。(また、ベースラインならば2か5である)例えば10F222、16F54、12F509はベースラインであり、10F322、16F84、12F609はミッドレンジである。(初期に命名法が確立していなかったと思しきPIC16C55Xというミッドレンジが存在する)また後半の数字が1始まりで4桁以上ある12F1*,16F1*はEnhancedミッドレンジである。現在のところ数は少ないが、Enhancedベースラインというものも存在する。型番の規則はベースラインと同じだ。16F570の4つのみである。先頭の数字10,12,16は、ピン数に対応している。6ピンが10、8ピンが12、14ピン以上が16だ。(ただし通常のI/Oピン以外に特殊機能のピンがある場合これに従わない。例:12F529T39A)(また今後8ピンも16Fになるようだ。16F18313)(ハイエンドの8ピンはどうなるかというと、今のところ存在しないが、実は発表だけされて発売されなかった18F010/020がある)以下機能の違いを見ていく。割り込みミッドレンジで追加された機能で最も重要と言える。割り込みを使ったコードは全てポーリングに書き直すしかない。割り込みがどうしても必要ならミッドレンジを使うしかないし、そうでなくとも割り込みの方が簡単に書けるならミッドレンジを使うのが身のためだ。するとウォッチドッグタイマ(WDT)によるリセットで割り込みの代用ができるかもしれない。タイマーのオーバーフローベースラインもミッドレンジもTMR0の機能は基本的には同じである。ベースラインには割り込み機能が無いのに伴ってオーバーフローフラグも無い。割り込みを使っていなくてもオーバーフローフラグを使っていたプログラムは書き直しが必要だ。簡単な対処法として、TMR0を7bitのタイマーと考えて、最上位bitをオーバーフローフラグの代わりに使う方法が考えられる。タイマーが1周する前にチェックする必要がある点を除けば同様のプログラムが使える。クロック単位できっかり合わせたいなら例えばこんな感じ。PCL,Fnopnopnopwhen:スリープからの起床ベースラインもミッドレンジもSLEEP命令によるスリープ機能は持っているが、起床時の動作が異なる。ミッドレンジではスリープから起床するとSLEEP命令の直後から実行を再開する。(加えてその前に割り込みを掛けることもできる)それに対しベースラインではスリープからの起床はリセットと同等であり、SLEEP命令の直後から実行する機能は無い。先頭にパワーオンリセットとスリープからの起床を判別するコードを書いて分岐する必要がある。命令ベースラインからミッドレンジで追加された命令はわずか4つのみである。RETFIEまた、命令一覧から消えた命令が2つある(実はミッドレンジでも使える)。OPTIONその他の命令は、機能は同じだがアドレス指定のビット数が増えている。これによる違いはメモリ構造の項にて。これらの追加命令の対処法を示す。・ADDLW比較的簡単。RAM1つ使用、2命令増で次のようにできる。temp,Wそもそも加算の順番を変えるだけで済むこともあるだろう。加算が必要かと思いきやIORLWが使える状況もたまにある。・SUBLW単純に置き換えようとするとWの退避が面倒なことになる。temp2,W順番を変えて事前に被減数を用意しておくのがよいだろう。minuend,Wとできる。定数からの減算なら準備は1回でよいためコア部分は同命令数にできる。・RETURNベースラインには値を返さないRETURN命令が無く、RETLWしか無かった。Wの値を使いたければ、適当な場所に保存しておく必要がある。w_buf,WWを保存しておく必要が無ければ適当な値を返すRETLWをそのまま使えばよい。0」のマクロとして登録されているので、何も考えず「RETURN」と書くだけでよい。RETURN命令を使ったミッドレンジ向けコードが書き換えずそのまま動いてしまうことに注意が必要である。・RETFIE割り込み機能が無いので当然ながらどうしようもない。メモリ構造の違い・RAM(ファイルレジスタ)のマッピングRAMのバンク分けがミッドレンジ128バイトごとに対しベースライン32バイトごとと、バンクごとの容量が1/4しかなかった。(対応してファイルレジスタを指定する命令すべてでアドレス指定のbitが7→5と少ない。)また連続で使えるメモリ量はミッドレンジの80バイトや96バイトに対しベースライン16バイト(bank0は+数バイト)。ミッドレンジからベースラインへ移行する場合はメモリ量が足りたとしてもバンク切り替えが増えるのに注意が必要である。間接アドレッシングで16バイトを超えるメモリを連続的に扱いたいときは、FSRの4bit目を常にセットするように扱えばよいので、ミッドレンジの80バイトと96バイトの領域が混在する複雑な構造よりだいぶ楽である。バンク共通のメモリの位置も異なり、ミッドレンジでは各バンクの最後16バイトであるが、ベースラインは前半16バイトのうちSFRでないあまり部分がバンク共通となっている。図にまとめると以下のようになる。注:大抵の機種はこの構成に従っているが、そうでないものもある。古いものが異なるのだろう。16F84Aはベースラインに似た割り付けである。図は可能な最大量を示した。実際に実装されているメモリ量がこれより少ない場合、データシートの図はこれと異なる。ベースラインのバンク共通メモリの量はSFRの量に依存するため、機種により異なる。12F509では9バイト、16F526では3バイトである。・特殊なレジスタマッピング特殊なレジスタにTRISxとOPTIONがある。この2つは、ベースラインでは通常のレジスタとしてマッピングされていない。その代わりに、「TRIS」命令と「OPTION」命令でWの内容を書き込む仕組みになっている。書込みのみで読み出しはできないため、あとで値が必要になるなら適当なRAMに保存しておく必要がある。命令の使い方は、OPTIONはオペランドをとらず、1つしかないOPTIONレジスタにWを書き込む。optionミッドレンジで同等の動作は、(適切なバンクになっている前提で)こうである。OPTION_REGTRISは、オペランドにI/Oポートレジスタ(のアドレス)をとり、対応するTRISxレジスタにWを書き込む。PORTAミッドレンジではこう。TRISA・FlashROMFlashのページ分けは注意が必要である。ミッドレンジの2048(0x800)ワード毎に対し、ベースラインでは512(0x200)ワード毎にページが分けられている。ミッドレンジでは「0x800の壁」と呼ばれているものはベースラインでは0x200の壁となる。これに対応してGOTO命令では飛び先のアドレスが9bit指定できるのだが、CALL命令では飛び先のアドレスは8bitしか指定できない。その分のアドレス1bitを別の場所で指定できるわけでもないため、CALLの飛び先のアドレスは各ページの前半256命令のみで、後半256命令にはCALLで飛ぶことはできない。ミッドレンジではGOTO・CALLとも同じく11bitになりこの状況は解消されているので、ベースライン特有の制限である。CALLで飛べるのがページ前半のみということは、後半はサブルーチンに使えないのかというと、そうでもない。このようにすれば、1命令・2サイクル余計に掛かるものの、サブルーチンの実体を後半に置くことができる。0前半に置かなければならないのは、定数テーブル参照などPCL操作をするようなコードのみである。いうわけで、実は印象の割には大した制限ではない。・バンク・ページ選択バンクおよびページの選択方法はベースラインからミッドレンジで様変わりしており、注意が必要である。PCLATHレジスタで指定。STATUSレジスタの上位3bitにPA2:0があり、これがミッドレンジのPCLATHと同様の働きをもつ。STATUSレジスタの上位3bitにIRP,RP1:0があり、それぞれ間接アドレッシングと直接アドレッシングのバンクを指定する。間接アドレッシングはFSRのみでアドレスを指定できる。直接アドレッシングの場合、FSRの上位3bitと命令からの5bitでアドレスを指定する。いうように、STATUSレジスタの上位3bitの扱いが変わっているので注意が必要である。ベースラインは間接アドレッシングと直接アドレッシングで別のページを指すことができないことに注意が必要である。コールスタックミッドレンジのコールスタックは8段あり、複雑な事をしなければ足りなくなることはあまり無い。それに対しベースラインのコールスタックはわずか2段であり、よく考えて使わないとすぐに足りなくなる。しても3段のネストが必要になったら、自力で戻りアドレスを保存してCALL・RETURNを模擬する必要がある。単純な例を挙げればこんな感じ。PCLendmPC上位を保存しておく必要があったり再入可能にするならもっと面倒になるが、そこまで必要になったことが無いので考えていない。周辺機能の制御用を除いた、コア機能のためのレジスタを比較する。ベースラインに無いレジスタは、説明済みのPCLATHと、割り込みが無いためINTCONが存在しないのみである。上で述べたとおり、INTCONが無いということはTMR0のオーバーフローフラグも無いことに注意が必要である。機能の違うレジスタは3つ。OPTION(_REG)FSRについては説明済み。STATUSとOPTIONを詳しく見る。GPWUF/RBWUF)。ここではGPIOの方を示した。C下位5bitは共通。上位3bitが問題となる。ミッドレンジではおそらくすべての機種で間接・直接のバンク選択に割り当てられている。16F5x)では3bitすべてページ選択(=PCLATH相当)に割り当てられている。ベースラインのFlash量は最大でも2kワードなのでPA2が使われている機種は無さそうである。2機能のあるものでは、上位2bitが2種のウェイクアップフラグ(GPIOピン変化・コンパレータ変化)に割り当てられている。このため両機能のあるものではFlashを2ページ(1024ワード)までしか積めないことになる。PS0下位6bitは共通。上位2bitが、ミッドレンジではポートのプルアップと割り込みエッジ。ベースラインではピン変化ウェイクアップとポートのプルアップ。...なんでわざわざポートのプルアップのビットの位置を変えたんだろう。・OPTION_REGミッドレンジの「OPTION_REG」レジスタだが、古い機種のデータシートでは「OPTION」レジスタであった。OPTION命令との衝突を避けて名前を変えたのだろう。データシートのリビジョンで記述が変わっていることもあるようだ。1001がTRISに相当する。715/08/29訂正どちらも表に見えていないレジスタに書き込むという実質的に同じ動作なのだろう。OPTION2」と書けるものだと勘違いしていたが、OPTION2はincファイルに定義が無く、マジックナンバー「7」で書き込まなければならない。OPTION2」などと書かせないためだろうか。・ミッドレンジで隠し命令TRIS命令とOPTION命令は命令一覧には載っていないもののミッドレンジでも使用可能である。バンクを切り替えなくともOPTION_REG・TRISレジスタに書き込めるのは便利である。・Enhancedミッドレンジでは指定する値はPORTA,B,Cとは関係なく5,6,7・MPLAB8で試した所シミュレータでは不正な命令扱いになってしまった。22:44)ARMマイコンはじめました。URL欄を実験的に消してる間に廃止されてしまいました。情報を記憶:コメント:<ご注意>書き込まれた内容は公開され、ブログの持ち主だけが削除できます。ReservedベースラインPICの注意点コメント(0)。