割り込みの開始は、新たな送信要求のときに設定する。ここは何度繰り返しても問題ない。途中経過が暴れる時もあるが、12ビットの赤外線データは、ほぼ100%正しくデコードされた。最初は安定しなかったが丁寧に閾値を調整すると100発100中になった。これもUARTでパルスの幅を調整できたお陰だ。その後途中経過が暴れる不具合もリングバッファー終点の計算間違いが発見され解決した。よーし、赤外線リモコンの部分は完全だ。送信割り込みのUARTも前々から気になっていたが、これで安心して高速なところにUARTを使える。赤外線データの解析はフォーマットが多種多様なのでこれ以上深入りせず、次の電子ボリュームの制御の方に開発の方向を移した。ソフトSPI(マスター)を作った(11/16/2010)電子ボリュームPGA2311の入力インターフェースはSPIである。Tiny2313にはSPIはない。USIを使っても良いが、こいつは癖があって簡単には動かない。速さも量も求められていないし、GPIOで作るほうが簡単なように思えた。いうのでGPIO(汎用ピン)でソフトSPI(マスター)を作ってみた。この開発には、このあいだ買ったZeroPlusのロジックアナライザーが大活躍した。プロトコルアナライザーがついているので、SPIのデータもいちいち波形を数えて調べる必要がない。UARTも簡単にデコードしてくれる。出来上がったが、送信したビットがどうしても1ビットずれて送信されてしまう。簡単なロジックなのにどこが悪いのか、いくら調べても解決できない。諦めてもう寝ようと風呂に入っているとき気がついた。赤外線のデータをSPIに送るとき、データを左シフトさせながらMSBを取り出し、8回ループして送信データを作る。あっあっあっ、こりゃ、だめだ。最後の1ビットのあとに次の(不要な)シフトをして見事に1ビット欠けた送信データを作っている。Whileではなく、do{..}whileでないといけないケースである。風呂に入らないと、この程度のバグも見つけられないというのは困ったものだ。これを直して、基本的な開発は完成した。あとは、電子ボリュームの値をどう保存し、表示を7セグLEDかLCDにするか、付加機能をどこまでつけるかなどの細かい仕様が残っているが、開発の峠は越したようだ。ブレッドボードでは完成(11/20/2010)実際のケースに実装する前に、ブレッドボードにPGA2311を載せ、音源を先のLPCMプレーヤー(テスト用にブレッドボードに常駐)にして動作テストをした。7セグLEDはFPGAで使った基板を流用し、その2ヶ分をTiny2313につなぐ。ピンを全部使い切った。受信確認用のLEDはつけられない。これはデバッグ用のUARTをはずしたときにつけられる。フラッシュも一杯になってきた。ChaNさんの便利なxprintfはもう入らない。7セグLEDが動くまではUARTが欲しいので自前の十進変換ルーチンを使ってしのぐ。ブレッドボードなので配線はすぐ終わった。7セグの開発はあとまわしにして、まずPGA2311の動作を確認する。データを送ると、「ポソポソ」という小さいノイズは聞こえるので信号がPGA2311まで行っているのは間違いないが、肝腎の音が出ない。ロジアナで見る限り、SPIは完全に仕様どおり音量データ(0~255のバイナリ)を両チャンネル分送っている。電源配線も間違いない。MUTEという音を止めるピンは負論理なので関係ないはずだ。upしてみるが当然何の変わりもない。これ以上調べるところがない。upして動かしてみた。何ということだ、これで動いたのである。MUTEは浮かせておくと動かないのだ。SPIでデータを一回は送らないと音が出ない。それならそうとデータシートに、はっきり書いておいて欲しい。動いたときの気分はいつも爽快このうえない。ブレッドボードではあるがリモコンで自由に音量が変えられる。