ハードウェアの製作を終えてソフトウェアに取り組み始めました。
プログラミング&デバッグ中
久しぶりにPICのプログラミングでいろいろとツボにはまりました(笑)。
あ〜ぁ、そんなんだったっけ〜と思い出して気付かされる事が数多くありましたのでちょっと自戒の念も含めて備忘録的に書き出してみます。PICのプログラミングに慣れていらっしゃる方から見れば知っていて当然な事ばかりでお恥ずかしい限りです。
今回使用したデバイスはPIC16F628A。XTモードにて4.1494304MHz(1022Hz)の水晶発振子をクロックとして動作させています。
タイマーのソースクロック周波数
タイマーモードでは水晶発振子の源発振がそのまま入るかと思いきやインストラクションクロックであるFosc/4が入力されます。7セグメント表示器の表示と表示桁の切替をTMR0オーバーフロー割り込みで処理していたのですが、想像以上にちらつくので良く良くデータシートを見直して改めて再認識。プリスケーラーのスケールを小さく変更しました。
時間計測に用いているTMR1も同様で、内部クロックはすでに4分周されたクロックでタイマーが動作します。時刻計測の1秒カウント処理の数値を1/4に変更しました。
このあたりは4クロックで1インストラクション動作のPICでは当たり前なのでしょうが、しばらくAVRを使っていたので1クロック動作が当たり前になっていたのも要因です。
PORTAの一部はアナログ入力がデフォルトになっている
内部のアナログブロックにコンパレーターモジュールがあって、アナログ入力の電圧差で外部コンパレーターを使わずとも電圧を比較して検出する事のできる有難いモジュールがあるのですが、コイツがリセット時に有効になっており、デジタル入力のピンが全然検出されないという現象に遭遇。
リセット時のデフォルト設定で今回使用しているRA0〜RA3の入力にコンパレーターが繋がってアナログ入力として動作している事によって、プルアップしたスイッチをオンにしてもまったく目的の反応をしないので、かなり???になりました。
コンパレーターモジュールの設定で対象のピンをすべてデジタル入力の設定にする事でやっと動作。
これは昔一度やられたことがあって「もしや?」と思って見返すと案の定な事項。A/Dコンバーターが無いデバイスですのでアナログ優先にリセット時の状態が設定されているのでしょう。
割り込みの設定
これがなかなか難物でした。忘れてしまうと本当に迷宮に入り込みます。
割り込み許可にPEIE(周辺割り込み許可)をセットしないと時間計測に用いているTMR1のオーバーフロー割り込みがかかりません。
7セグメントLEDの表示に使用しているTMR0はこれをセットしなくても割り込みが掛かりますのですぐに気付きませんでした。これは12F/16F系PIC全般のアーキテクチャなのですが完全に失念していました。
個別の割り込み許可とグローバルに割り込みを有効にしただけではダメです。
そんなこんなでなんとかファームウェアは完成。
当初の仕様通りの動作を実装できましたので、ケースに入れるべくケース加工の製作に移る事ができそうですが、これがまた面倒くさい(時間がとりにくい)のでどうしたものかと。