DCDCコン開発(51) またやってしまった。同じミス再び

PICKit3でデバッグ環境ができたので、ほいほいと進展すると思いきや、またまたケアレスミスで、バグ取りに苦労してしまった。

今までは、挙動をできるだけ詳細に把握するため、表示情報量の多い液晶ディスプレイ(LCD)に動作モードや電圧測定値などを表示してきた。しかし、太陽光パネル毎に付けるMPPT付きDCDCコンバータは、できるだけに簡単で安価な回路にするため、LCDで必要となる6本の制御線が不要なLED1つの点滅パタンで表現するように改造中。

LEDのON/OFFを1/4秒毎に切換えるようにして、状態毎に点滅パタンを設定し、先にレポートした入力ポートを利用する方法で実現するつもり。そこで、点滅パタンの処理部分を以下のようにコーディング。

//****************************************
// TMR1×4(262ms毎)処理
// LED表示切替(262ms毎) 4秒サイクル
// MPPTターゲット電圧再設定(2分毎:262ms×16×28)
// 正常状態:●●●●○○○○・・・・(後半はモードを表す)
// 異常状態:●○●○●○●○・・・・(後半はモードを表す)
// 特殊状態:●●○○●●○○・・・・(後半はモードを表す)
void disp_and_mppt_reset( void ){
      static unsigned char led_count;                                        // LED表示切替カウンタ
      WPUA3 = (led_led>>led_count)&&(0b01);                     // led_count番目のビットが1:点灯、0:消灯
      led_count++;                                                                  // カウントインクリメント
      if(!(led_count-LED_DISP_CYCLE)) {                             // 約4sサイクル
           led_count = 0;                                                           // カウンタクリア
      }
}
1/4秒毎に点滅するはずなのに、点滅の間隔が長い。。。CPUのクロック設定をミスっているのか、タイマの間隔を計算ミスしているのか、あらゆる可能性を確認したのに不具合はない。。。。。う~~~ん、困った。。。。

と、思った瞬間、ミス発見。そういえば、以前にも全く同じミスを犯してバグ取りに苦労したことを思い出した。。。。いかん。学習能力が衰えている。反省。。。。

さて、上記プログラムのミスをあなたは発見できるか????

K.Kさん、H.Nさん、Y.Sさん、他3人が「いいね!」と言っています。

コメント:

H.N:led_countは表示パターンだけじゃなくて後半にモードがあるのだとすると,short じゃないといけないのではないでしょうか?外したかな? 2013/9/15 15:35

創結マスター:あ・・・H.Nさん、真剣に考えて下さってありがとうございます。惜しい! これだけの情報で答えろという方がいい加減でした。led_ledがパタン格納変数で unsigned short int型です。ヒントはビット演算です。 2013/9/15 16:49

H.N:残念,創結マスターさんのことだから論理的なミスはないだろうと思って,意外な理由だろうとは思うのですが,,, あと思いつくのは16進数表示の「0x」を付け忘れたとか…違ってたら降参です. 2013/9/15 17:03

創結マスター:残念。2進表示なので「0b」になってます。
答は、ビット演算で「and」をとるなら演算子は「&」なのですが、論理演算の「and」をとる「&&」と書いてしまっているところでした。ビット演算は、そんなに頻繁に使わないので、ついついくせで「&&」とタイプしてしまうんです。西さんも、こんなミスされないよう、お気を付け下さい。2013/9/15 17:12

H.N:なるほど,そういうことですね.そのような場面では私もやってしまいそうです.参考になりました.2013/9/15 17:17

創結マスター:ビット演算の&や|と論理演算の&&や||を間違えると、意外と発見が難しいので、頭の隅に入れておくと良いと思います。2013/9/15 17:22

<前へ>                   <次へ>

タイトルとURLをコピーしました