アイキャッチの写真は沖縄から送ってもらったマンゴ。トロトロでおいしいのである。
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のクロック設定をミスっているのか、タイマの間隔を計算ミスしているのか、あらゆる可能性を確認したのに不具合はない。。。。。う~~~ん、困った。。。。
と、思った瞬間、ミス発見。そういえば、以前にも全く同じミスを犯してバグ取りに苦労したことを思い出した。。。。いかん。学習能力が衰えている。反省。。。。
さて、上記プログラムのミスをあなたは発見できるか????
(回答者) led_countは表示パターンだけじゃなくて後半にモードがあるのだとすると,short じゃないといけないのではないでしょうか?外したかな?
(私) あ・・・真剣に考えて下さってありがとうございます。惜しい! これだけの情報で答えろという方がいい加減でした。led_ledがパタン格納変数で unsigned short int型です。ヒントはビット演算です。
(回答者) 残念。論理的なミスはないだろうと思って,意外な理由だろうとは思うのですが,,, あと思いつくのは16進数表示の「0x」を付け忘れたとか…違ってたら降参です.
(私) 残念。2進表示なので「0b」になってます。
答は、ビット演算で「and」をとるなら演算子は「&」なのですが、論理演算の「and」をとる「&&」と書いてしまっているところでした。ビット演算は、そんなに頻繁に使わないので、ついついくせで「&&」とタイプしてしまうんです。みなさんも、こんなミスされないよう、お気を付け下さい。
(回答者) なるほど,そういうことですね.そのような場面では私もやってしまいそうです.参考になりました.
(私) ビット演算の&や|と論理演算の&&や||を間違えると、意外と発見が難しいので、頭の隅に入れておくと良いと思います。