デバッグ作業が勉強になった
おしなべてデバッグ作業は辛いものですが、勉強になることも多々あります。『自動機能の組み込み』では数日間のデバッグ作業を強いられましたが、不具合原因を探して調査を進めていていくつか判ったことがあります。
PIC_coloコンソールからリセット・コマンドを送ると、PIC_coloデバッガはソフトウェア・リセットを実行します。自動機能のデバッグでは何度もリセットを繰り返しました。リセットSWを使うハードウェア・リセットより色々都合が良いのですが、動作に少し動作に違いがあります。
例えばTMR1を制御するT1CONレジスタですが、ソフトウェア・リセットでは初期化されません。(↓のR/W-0/uの表示がそれを示している)
そして、これ(↓)はMCCが生成したTMR1の初期化処理です。TMR1の停止が前提のコードになっています。
(1)TMR1HとTMR1Lからtimer1ReloadValを生成している
(2)TMR1割り込みを有効にしてから割り込みハンドラを設定している
(先頭のT1COM=0は後から追加したコードです。)
これをバグと呼ぶのは酷かもしれません。しかし、PICにソフトウェア・リセット機能がある以上、それを考慮した初期化コードを生成して欲しい(T1CON=0を先頭に入れる)と思います。
もう一つ問題なのは、割り込みハンドラを登録する関数(↓)です。
割り込み許可の状態でハンドラを書き換えています。割り込みを許可する前に割り込みハンドラを登録するのが普通でしょうから、これもバグ扱いするのは酷かもしれません。
しかしPIC_coloがユーザ・プログラムを起動するときには、タイマが既に動いているかもしれないし、RUNコマンドで起動するためにはUARTの割り込みも許可されていなければなりません。パワーオン・リセットからの起動を前提とするMCCの生成する初期化コードに対して何らかの処置は必要です。
これ(↑)をPIC_coloのユーザ・プログラムの『お作法』にしようと思います。
少なくともハンドラを登録する前(もしくは登録している最中)に割り込みが発生することは防げます。
制御レジスタを0クリアする等の処置は、個別に注意を喚起することにします。