おやあ15khz以上だ。こんな高周波では聞こえない。間引きがうまく行っていない。高速でメインループをまわしながらBeep音を制御するのはちょうどマルチタスク的なテクニックを要求されるので、結構難しい。詳しくはソースコードを付けるので省略するが、やはり事前のロジックの吟味の不足を痛感した(要するに擬似コーディングが足らない)。悩んだのが、オシロの写真にもあるように、立ち上がりのチャタリングである。始め原因がわからず放置していたが、デバッグに疲れて寝床に入ったときに気が付いた(前もこんなことがあったような)。ロジックは、タイマーのカウンターを割り算(ビットシフト)で間引いて、一定の間隔で出力をトグルするのだが、メインループの廻る速さ(約50ステップ、10μs)の方が、カウンターが変わる速さ(53μs)よりはるかに早いため何度もトグルしてしまうというオチである。やって書いて見れば、何故これが今までわからなかったのだろうという至極当然な話なのだが、デバッグというのはどうもいつもこういうことを繰り返すようである。UARTをやめてタクトスイッチとスピーカーで制御(9/18/2012)UARTで圧電スピーカーの音を出したり止めたりすることが出来るようになった。音はまあお世辞にも良いとは言えない、単なる矩形波で周波数は500Hzくらいにする。音の濁りは矩形波なので完全にきれいにはならない。次のステップは、UARTではなく、本来のタクトスイッチで、各種の音を出しながら、タイムアウト設定値を選ぶロジックである。タクトスイッチは、チャタリングを避けるためメインループのサンプリング周期(13.65ms)で、状態を把握する。UARTをはずさなければならない。ソースからUART部を削除し、AVRStudioで、関係ソースを取り去ると(入っていると#includeしなくてもフラッシュが増えるときがある)、フラッシュサイズは、一気に400バイト以下になった。これで余裕を持ってロジックを組める。タイマーの割り込みルーチンに16ビットカウンターを新設して、これをBeep音の間隔制御に使う。フラグをさらに増やして、ここでステートマシンを作った。他にも方法があるのだろうけど今のところこれで何とかなった(ソースコード参照)。オシロで音の長さを確かめるが、どうも思ったようには鳴らない。「ぴ」や「ぴぴー」は良いのだが、「ぴぴぴー」の音が揃わない。しても「ぴっぴぴー」になってしまう。本質的な問題ではない。15秒くらいのタイムアウトが階段の照明には適当なようだ。何度もスイッチで音をだしながら設定を換えて楽しむ。これで焦電型人感センサーのソフトはほぼ想定どおりの機能を満足した。フラッシュサイズは500バイト余りなので、Tiny13でもあともう少し機能を盛り込める。ブレッドボード上なのでケーシングが待っているが、とりあえずは一段落だ。偶然にも時を同じくして、本来の階段の照明ランプが切れた。これを階段照明にして喜ぶ。珍しく家族が感心してくれた。苦心して作ったものは報われないけれど、何でもない仕掛けで思わぬ賞賛を受ける。例によって、AVRStudioのプロジェクトフォルダーに入れたソースコード一式をzipファイルにして置きます。回路図も改定しました。ソースファイル名は前と名前が換わっていないので注意してください。