課題1 ドア開放回数カウント・表示機能の実現 | ||||||
■ 課題1 4. ドア開閉状態(RB0)→LED#4(RB4)へ正論理で出力
2009年10月29日 9:34 更新
|
●課題1の目標課題1として、「ドア開放回数カウント・表示機能の実現」の課題提出を行う。→課題提出はここから 基本的な実装方針は以下の通りである。 ・回数カウント用の変数(8bit)を新設する ●回数カウント用の変数counterの新設 (2003/10/12変更)レジスタBANK#3 に回数カウント用の変数counterを新設する。 <実装例>
今後のことも考えて、まとめて4つほどカウンタを新設しておく。 ※2003/10/12変更点: 最初は 1B0からの4バイトをcounter変数として確保しましたが、Web制御画面上から、RB5を頻繁に切替えたり、webブラウザからの連続reload攻撃を行ったりすると、1B0付近の汎用レジスタに何処かで何か値が入ってしまうことが判明しました。この領域は実際にEQUで変数定義されていませんので、オリジナルのv12.asmの汎用レジスタ操作(RP0,RP1)の関係にバグ(BANK#1のつもりがBANK#3で変更をかけている)があるか、PIC16F877自体が抱えている問題かも知れません。この問題を回避するために、1E0からの4バイトをcounter変数として確保するように変更します。いずれにせよ、BANK#3であることに変わりはないので、以下の説明は修正前と変わりません。なお、変数counterの初期化は、startモジュールの最後の方で行うとよいでしょう。 ●TMR1内部タイマ・割り込み処理ルーティン注意点:課題0において、main0ラベル直後に、testモジュールcall処理のため、4ステップを追加して動作を確認したところである。(課題0のココを参照せよ) しかしながら、課題1以降は、実装していくモジュールの呼び出しは、タイマ割り込みルーチンからジャンプする形態をとるため、課題0でmain0ラベル直後に追加した呼び出し処理については、必ずコメントアウトするか削除しておくこと。(2005/5/3追記) ※PIC16F877+PICNICファームウェアv12.asmにおける現状の内部タイマ・割り込み処理関係に関する説明はここから参照のこと。
割り込みルーティン内では、無用にコードを増やしていくことが事実上困難(プログラムメモリPAGE#0は一杯)。 割り込みルーティンから、プログラムメモリPAGE#3に存在する外部モジュールをPCLATHしてgotoジャンプ→割り込みルーティン内のリターン用タグへ戻すのは容易なので、この方法を採用することとする。
上記の例では、割り込み処理ルーティン内から int_tmr1→test4へジャンプ→(カウント処理)→int_tmr9へ戻る→int_tmr2 の順序で実行されていく。 ●ドア開閉状態(RB0)→LED#4(RB4)へ正論理で出力チュートリアル(課題0)における実験4(test2モジュール)を参考にせよ。 【実験4】RB0(ドアセンサ)→RB4(LED#4)へ出力 test2モジュールの作成
●ドア開放回数のカウントモジュール:test4割り込み処理ルーティンから13.1msec間隔で呼び出されるはず。 割り込みルーティンからの呼び出しとなるので、チュートリアル(課題0)で説明したwk2,wk1によるSTATUS、Wレジスタ値の保存は危険である。 ・STATUS値の保全は行わないこととする。
・ドアが開いているか?(RB0のチェック) test4モジュール側
●回数カウンタのweb制御画面への表示カウントした変数counterの値(8bit)をweb制御画面へ表示する。 ctrl_code1で、コントロールコード '$9'からの呼び出しを変更する。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <変更後>
<処理手順の例>
●実行例・電源投入直後 → 1回ドアを開け閉めした後 → .... → 10回目 ドア状態に応じて、LED#4(RB4)が点灯・消灯している。 ●課題1の提出
(1)ドア開放回数カウント・表示機能を実現するための各種モジュールの作成 を行いなさい。 (2)仕様通りの動作が行われることを、ドアセンサ状態、web制御画面、カウンタ値の変化を用いて確認せよ。 (3)アセンブルソースファイルのバージョン番号を、 (4)完成したアセンブルソースファイルを v1206e1.asm という名前で保存せよ(全て半角英数字・アルファベットは小文字、半角カタカナ・全角文字はファイル名には決して使用しない)。 (5)以下のレポート提出システムから、v1206e1.asm をアップロードせよ。レポート受領後、採点が行われる。 <提出方法> 提出されたファイルは、こちらで動作を確認した後、動作に不備があった場合には再提出、動作がOKの場合には修了の判定を行います。 レポート課題1(課題番号:picnic-exp01)の提出はここからどうぞ (6)「判定待ち」となります。少々お待ちください。なかなか判定結果が出ない場合は、こちらへメールして下さい。 (7)再提出判定がなされた場合には指摘された不具合を修正し、v1206e1a.asmなどとファイル名を替えて、再提出する。 (8)(7)でない場合(修了判定)、レポート課題1は受理され、完了となった。
●考察のポイント以下に、今回の仕様と実装に対する考察ポイントを挙げます。レポートとして回答必須ではありませんが、プログラム完成・レポート提出前に必ず各自で考えをまとめておくようにせよ。
[1] 8bitカウンタを使用しているため、256回ドアを開け閉めすると変数がオーバーフローして 0回 に回数が戻ってしまう。これを防ぐためにはどのように改良すればよいか? [2] ドア開閉回数として16bitカウンタを使用すれば、実際の使用上、オーバーフローすることはないであろう。このための変更点はどの部分か? [3] チャタリング時間が非常に長い(TMR1タイマ割り込み間隔の3倍程度)ようなドアスイッチを入力とした場合、1回の開け閉め動作に対して、2回以上、誤ったカウントアップが行われる可能性がある。これを防ぐためにはどのように改良すればよいか? [4] 回数カウンタ counter は、リセット後、何処かで初期値:=0にセットされるべきである。これは具体的に何処へ実装したらよいか? |
|||||
IT技術演習(院)−PICNIC− by Katsumi WASAKI is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.1 Japan License.
|