8ビットPICの最上位に相当するPIC18Fシリーズ。16Fシリーズに比べると、お値段も高めで使うのに躊躇していたのですが、それでも、16Fシリーズの高機能のものと比較するならば、それほど、価格の違いがありません。
16ビットコア(命令語調が16ビット)で、14ビットコア(大部分の16Fシリーズ)と、ほぼ、同じ命令のほかに、使いにくかった部分が大幅に改善されています。欲しかった乗算命令も入っているのも大きなポイント。また、当然、プログラムメモリもデータメモリもそれなりに大きなものが用意されています。
最近、秋月のライターのバージョンが上がって、秋月取り扱いの18Fシリーズに関してはすべてかけるようになったので、環境も整いつつあります。
秋葉原で入手できるPIC18Fを調べてみました(2012/03/13)。
いくつかのPIC18Fの機能をまとめてみました。
name | pins | Program (Word) | EEPROM (Bytes) | RAM (Bytes) | I/O | ADC 10bit | Comp | 8bit Timer | 16bit Timer | USART | I2C/SPI | Max MHz | intOSC | CCP/ECCP | Ex.Inst |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PIC18F452 | 40 | 16k | 256 | 1536 | 34 | 8 | - | 2 | 2 | 1 | I2C/SPI(MSSP) | 40 | - | 2/0 | |
PIC18F1220 | 18 | 2k | 256 | 256 | 16 | 7(30ksps) | - | 1 | 3 | 1 | 40 | 8M/32k | 0/1 | ||
PIC18F1320 | 18 | 4k | 256 | 256 | 16 | 7(30ksps) | - | 1 | 3 | 1 | 40 | 8M/32k | 0/1 | ||
PIC18F14K50 | 20 | 8k | 256 | 512 | 15 | 11 | 2 | 1 | 3 | 1 | USB2.0/I2C/SPI | 48 | 32M/31k | 0/1 | |
PIC18F2320 | 28 | 4k | 256 | 512 | 25 | 10(30ksps) | 2 | 1 | 3 | 1 | I2C/SPI | 40 | 8M/32k | 2/0 | |
PIC18F24J10 | 28 | 8k | - | 1024 | 21 | 10(100ksps) | 2 | 1 | 2 | 1 | I2C/SPI | 40 | 32k | 2/0 | ExInst 2.0-3.6v |
PIC18F2450 | 28 | 8k | - | 768 | 23 | 10(100ksps) | - | 1 | 3 | 1 | USB2.0 | 48 | 8M/32k | 1/0 | ExInst |
PIC18F2455 | 28 | 12k | 256 | 2048 | 23 | 11(100ksps) | 2 | 1 | 3 | 1 | USB2.0/ I2C/SPI | 48 | 8M/32k | 2/0 | ExInst |
PIC18F2515 | 28 | 24k | - | 3968 | 25 | 10(100ksps) | 2 | 1 | 3 | 1 | I2C/SPI | 40 | 8M/32k | 2/0 | ExInst/ no SelfWrite |
PIC18F2550 | 28 | 16k | 256 | 2048 | 23 | 11(100ksps) | 2 | 1 | 3 | 1 | USB2.0/ I2C/SPI | 48 | 8M/32k | 2/0 | ExInst |
PIC18F4520 | 40 | 16k | 256 | 1536 | 36 | 13(100ksps) | 2 | 1 | 3 | 1 | I2C/SPI | 40 | 8M/32k | 1/1 | ExInst |
PIC18F4550 | 40 | 32k | 256 | 2048 | 35 | 13(100ksps) | 2 | 1 | 3 | 1 | I2C/SPI | 48 | 8M/32k | 1/1 | ExInst |
PIC18F8720 | 80 | 64k | 1024 | 3840 | 68 | 16 | 2 | 2 | 3 | 2 | I2C/SPI | 25 | - | 5/0 | |
PIC18F8722 | 80 | 64k | 1024 | 3936 | 70 | 16(100ksps) | 2 | 2 | 3 | 2 | 2I2C/2SPI | 40 | 8M/32k | 2/3 | ExInst |
28ピンでは、PIC18F2550/PIC18F4550が機能を考えるとお買い得。USBが付いているけれど、これを使わなくても十分っぽいパフォーマンスです。秋月で@400。
PIC18F24J10は、プログラム/RAMが小ぶりだけれど、秋月で@250と安いのが魅力。ただし、フラットパッケージで電源2.0-3.6Vが使いにくい点。
PIC18F8722はここで掲載した最大規模のもの(@900秋月)。大きな規模ではこれしかない。搭載したボードが@3000なので、これを利用することになるでしょう。
プログラミング上での、気がついた相違点です。
いままで、条件分岐は、BTFSS、BTFSCを使ってSTATUSレジスタのビットを判定するというワイルドなものしかなかったのですが、一般的なCPU同様に条件分岐専用命令が増えました。また、STATUSにオーバーフロービットが追加されたので、条件もより人間的(?)になりました。
これが無かったために、プログラムが複雑になっていたのですが、この苦労から開放されたわけです。また、減算は逆向きのものがサポートされたのも嬉しい。
同様に大小判別用に比較命令も追加されています。
欲しかった高速の乗算命令がサポートされました。
要するに割り込みの先頭でレジスタ保存をするときに便利になったのでした。ステータスが変わらないし、Wレジスタも壊さないので、SWAPF命令を使った変則的な退避、回復処理が不要。ちょっと美しくなったかな。
マニュアルには大きく書いていないのですが、Wレジスタにレジスタアドレスがつきました。この結果、ファイルレジスタに対する操作のすべてがWレジスタにも使えます。
意外なことですが、今までは、Wレジスタをシフトしたり、DECFSZを使ったループカウントに使ったり出来なかったのですが、これが可能になりました。
全空間、面倒なバンクの切り替えをせずに使えるようになりました。
専用のTBLRD命令でプログラム上のデータを読めます。おかげで、RETLW k を使った変則的なテーブル読み込みから開放されました。また、条件付ですがプログラムメモリへの書き込みも出来ます。
間接アクセスに使用するFSRが三つになりました。これで、まとまったデータの処理で、頻繁にFSRを入れ替える必要がなくなりました。また、INDFのほかにPOSTINCなどのレジスタ窓が用意され、これによって、ポスト・インクリメント/デクリメント、プリ・インクリメント/デクリメント、WREGをオフセットにしたアクセスなどが出来るようになりました。
FSRへの読み込みも、定数だけですが1命令で出来るようになって便利。
FSRも長くなって、全データメモリを直接アクセスできます。これも大きなポイント。
相変わらず256バイトのバンク単位のアドレス指定ですが、BSR(バンクセレクト)レジスタでバンクを指定するようになりました。また、レジスタアクセスの際に、バンク指定とアクセスバンク指定の二種類が選べます(命令に記述)。バンク指定ではBSRを使った通常のアクセスですが、アクセスバンク指定では、メモリーの最初の方と、SFR(機能レジスタ)を強制的にアクセスします。
多重割り込みがサポートされたので、本当に楽です。規模が小さいのですから、二段階もあれば十分かと思います。