とりあえず、
- MassDuino UNO LCだとなんか不調なので他のに変えました
- keyer-testはLinuxだと動かないバグがあったので直しました
- keyer-test-arduinoは時折不思議な動作をするので直しました
3.についてはこれだけだと意味不明なのでもう少しきちんと書かないといけないのですが…とはいえ、確実にこれだという原因を掴めてはいません。多分こういう問題が起こっているんじゃないの、という推測を書きます。
タイマーのカウント(ATmega328PのTCNT1レジスタ)が特定の値になったらエレキーに対するパドル操作のイベントを実行するようになっているものの、何かの理由でイベントが実行されないという現象が時折起こる、これが「不思議な動作」です。エレキーからのキー出力の状態変化(off→on)を検出後にTCNT1を変更しそこからイベントを逐次実行していくという処理において、タイマーが動作中の状態でTCNT1を書き換え→その後TCNT1を読み出す、という作りに問題があるようです(自分もこれはなんか怪しい作りだなとは思っていました、作った人間自らがこういうことを書くのもどうかとは思いますが)。
行った対処で改善したことから考えるに、
- TCNT1を書き換える事自体に問題はない
- TCNT1を書き換えた直後、書き換えた値が変わらずにTCNT1から読み出せることを期待していることが原因
ということのようです。「何当たり前のこと言ってんだ」、と分かっている人からお叱りを受けそうな話なんですけどね。
TCNT1の書き換え、普通は初期化を行う等の場合においてタイマーを止めた状態で0を書き込み、その後タイマーを動かすのなら最初のtick(カウンタを増加させるためのクロックパルスとでも解釈してください)が発生するまでの間は0が読めるのでしょう。しかし、今回のような怪しい(既にタイマーは動作中でありいつtickが発生するかが全く分からない)状況では、書き換え直後〜読み出すまでの間、その値が不変となるタイミングを作り出す必要があるようです。
これとは別に、TCNT1から読み出した値が多少ずれても影響が出ないようイベントの実行タイミングを少し遅らせる方法も考えました。しかしTCNT1の値はキー出力の状態変化が発生した時刻の記録にも使用しているという理由により、この方法は採用していません。55.0kg(22:15)
