割り込みでポインターがずれてしまうのか。あれこれ可能性を考える。直ったが、バッファー最終端と、満杯になるポイントは一定ではない。出力を繰り返していれば、いつかはまたぶつかる。なんだ解決になっていないじゃないか。当面は動いているが、爆弾を抱えているようなものだ。これも暫くして(風呂に入っているとき)、原因が判明した。わかってしまえば、至極当たり前のことに、この2日間悩んでいた自分があほらしくなる。何のことはない、書き込みは一度に2バイトなのに、1バイト減ったところで書き込み許可を与えていたのである。やれやれ何とお馬鹿な。さあ、これでもう大丈夫とメッセージを大量に出し、全く問題なく表示されるのを、にんまりと眺めていて、また落とし穴に落ちてしまった。今度は、これまでうまくいっていた受信が出来なくなったのである。いやいや、次から次に大変である。受信もフレーム2つに分ける必要があった(4/10/2014)正しく文字は入っているのだが、エコーバックの送信が乱れる。ロジアナの波形に首を傾げる。ロジアナの送信波形には送信直前にグリッチが入っているのが見える。受信の直後、必ず送信ラインが数μs分0になってしまう。これではエコーバックのとき予定より早めにスタートビットが始まって誤動作する。見るとグリッチと同期しているのは受信の時のUSIDRの読み出しで送信関数ではない。エコーバックの時だけ乱れるので、タイマーで遅れを作ればいいのだろうが、こういう対症療法は一番やりたくない。すると受信のシフトレジスターが8ビット動いたとき、バッファーが空になるので送信ラインが0になってしまうのだろうか。いうことは8ビットレジスターでデータを受け取ると、必ず0になってしまうのか。送信ラインと同じように2回にわたって読み取る必要があるのか。物は試しと、受信の時、適当なデータをあらかじめUSIDRに入れ、受信してみた。ロジアナには、入れたデータと全く同じデータが送信ラインに出た。USIのシフトレジスターは8ビットを読み切れば、必ず出力が0になってしまうのだ。原因がわかれば、解決は早い。送信と同じように、受信も2回にわけてデータを読み取り、USIDRには1のデータを残すようなコードを加えた。いやあ、USIは難しい。ロジアナには綺麗な波形が出て、コンソール上も全く字化けがなくなった。いやはや今度もドラマの連続だったなあ。ソースコードと回路図の公開(4/11/2014)余り利用する人はいないだろうけれど、せっかくここまで苦労して開発したコードだ。ライブラリーとして公開することにした。フラッシュも少し喰うし(200バイトほど多い)、新たに8ビットタイマーのリソースを必要とするので使う機会は少ないかもしれないが、非同期処理などでCPUを持っていかれたくないときのUARTとして使ってもらえば嬉しい。ボーレートの設定が少し厄介かもしれない。クロックによって、ボーレートの下限や上限が出てくる。場合によっては、プリスケールを変更する必要がある。Atmelのソースコードには、#defineを使ったタイマーの設定が出来ているが、こういうのってバグが出ることが多いので、ここではやめた(単にさぼっているだけです)。回路図とメインプログラムのusi861.cは、単にこのUSI-UARTの動作確認だけのテスト用プログラムである。16ビットのPWMをやりたい人には参考になるかもしれない。このUSI-UARTは半二重である。全二重にするには完全なハードウエアがない限りもともと無理である。この原型となったソフトUARTもGPIOというCPUリソースを共用しているので勿論半二重である。ここにいつものようにAVRStudioのフォルダーにしたソースコード一式をzipファイルにしておきます。