• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語でのif文分岐について(PICで使用))

C言語でのif文分岐について(PICで使用)

このQ&Aのポイント
  • C言語を用いてPICマイコンでプログラムを組んでいる中で、if文の分岐がうまく行かない問題が発生しています。具体的には、パルス幅に応じて個数を判別し、累積カウントをするプログラムで、パルス幅が100以上の場合に「2つ」とカウントするべきなのに「1つ」とカウントされてしまうという問題です。
  • プログラムの仕様は以下の通りです。まず、パルスの幅を計測するプログラムを実行し、計測したパルス幅に応じて個数を判別し、累積するという流れです。このプログラムは2ミリ秒の周期で実行されます。また、カメラの前に物体がある場合には累積カウントを行わないような設計になっており、そのためには「PP」という変数を定義しています。
  • 現在のアルゴリズムは自己流で作成されており、問題が発生しています。アドバイスや指摘があればご教授いただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

1) ラインカメラで物体の大きさと、通過個数をカウントしていると思われますが、物体の大きさを最初の一回しかチェックしていません、物体が通過する間の一番大きい値で比較する必要があるのでは? 2) 割り込みキャプチャにおいて、Captime_rise[Rise]=IC2BUF、Captime_down[Down]=IC1BUF、のRise,Downの最大値のチェックが必要では? デバッグ方法 物体が通過する際の全てのキャプチャデータをパソコンへシリアル転送すれば、全体の流れがつかめると思います。

Snoodam
質問者

お礼

koujikuu様: >1) ラインカメラで物体の大きさと、通過個数をカウントしていると思われますが、物体の大きさを最初の一>回しかチェックしていません、物体が通過する間の一番大きい値で比較する必要があるのでは? →下名の勝手な判断で、現状はカメラの前に棒を置きっぱなしにしてパルス幅を測定していました。  その影響か、横から(落下方向でない方向から)物体を徐々にカメラ範囲内にいれると、KOSUが「2」と検出できていたので、なにか挙動がおかしいなと思っていました。 頂いたアドバイスをもとに、プログラムを考え直します。 >2) 割り込みキャプチャにおいて、Captime_rise[Rise]=IC2BUF、Captime_down[Down]=IC1BUF、の>Rise,Downの最大値のチェックが必要では? →これは、現状配列で4つまで定義しているので(Captime_rise[4])、3までのチェックということでしょうか。 現状の想定は __|¯|____|¯¯|__ のみで、一つ目のパルスの幅のみを計測する。 というものでした。2つめ以降は破棄するという考えと、PPを用いて前のサイクルのRise状態を見るという考えの乖離が、おかしな挙動を招いているのかもしれません。 >デバッグ方法 ありがとうございます。 LCDでの表示にばかりこだわっていました。 16FシリーズでTeraTermを用いてシリアル通信でのPC表示はしたことがあるので、教えて頂きました方法でデータも見て見ます。

Snoodam
質問者

補足

補足: 現状でKOSU=1と判別している最中に、KOSU=2のパルス幅を検知しても、KOSUの値が変わらないことに問題がありそうです。 パルス幅100以上で2と判断するプログラムで、50位の棒をカメラの前にすると、当然KOSU=1になります。 この状態で、棒をカメラに近づけてパルス幅を大きくし(光遮る範囲が大きくなる)、100以上にしてもKOSUが変化しません。 何かループの条件が意図しない動きなのかと思うので、もう一度洗ってみます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

コメントの入れ方が良くなく、想定外の処理を通っているのではないでしょうか? ----------------------------------------------------------- else// if (Captime[1] { KOSU=1; KOSU_SUM++; } ----------------------------------------------------------- 中括弧の数が合わないように見えるのでコンパイルが通ってるのかちょっと不思議ですが、『「2つ」とカウントしたいところが、「1つ」とカウントする。』そうなので、この辺りが怪しく見えます。 質問本文の抜粋コードが正とするならば、if文が怪しいと思います。 ----------------------------------------------------------- if(Captime[1]>STD_width) ----------------------------------------------------------- リンク先ですとコメントがついており、『計測値が、基準より小さいなら』とありますが、それだと不等号の向きが逆に思えます。 見当違いでしたら申し訳ありません。 アルゴリズムについては、カメラの前に物体がずっとある場合の波形が以下のどちらかわからないのでちょっと控えます。 1) ______|‾‾‾‾‾‾‾‾‾‾‾‾‾|___________________ 途中で物体が入る ______|‾|___________________________ 次の周のスタートで一瞬立ち上がる 2) ______|‾‾‾‾‾‾‾‾‾‾‾‾‾|___________________ 途中で物体が入る __________________________________ 物体がある限り次の周もずっとL アルゴリズム自体には関係ありませんが、変数名はKOSUよりCountや、PPよりPrevious_Riseなどが良いと思います。

Snoodam
質問者

お礼

y_mochiduki様: ソース全文まで見て頂きありがとうございます。 ********* >リンク先ですとコメントがついており、『計測値が、基準より小さいなら』とありますが、それだと不等号の向きが逆に思えます。 すみません。これは完全にコメント分のミスです。 色々試行錯誤をしてく中で、ifの条件の順番を入れ替えたりしたので、その名残です・・・ 中カッコの数は、もう一度確認します。 PICのエディターが、対応するかっこを、色付き反転で示してくれていますので、かっこの数自体は 間違っていないと考えていますが、 何度も「思い込み」で痛い目にあっていますので、もう一度確認します。 ********** カメラの前に物体がずっとある場合の波形は (2)です。 カメラは前方から光を投光し、光が当たるとHの出力を返します。 したがって、物体があると、Lになります。 ただ、カメラのアナログ出力をコンパレータ―を通していますので、スレッドショルドレベル付近で チャタリングの可能性も考えられることに、アドバイスを拝見して気づきました。 ただ、パルス幅も液晶に表示しており、正常な値を示しておりました。 (プログラムの構成上、チャタリングノイズを拾うと、計測するパルス幅が極端に小さくなるはずです) もしくは、デジタルオシロでは拾いきれないノイズや、y_mochiduki様が仰る(1)の状態が発生しているのかもしれません。(もう一度カメラの仕様も確認します) ******* 変数名についても、ありがとうございます。 Previous Pulseのつもりでしたが、考えてみれば「前の立ち上がり」なので、仰る通りです。 KOSUについては、下名の学の無さが滲み出ておりました・・・ ****** お忙しい中、ソースまで見て頂きありがとうございます。 もし、お時間が許すようであれば、アドバイスを頂けると幸いです。

すると、全ての回答が全文表示されます。

関連するQ&A