C言語のお勉強も兼ねて、LEDチカチカで遊んでいる。
PIC16F84Aで12個のLEDを点滅というのが前回までの内容だが、もう少し点滅パターンを増やそうとしたら、メモリーが足りなくなったので、同じ12個のLEDが扱えてメモリーがもう少し多いPICは手持ちでないかと探したら、PIC16F648Aがあった。
そもそもなぜPIC16F84Aなのかもよくわからないのだが、入門用の記事でよく使われているんだなPIC16F84Aが。
で、右も左もわからないので、とりあえず記事の通りのパーツで試してみる方が余分な苦労が省けるってことで、PIC16F84Aが取っ掛かりになるというわけ。
ただし、実際に今秋月電子通商で購入しようとすると、PIC16F84Aは250円なのに対して、PIC16F648Aは160円と、完全に性能と価格が逆転してしまっている。
つまり、入門用にわかりやすくというメリット以外にPIC16F84Aを使う意味は無いのだが、逆に言えばそのためだけにわざわざPIC16F84Aを選ぶことには大きな意味がある。
うまく言えないが、私のようなウカツな初心者がいきなりPIC16F648Aを使うと、投げ出したくなるような深みにはまるが、PIC16F84Aならそれが多少軽減される。
それはともかく、2つはピンの配置に関しては完全に互換性があるので、84Aで作ったブレッドボード上の回路にそのまま648Aを載せることができる。
1年以上もブランクがあって、もともといい加減にしか知らなかったいろんな設定をほとんど忘れかけていたが、プログラム上で追加するのは以下のような設定部分。
#pragma config MCLRE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
これも最近知ったのだが、configはMPLAB X上でConfigration BitsのWindowを出せば、使用中のPICに応じた一覧が表示されて、ちょっと眺めて設定を決めれば、ソース・コードまで吐き出してくれる。
CMCON = 0x07;
1つのピンに複数の機能が割り当てられるPICの場合にはまるのがこのSFR(Special Function Resister)の設定だ。
左が84Aの、右が648AのFSRの一覧だ。
PIC16F638Aの場合はこの設定が山のようにあり、設定しなくてもいいものと設定しないとまずいものの区別すらつかない。
その中で、CMCONはとりあえず初期設定のままではいけないのがわかったのだが、これに関しては、データ・シートの以下の部分を参照する以外に今のところ方法がわからない。
非常に煩雑だ。
その他のSFRに関してはTRISAとTRISBしか設定していないので、若干不安が残るが、プログラムに以上の設定を追加してPIC16F84AをPIC16F648Aに載せ変えただけで、回路の変更無しにそのままPIC16F84Aのときと同じチカチカ動作が再現でき、点滅パターンも無事増やすことができた。
回路図は変更なし。
プログラムはこんな感じ。
覚えたC言語の命令は memcpy(a, b, sizeof(a)); ってやつと、あと、グローバルな変数をやたら使うようになり、関数はみんな変数を返さない void での宣言が多くなった。
良いことなのか悪いことなのかは、無論、わからない。
PIC16F84AとPIC16F648Aのメモリーまわりの比較。
価格は6割程度なのにメモリーは約4倍で機能は満載。
必要なのはFSRとがっぷり四つに組む覚悟。