2012/01/21

PIC24FJ64GA002の顛末

PIC24FJ64GA002のスペックの良いところとしては、
  • プログラムメモリが64KBある
  • 内蔵オシレータ+PLLx4で、外付け部品なしで32MHzクロックになる。
  • 命令クロックは、(PICおなじみの)Fosc/4ではなく、Fosc/2なので16MIPS。
  • ペリフェラルポートを、ある程度自由に配置(リマップ)することができる。
今回、これを選んだ一番のポイントはプログラムメモリが64KBあることで、要はここに音声データを格納しようとしたわけです。
スペック的には、こんだけ良かったらもうAVRとか要らないよね、PICで充分じゃん、的な感じがするわけですが、そこはそれ、Microchipはいろんなネタを用意してくれてました。そこにシビれる憧れるぅ!
  • エラッタが多い。これは今回買ったリビジョンでは改善されてますが、まあプロセッサが太るとしょうがありませんね。趣味でプロセッサのエラッタ調べるなんてちょっとどうなんだろう、という感じですが。
  • MCLRは、I/Oピンになりません(MCLRENがコンフィグにありません)。
    これはまあ「あれそうなんだ、プルアップするか」で済みますが。
  • プログラムメモリにおける配列サイズの上限は32KB。
    プログラムメモリにデータを置くにはconst宣言を付けてやればいいのですが、上位32KBをバンク切り替えして見せる関係上、ひとつの配列サイズは32KB以下になります。これは16ビットアーキテクチャですから当然ですね。
  • プログラムメモリは、普通に使うと44KB程に見える(注:頑張れば64KB使えます)。
    一番びっくりしたのがこれで、実はPIC24Fの命令は、1命令 3バイトなのです。マニュアルをよーく読むと「64KB、22,016命令」と書かれています。64KB/3で22016命令ということですね。
  • そしてこいつが3バイトづつ並んでいるか、というとそうじゃなくて、
    • 命令アドレッシングは2バイト/命令
      つまり、「0番地に命令0、2番地に命令1、4番地に命令2、、、」という風に綺麗にアドレッシングされます。PCは1命令で2進みます。
    • しかし、命令は3バイト読まないといけない
      じゃあどうするかというと、命令Xには(アドレッシング的に普通に読み出せる)バイト2Xとバイト2X+1の2バイト、そして隠れた1バイトがある。という作りになっています。
      これを変態と言わずして何と言おう。
  • この隠れた1バイトは、TBLRDHという命令で読み出さないといけないらしいです。Cからどうやって書けば(初期化すれば)良いのかは、良くわかりません...。

0 件のコメント: