2023/03/26(日)秋月電子 PIC周波数カウンタ ちょっと改造-完成
逆アセンブル
MPLABで逆アセンブルしたが絶対アドレスのままなので、一旦GOTO/CALLの飛び先にラベル付けを実施する。MPLABの逆アセンブル結果は単純なので、sedを数回叩くとラベル化が完成。その後は手作業で該当アドレス位置にラベルを追加していく。大抵はRETURNの次の行にアドレスラベルを付ける。不足していればMPLABでコンパイルすれば直ぐに判る事だ。16C71と16F716の違い
16F716は大幅に内蔵レジスタが増えている。それに伴いRAM領域の開始アドレスが異なっている。ソースを良く見るとワーキング領域として0xcや0xdが使われている様だ。これでは16F716では追加されたレジスタ領域と重なってしまっている。これを変更するにはRAM領域を指しているであろうオペランドもラベル化する必要がある。PIC命令表を見ながらリテラル値代入以外の命令についてラベル化を実施。コンパイルしてチェックサムを比べる事で同じバイナリが生成される事を確認しながらの手作業。またPIC特有のBank切替によるレジスタ操作もありMPLABが間違ったレジスタ名を自動付与しているであろう部分も修正してみた。16C71と16F716では同等機能のレジスタアドレスが変わっている為だ。
ちょっと前進した
以上の修正を加えて16F716に書込み、動作確認してみると、ナント電源ONで起動メッセージが液晶に表示され動き出した。が、完全では無い。入力チャネル切替、ゲートタイム切替、そしてA/D計測のバーグラフは動くので測定自体は問題なさそうだが、数値表示は0のまま変化しない。そして肝心の周波数カウンタはxx.xを表示したままだ。
数値文字列変換ルーチン
スイッチ入力やA/D計測のバーグラフは動く。しかしA/D計測値や周波数表示が変化しない事をヒントに一部の処理だけが動いていないのではないかという想像から、内部の数値を文字列に変換する部分が怪しい。それらしい処理をしているであろう部分を探していると、ふとINDF命令が使われている部分があった。PICはあまり詳しくないのでネットで探すと間接アドレス指定の命令と判明。ではこの間接アドレスに何を設定しているかとペアになるFSRレジスタ命令を探すと0x30となっている。このアドレスはPIC16C71ではメモリ領域の最終アドレス。フムフムではこの値を16F716のRAM最終アドレスである0x70に変更してコンパイル。動作確認すると、見事に全ての機能が動いている。当初の目的を全て果たすことが出来たのだ。そして手元には使いやすくなった周波数カウンタと高価なPIC16C711/JWが手元に残ったのでした。折角なのでオープニングメッセージもVer.1.00からVer.1.01へ変更。めでたしめでたし。
欲が出てきたぞ
此処まで出来るようになると、もっと欲が出てきて自分用にカスタマイズしたくなる。この周波数カウンタをいつもの事ながら、電源をONにする度にSWを押してゲートタイムと入力チャネルを切り替えて使っている。そこで、電源ON時の初期値を以下の様に変更させた。ゲートタイム 0.01s → 0.1s
入力チャネル Amp → CH2
折角なのでHEXファイルだけ公開
秋月電子のドキュメント
PIC使用 秋月 液晶表示周波数カウンタ・キット Ver1用16F716に書き込んでお使いください。