※ ChatGPTを利用し、要約された質問です(原文:C言語でのif文分岐について(PICで使用) 2)
C言語でのif文分岐について(PICで使用) 2
このQ&Aのポイント
C言語でのif文分岐についての質問記事です。アルゴリズムの改善に関するアドバイスをもとに、パルス幅の最大値の保持に関するプログラムを追加しました。しかし、意図した通りに動作しないため、困っています。
現在のパルス幅と最大値をLCDに表示するため、1ループ目では現在のパルス幅と最大値が同じになり、2ループ目以降も最大値が前回の値のままになってしまう現象が発生しています。
アルゴリズムの動作を確認するために、アルゴリズム図を参考にしてソースコードを見直しても上手くいかず、困っています。パルス幅の最大値の保持がうまく行われず、次の処理に進めない状況です。
http://oshiete1.watch.impress.co.jp/qa9017378.html
で質問をさせて頂き、アドバイスを基に以下のアルゴリズムを追加しました。
(以前の質問では、間違って質問を締め切ってしまいました。
アドバイスを頂いた方に大変失礼なことをしてしまいました。申し訳ございません。)
1.パルス幅の最大値を保持する。
2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる
従来はRise==2,PP==1の時に、累積加算+パルス幅の判別を行っていました。
このタイミングは、「物体の先端を検知した時」になります。
それを変更し、Rise==1,PP==2の時に、判別するようにしました。
このタイミングは「物体の通過後」になります。
質問:
「1」の「最大値の保持」のプログラムが意図した通りに動きません。
1ループ前のパルス幅を
P_Captime[1]=Captime[1];
として保持し、
現在のループの計測値を比較を行い、現在の値の方が大きければ
Max_Captime[1]=Captime[1];
とし、最大値を保持しています。
私の意図している動き:
LCDに
・現在のパルス幅(Captime[1])
・最大値 (Max_Captime[1])
を表示しています。
この時、LCDの表示が
・1ループ目
現在のパルス幅が50 →最大値も50
・2ループ目
現在のパルス幅が20 →最大値は50のまま
としたいのですが、
ずっと現在のパルス幅=最大値となり、
最後のパルス幅(物体が通過した最後のループ)がLCDに保持されたままになります。
例)上記の後、最後のループのパルス幅が30の場合、最大値は50でなく、30と表示される。
以下ソース抜粋
/* パルス有無の検知 Rise による識別*/
if(Rise==1){
KOSU=0;
Captime[1]=0;
}
else if(Rise==2){
// パルス幅の計算
Captime[1]=Captime_rise[2]-Captime_down[1];
if(Captime[1]>P_Captime[1]){ // 最大パルスの取得・保持
Max_Captime[1]=Captime[1];
}
}
P_Captime[1]=Captime[1];
PP=Rise;
/*抜粋終わり*/
ドツボに嵌っています。
あえて昨日は何も考えずに、もう一度ソースコードでなく、アルゴリズム図から見直してみましたが、うまくいきません。
/*****************************/
冗長な文章でしたので、要約すると
1.パルス幅の最大値を保持する。
2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる
の「1.パルス幅の最大値を保持する」がうまくいかないので、「2」に進めずに
困っています。
となります。
アドバイスを頂けたら幸いです。
(もちろん自分自身でも、並行して考え直しています)
お礼
koujikuu様: 私の低レベルの質問にいつも付き合って頂き、本当にありがとうございます。 本当に失礼なのですが、質問しておきながら、本日はPICを触れる状態にありません。 明日試します。 /****/ if (Captime[1]>Max_Captime[1}){ Max_Captime[1]=Captime[1]; } の部分でハッとしました。 今までのif分岐だと、値がうま行かない理由を、サイクルタイム毎に表に値を書いて みました。10-40-20-30と値が変化すると、MAX値が最終的に40でなく30になりますね。 思い込みで、一応添付画像の通り、サイクルタイム毎の値を書いたつもりでしたが、走り書き でなく、しっかりと表に書くべきでした。 /****/ Sel初期値0:現在の処理モード の使い方も教示して頂きありがとうございます。 switch文のcaseの様な使い方をその様にしたらできるのですね。 目からうろこでした。 /*****/ 本当にありがとうございます。
補足
koujikuu様: 解決いたしました。 本当にありがとうございます。 今後は同じ様な質問をしない為にも、アルゴリズムからコーディングする際には サイクル毎の値の変遷も「頭の中」だけでなく、表をこさえて確認します。 ありがとうございます。