2009年4月1日水曜日

TinyでDRO!(ソフトウェア2)

データの頭出しは、データ送出の時間間隔が約0.3秒開いているという仕様に頼ります。0.3秒と仕様にしてはやや甘いので、実際のプログラムでは「0.25秒以上開いたら」という条件に置き換えます。

このタイミングはTimer1を使って計ります。システムクロックを256分周した周波数でカウントアップします。カウントアップの最大値が0.25秒で訪れるように比較一致レジスタOCR1Aを設定し、最大値に達したら自動ゼロクリアするようにCTC動作にします。

下図のタイミングチャートでは、データビットの送出タイミングに合わせてTimer1のカウント値がどのように変化するかを示しています。「絶対座標のデータ」または「相対座標のデータ」の下の部分を見て分かる通り、データビットを取り込むタイミング(INT1のハンドラ内)でTimer1をクリアしています(図の「エッジ割り込みでクリア」と書いてある部分)。0.25秒未満の短い間隔では決して最大値には達しません。

ところが、データを送出し終わってしばらくデータが来ないとTimer1を強制クリアする機会がなく、そのまま増加し続け、0.25秒経過の後ついには最大値=比較一致レジスタの値に達します(図の「比較一致」)。つまり、この時点でデータの区切りが訪れたと認識するのです。プログラムでは比較一致割り込みを起こさせるようにしてあり、そのハンドラの中でバッファポインタを先頭に持ってくる、つまりデータの頭出しをすることになります。以下は再び"interrupt.c"の該当部分です。(行間が空いているのはCPUタイプによるIF-DEFを消して見やすくしたためです。)

// スケールのデータ送信間隔を測る



ISR(TIMER1_COMPA_vect)

{
Rbufp = Rbuf; /* バッファポインタを先頭へ */
}

0 件のコメント: