某巨大掲示板で、「PIC16F88からPIC16F1827に移植したら、すげえ速くなっちまったのはなぜでしょう。」
と書いてる人がいて、そりゃPLLの設定でしょうと思った。
やり取りを読んでいると、「クロックの設定も同じだし、PLLは使ってない。」とご本人が言い張っている。
へえ、そうなの、変だねと思ったが、本人がそう言うならそうなんだろうと思って口出しせずに黙って見ていた。
その中で、PIC16F88とPIC16F1827では
>メモリーアクセス方法が変わって、
>連続でアクセスできるので、
>バンク切り替えがない分高速になる場合があります
と書いてる人がいたので、それは面白いなと思って確かめてみた。
コードはこんな風に、Configuration BitsとANSEL意外は全く同じ。
もちろん、PIC16F1827のPLLは使わないようにして、両方とも8MHzで動かしている。
Simulator上で時間を比べると、確かにこの程度違いが出る。
このように、ブレーク・ポイントを設定して、LEDの点滅の間隔を比較している。
これが実際にPIC16F88とPIC16F1827を同時に動かして、ロジアナで信号を拾ってみた結果だ。
Simulatorの結果と合っている。
実行中の写真。
ちなみに、NOP();をひとつはさんだforループを比較するとこんな感じになる。
ループのカウンタとして上から順にchar、short、longを使っている。
だからなんだ、といえば特に何でも無いのだが、あえて言えばPIC16F88はもう不要だよねという話になるか。
ちゃんと時間稼ぎするなら__delayを使えばいいし、他の処理に影響しないようにしたければタイマーを使って割り込みを発生されればいいわけで、結局、多少変わってもかまわない適当な時間稼ぎの場合にしか使わないわけだ。
あと、結局のところ、何倍も速くなっちゃう原因は何だったんだろう、こっちにはそれこそ何の興味も無いが。