今回の距離測定器は超音波パルスを送出した後、測定対象物からの反射波を検出します。
音波を出してから戻ってくるまでの時間を計測し、対象物までの距離を測定します。 下図の動作を繰り返し実行します。 この動作と独立してLED表示処理が実行されます。 ラベル定義 ;**************** Label Definition ******************** cblock h'20' s_count ;Send-out pulse count adr endc
この疑似命令を使うとCBLOCKとENDCの間で定義したラベルのワークエリアをCBLOCKのオペランドで指定したアドレスから順番に自動設定されます。エリアのダブりも防げるので便利です。割り当てられたアドレスを確認するのにはアッセンブルした結果で確認します。 7セグメントLEDの点灯セグメントデータもEQUで指定しています。 0から9までは通常の数字表示の指定ですが、10番目は検出エラー表示に使っています。 作成初期には中央のセグメントだけを点灯させましたが、表示が見づらいので全てのセグメントを消しました。 11番目は割り込みエラーに使っています。デバッグ用です。 環境指定 他
コンフィグレーションワードとして以下を指定しています。
結果は3F72hです。 初期化処理 ;**************** Initial Process *********************
BポートはLEDのセグメント制御に使うので全て出力に設定します。 CポートのRC2/CCP1はキャプチャの入力に使用するので入力モードに設定します。 超音波送信周期タイマー(TMR0)初期化
キャプチャモード初期化
A/Dコンバータ初期化
A/D変換した結果は上位のビット側を使用するので、結果の格納は左寄せ(ADFM=0)にしています。 AポートはLEDの桁指定の出力用にも使用するのでRA0/AN0以外のポートはデジタル指定にします。 LED表示周期タイマー(TMR2)初期化
タイマー2は約10ミリ秒でタイムアウトするようにします。 PIE1レジスタでタイマー2割り込みを可能にしています。 割り込み初期化
周辺機器割り込みを可能にしないとキャプチャ、タイマー2などの割り込みが行われません。 この処理により割り込み動作が開始されます。 初期化処理が終了すると割り込み待ち状態になります。自分のアドレスをひたすら実行するだけです。 割り込み処理 ;*************** Interruption Process *****************
いずれの割り込みでもない場合には処理を継続しても仕方がないので処理を停止しています。実際の回路ではインサーキット・シミュレータなどがないと割り込み異常は確認できません。リセットするという手もありますが、リセットしてもまた同じ動作をするので意味はありません。正常に動作しない場合にはこの部分も疑ってみる必要があります。 割り込みが発生するとグローバル割り込み可能ビット(GIEビット)が自動的に"0"になります。ですから、割り込み処理中にさらに割り込みが発生することはありません。 割り込み異常処理 ;*************** Illegal interruption *****************
この処理はデバッグ用に設けた処理で、割り込み以外のチェックにも使用可能です。 割り込み終了処理 ;************ END of Interruption Process **************
割り込み終了処理ではRETFIE命令でGIEビットを"1"にして割り込み可能状態にします。 超音波パルス送出処理 ;*************** Pulse send-out Process ****************
割り込み表示クリア
念のためタイマー0のカウントエリアをクリアしています。 検出エラーチェック
反射波検出回路停止
キャプチャ動作開始
40KHzパルス送出
今回の回路では4MHzのクロックを使っているのでインストラクション実行時間は1μ秒です。ですから、正確な40KHzを出すことは出来ません。ON,OFFをそれぞれ12μ秒とした場合、41.7KHz。13μ秒とした場合、38.5KHzになります。この時間の調整はパルス送出処理の中のステップ数を変えて調整します。 20パルスを送出すると20パルス x 0.025ミリ秒/パルス = 0.5ミリ秒になります。 表示補正データ取り込み
誤検出ガード
反射波検出開始
キャプチャ割り込み処理 ;****************** Capture Process ********************
割り込み表示クリア
距離換算処理
例えば1mの距離から反射した場合で説明します。 1mの距離を音波が伝搬する時間は20℃の場合2m/343m/秒=5831μ秒です。タイマー0のクロックは1μ秒/カウントなので、キャプチャ時点のタイマー0の値は5831になります。このとき、表示には100(1mのこと)と表示させたいので規定値として58で割ると距離に換算することができます。規定値はA/Dコンバータで取り込む値になります。ですから、温度が異なる場合、A/Dコンバータに入力する電圧を変換させれば表示の補正をすることができます。ただし、デジタル変換しているので細かな調整はできません。 表示設定処理
2進数を10進数に変換して各々のワークエリア(百位、十位、一位)に設定します。 百位が9を越えている場合にはエラー表示にしています。 LED表示処理 ;**************** LED display control *****************
LEDは1桁ずつ順番に表示します。ですから、同時には一桁分しか表示していません。 表示はタイマー2を使用して10ミリ秒毎に行います。表示がちらつく場合にはタイマー2の設定値を少なくしてもっと早い周期で表示させます。 |