バグ発見
バグ発見
9月に書いた記事にバグを発見しました。製作をすすめていて現象に出くわしました。
g:ecrafts:id:Chuck:20040926#p1 この記事でロータリエンコーダをタイマ割り込みで変化点を見つけて処理していました。しかしこの製作で使用した秋月のロータリエンコーダでは、状態によっては電源投入やリセット時の一番最初の割り込みで誤って変化点を取ってしまうことがあることがわかりました。
イニシャルに例外処理をもたせるよりは、ロータリエンコーダのデータ処理をグレイコードを用いた方法に替えるのが良さそうです。
替えてみました
ロータリエンコーダの2相の信号を2bitの信号に見立てて、タイマ割り込みでサンプリングして、サンプル間の値遷移を見て処理する方法にしてみました。リセット時には対処されたようですが、電源投入時には値が変化してしまうようです。
いや、もう少し詳しく調べてみたら、電源断時に記憶させていた値が変化してしまっているようです。電気二重層コンデンサのおかげでAVRはスリープして値を保持しようとしているのに対して、ロータリエンコーダのプルアップは落ちてしまいます。このときにロータリエンコーダが動いたと誤って値が変化してしまうのだとわかりました。
さてどうするか。電源断検出に遅れがあり、これがなされるまではプルアップの電圧が保持されて欲しいわけです。AVRマイコンには大きめの電気二重層コンデンサをあてがって、別にコンデンサを用意してプルアップを繋いでおくのが良さそうですが、趣味とはいえ泥縄な対応だなぁ。