- ベストアンサー
PICで豆の1秒あたりのカウントプログラムについて
- PICの初心者です。回路図を見て、基板を作れる程度、プログラムは書いてあるのを打ち込める程度で、意味はまったくわかりません。
- 質問は、1,このプログラムを直して、1秒間あたり、何粒落ちるかカウントしたいと考えました。どのように、すれば良いのか教えてください。2,合計のカウンタ-と秒速何粒落ちているかプログラムを1つのPICに入れて、動作の最初時に選 択できるようにしたいのですが、どのようにしたらよいでしょうか。
- 問題点は、1、このプログラムでは1つずつカウントしているため、1秒間に何粒落ちるかを計測することはできません。2、合計のカウンターと秒速カウンターを1つのPICに組み込むためには、プログラムの一部を修正する必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>回路図を見て、基板を作れる程度、プログラムは書いてあるのを打ち込める程度で、意味はまったくわかりません。 この状態では正直つらいですね。 まず、回路図ですが、RA0-RA3は表示する4桁の7セグメントLEDを選択するようになっています。 瞬間的には1桁ずつの7セグメントLEDを点灯していますが、高速に桁を切り替えることで全桁点灯しているように見えます。(目の残像です) 2SA1015はPNPトランジスタですので、RA0-RA2の各ビットを0にすることによりトランジスタがONします。(ct12やswt10でRA0-RA2を順番に1ビットだけ0を出力しているのはそのためです) トランジスタがONすると7セグメントLEDのコモンに+5Vが供給されます。 RB1-RB7に電流制限抵抗を通して各セグメントのa-gのカソードが接続されています。 RB1-RB7を0にすることにより、コモンに供給された電流をPICに吸い込み、各セグメントが点灯します。 7セグメントLEDは複数セグメントを同時に通電し、数字パターンを表示します。 l7ptsetで各数字に対応したパターンが登録されています。 b0をのぞくb1-b7の0の部分が各数字に対する点灯するセグメントです。 rlf命令を2回繰り返し4倍しているのは、その後の各セグメントのデータを出力するプログラムが4ワードなので、4の倍数ごとに各桁のプログラムを作っているためでしょう。 それをプログラムカウンタに足すことにより各桁出力プログラムにジャンプしているのですね。 また、RB0は光センサが入力されると、0になるようになっています。(見てのとおりですね) ct10, ct11でbtfsc, btfss でどちらの状態か確認しています。 質問文のプログラムですが、 start部分は、コメントにもあるように初期設定で、RA, RBポートの入出力関係の設定と変数のクリアを行っています。 ct10はセンサの入力を確認しています。 btfsc は countswが0の時は次の命令をスキップという命令で、 countsw = 0 のとき call swaitへ countsw = 1 のとき goto12へ となります。 再度センサの入力を確認し、明らかにセンサの入力が入っていれば、カウンタをアップ(d1-d4をカウントアップ)します。 その後、センサの入力がなくなるまで待って、各桁を表示するようになっています。 センサの入力がなければ、各桁の表示を繰り返します。 >1,このプログラムを直して、1秒間あたり、何粒落ちるかカウントしたいと考えました。 > どのように、すれば良いのか教えてください。 このような場合は、一般的にはタイマ割り込みで1秒間をカウントします。 その間に何回入力があったかをカウントします。 1秒たつと、そのカウントを別の変数(仮にpps)に記録し、カウンタはクリアします。 表示は、その変数(pps)を表示します。 通常ルーチンで今と同じようにカウントします。 割り込みルーチンで、1秒を検知したらカウント値の保存とクリアを行います。 16F84は8ビットタイマしかないので、内部タイマー割り込みを使い、何回かタイマー割り込みがかかったら1秒になるかをカウントして、その回数になったときに処理します。 クロックは4MHz(基本命令は4サイクルで1命令)で計算すれば、タイマー割り込みルーチンのカウントすうは近い値で計算できるでしょう。 >2,合計のカウンタ-と秒速何粒落ちているかプログラムを1つのPICに入れて、動作の最初時に選 > 択できるようにしたいのですが、どのようにしたらよいでしょうか。 RA4があいているので、そこにSWをつけて、表示を変えるのがかんたんでしょうね。 カウントは、合計用と1秒用と両方カウントすればいいと思います。 PIC16F84は有名なチップで日本語マニュアルもありますので、しっかり読んでください。 タイマー割り込みについても検索すれば、いろいろと見つかると思います。 org 4 goto start とありますが、割り込みルーチンはここから記述します。 宿題がんばってください。
お礼
このたびは、ご指導をいたただきありがとうございました。 おかげさまで、これがいかに大変かがわかったような気がします。 とても、1週間でなんとかなるものではありません。よほど気を入れないと大変です。 これは、ギブアップです。 いつの日にか、機会があればがんばります。