PIC16F1823用のプログラムをPIC16F18424へ移植した際の話です。
桁が1つ増えてるくらい、16F18424は かなり世代の新しい強力な石です。
16F1823でも実用上は問題無いプログラムが書けたのですが、
後々の拡張性等を考慮し、16F18424へ移植して見る事を考えた次第。
この移植のメリットは大まかに以下の2つ。
1、Foscの高速化
16F1823ではタイマーに使うクロック源のバリエーションが少ないため、
長時間のタイマーが欲しい場合はFoscの周波数を抑えるしかありません。
すると当然ながら、各命令の処理速度も落ちてしまうわけですね。
16F18424ではタイマーへ低速のクロックを割り当てる事が可能なので、
Fosc周波数を抑える必要が無くなります。
常に最高速度である32MHzで回す必要はありませんが、
そこそこの速度にしておくと処理に余裕が出来て好ましいです。
2、オープントレイン出力
16F1823のI/O出力はトーテムポール出力のみです。
それ自体がデメリットというわけてはなく、
適切に設計されていれば通常問題になるわけではありません。
16F18424ではオープンドレイン出力に設定することが可能です。
今回の回路では十分大きなプルアップ抵抗が存在し、
立下りタイミングが動作関与する為、オープンドレインで事足ります。
もちろんこの場合でもトーテムポール出力で支障が出るわけではありません。
ただ、何らかの原因で誤動作が発生した際、
オープンドレイン出力ならばコンフリクト発生を回避できる可能性があります。
そういう意味で、問題無ければオープンドレイン出力を利用した方が安全。
そんなわけで、出力ポートを全てオープンドレイン化したのでした。
さて実際の移植ですが、アルゴリズム的には変更不要です。
手を加えなければならないのはバンク指定。
16F18424は非常に機能が増えた分、レジスタもガッツリ増大しております。
PICの仕様上、1つのバンクに納められるレジスタ数には限界がある為、
レジスタ数が増えたならバンクを増やして対応することになります。
16F1823では7つ程度だったバンクが、16F18424では約20個に増えてます。
単に増えたのみならず、レジスタの配置を大幅に変更されているんですね。
ですのでレジスタへアクセスする箇所で、
切り替えるバンクを全て確認/変更しなければなりません。
実はこれが かなり厄介。
16F18424ではバンクへの配置が かなり散らばったんですね。
16F1823では同一バンクに有ったものが、16F18424では別バンクに、
というケースが非常に多かった為、バンク切替が多発する事に。
すると当然ながらバンク切替の命令が増えるのでコードが長くなっちゃいます。
バンク指定のミスというバグの発生確率も上がるので、
バンク切替が多発するというのは 個人的に好ましく思いません。
(そういう意味で、多機能の石は18Fシリーズを使うべきかも)
というわけで、必ずしも最近の機能の石に置き換えるのがベスト、
とは言えないケースがあるという話でした。
0 件のコメント:
コメントを投稿