装置製作の過程でいくつかのトラブルが発生しました。参考に掲載します。
タイマー割り込み動作が途中で止まってしまう原因:割り込み処理でメモリのバンクを設定しなかったため。 対処:割り込み処理の初めでバンクを0に設定するようにした。 今回処理ではLEDの表示、SWの読み込みをベースレベル(割り込みでない処理)で行い、温度センサーの読み取りをタイマー0の割り込み、外部回路の制御をタイマー1の割り込みで処理しています。ベースレベルの処理のなかで、LEDの制御はPORTBを出力モード、SW読み取りの場合には入力モードで行います。このモードはSFRのバンク1にあるTRISBレジスタの設定を変更して行います。割り込み処理ではベース処理を途中で中断して実行するため、WレジスタおよびSTATUSレジスタを待避しています。そして割り込み処理が終了した時点でそれらのレジスタを割り込み前と同じ内容に戻します。 今回の現象はベースレベルでバンクを1に変えてTRISBレジスタを書き換えている途中で割り込みが発生した場合に起きます。バンクが1に切り替わったままでなので、割り込み処理ではメモリの操作が正常に行えなかったのが原因でした。 他の対処方法としてはベースレベルの処理で割り込まれたくない処理の前でINTCONレジスタのGIEビットを0にして割り込みを禁止し、処理終了時にGIEを1にして割り込み禁止解除をする方法もあります。同じメモリをベース処理でも割り込み処理でも操作する場合には、このような割り込み禁止処理が有効です。 tempcont.asm
温度表示が安定しない 原因:温度センサーが発振したため。 対処:センサーの出力にコンデンサを並列接続した。 今回の装置では室内温度と屋外温度を計測するために2つの温度センサーを使用しています。現象はそのうちの1つで起きました。温度表示がバラバラに変化して安定しません。室内、屋外のセンサーを変えると現象も移ります。要は片方のセンサーのみで起きた現象です。センサーの不良かと思い、センサーを交換してみましたが変わりません。オシロでセンサーの出力を見ると発振していることが分かりました。どうもケーブルの長さが影響しているようです。ケーブルを変える方法も考えましたが、センサーの出力にコンデンサを入れて発振を停止することにしました。 0.1μFのコンデンサを入れることにより発振は止まりました。発振していたときのように大きくは変化しませんが、温度表示は数℃の範囲で変化しています。これは2つのセンサーとも同じでした。最初はそんなものかなと思っていたのですが、コンデンサの容量を2.2μFにしたところ温度表示の微少変化は無くなりました。ただ、本来の温度表示をしてくれないと困るのですが、全く問題はありませんでした。センサー出力回路にはコンデンサを並列に接続しただけで、放電用の抵抗器は付けていません。温度変化は急激でないため、センサーおよびオペアンプの入力端子から放電されているようです。 温度条件以外でも外部駆動回路が動作してしまう 原因:BCDスイッチの読み取りが不安定。 対処:3回連続して同じ値だけを使用するようにした。 外部回路を駆動する条件は次のような条件です。室温が高い場合の動作モード(UPモード)で説明します。室温がプリセット温度より高く、かつ屋外温度より高い場合に外部回路を動作させます。屋外温度が室内より高い場合にはファンを動作させても意味がないからです。基本的にはこの条件で動作しています。でも、室温がプリセット温度より低い場合でも外部回路が動作する現象が発生しました。ソフトウェアを検証しても悪いところは見つかりません。 そこで、室温とプリセット温度を比較する処理に罠を仕掛けました。室温よりプリセット温度の方が低いと検出したら制御回路2を動作させるようにしました。環境はプリセット温度の方を高く設定しているので、正常な場合には制御回路2が動作することはありません。でも、数分経つと回路2が動作します。この時間は一定ではありません。数分の場合もあれば、数十分の場合もあります。 次にプリセットのBCDスイッチの読み取り処理を調べました。ソフトウェアとしては異常は見あたりません。そこで、読み取った値を待避し、次回の読み取り値と比べる処理を行ったところ、読み取り誤りをするケースがあることが分かりました。原因は定かではありません。最初はスイッチの指定制御が短いためかと思いました。それまではスイッチを指定してから100μ秒後に読み取りを行っていました。これを200μ秒にしてみたのですが、変化はありません。根本原因を調べようとも思ったのですが、毎回起きる現象ではないので究明は難しそうです。そこで、3回続けて同じ値が読み取れれば間違いないと判断し、その処理を追加しました。3回読むのにかかる時間は約25ミリ秒です。一方、温度比較処理は2秒周期です。3回読んでも問題はありません。もし、読み取りが失敗しても、その前に読んだ値が使えるのでこれも問題はありません。また、プリセット温度を変える頻度は少ないので、これまた問題はありません。ということで、根本的な対処ではありませんが、実質的に問題が無いので、この方式を採用することにしました。以後、この現象による誤動作はしていません。 tempcont.asm
3端子レギュレータの温度が高い 原因:入力電圧が高いため、少しの電流でもレギュレータが発熱する。 対処:トランスの電圧を下げ、放熱器を付けた。 この現象は当然といえば当然です。でも、結構見逃しがちです。参考「+5V スイッチング・レギュレータ」 最初はAC12Vのトランスを使用していました。この場合、2つのリレーが動作したときのレギュレータ入力電圧は14.15V、電流は0.15Aでした。ですから、レギュレータで消費される電力は ( 14.15V - 5.00V ) x 0.15A = 1.37W です。 トランスをAC10V出力に変えると、2つのリレーが動作したときのレギュレータ入力電圧は11.10Vでした。ですから、レギュレータで消費される電力は ( 11.10V - 5.00V ) x 0.15A = 0.92W になります。0.5Wくらいの差ですが、熱の量は抑えられます。 レギュレータの入力と出力の差は3Vくらい必要なので、最低でもAC8V以上のトランスを使う必要があります。ちなみにトランス出力をAC7Vにしてみましたが、リレーが2つ動作すると正常に働きませんでした。 0.92Wの消費電力でもレギュレータからはかなりの熱が出るので放熱器を付ける必要があります。 |