・CPU システム クロック周波数 : 10MHz ・T1採取可能最大周波数 : 5MHz ・測定可能最大周波数 : 5MHz×80=400MHz ・ゲート時間 : 80ms (T1最大計数=400000) ・最小分解能 : 1kHz ・誤差 : 通常・・・±1kHz (デジタル固有の1bit誤差を含む) 特定周波数・・・最大+9kHz ・表示桁形式 : xxx.xxx MHz (先行0は空白置換) ・RS232 : 9600bps 8ビット パリティなし 1ストップ ビット 周波数測定の基本は1秒間に於ける入力周波数のパルス数を測定することです。 本機では、これをATtiny2313の16ビット タイマ/カウンタ1で計数を行います。 従って、このタイマ/カウンタ1は外部クロック入力(立ち下りエッジ)駆動で使用します。 本質的にパルス数を計数するだけですので、立ち上り/立ち下りの両ヘッジの違いはありません。 本機では、この周波数測定を1kHz分解能固定で処理します。 1kHz分解能は換言すると、1ms間の入力パルス数に相当します。 然しながら、本機には1/80の前置分周器があります。 このためにCPUでの計測結果を80倍しなければなりません。 これは結果的に本来の1ms間ではなく、80ms間のパルス数を計数することで達せられます。 従って、本機では80ms間の入力パルス数を計数し、その計数値を1kHz単位の周波数とすることでCPU内での演算を省きます。 本機のCPU システム クロックは10MHzです。 ATtiny2313のタイマ/カウンタ1の外部クロック入力は、入力クロックが正確な50%/50%デューティ比なら、CPU システム クロックの半分の周波数までの入力クロックを受付ます。 従って、CPU自体での最大計測可能入力クロック周波数は5MHzになります。 本機は1/80の前置分周器を持つため、本機総体での最大計測可能入力クロック周波数は、5MHz×80=400MHzになります。 入力信号及び回路変動などを考慮した実用最大計測可能入力クロック周波数は、概ねその90〜95%程度と予測されます。 ゲート時間(80ms)での最大入力周波数(外部入力=400MHz,CPU入力=5MHz)での計数値は400000です。16ビット タイマ/カウンタ1単体では超過するため、タイマ/カウンタ1のオーバーフロー割り込みを使用してビット数を24ビット(TCNT1の下位16ビットと変数による上位8ビット(1バイト))に拡張します。 最大計数値が400000なので1バイト変数からのオーバーフローは有り得ません。 タイマ/カウンタ1のオーバーフロー割り込みは精度に影響しません。 ゲート時間(80ms)はCPU内部で8ビット タイマ/カウンタ0を利用して行われます。 タイマ/カウンタ0は比較一致タイマ/カウンタ リセット(CTC)動作で使用し、比較Aレジスタを250-1に設定することで、250システム クロック(25μs)毎にタイマ/カウンタ0比較A一致割り込みを生成します。 この割り込みでは、1000÷25=40の前置分周変数によって1msを計時します。 この1msを基にゲート時間の80msを計時します。 上記のタイマ/カウンタ0比較A一致割り込み内で80msの計時完了毎に入力パルス計数値を確定します。 実際にはタイマ/カウンタ1(TCNT1)値と上位1バイト変数の計3バイトを確定計数変数に複写します。 ここで注意を要するのが上位1バイト変数です。 タイマ/カウンタ0比較A一致割り込み開始からTCNT1読み込みまでの間でタイマ/カウンタ1のオーバーフローが起こる場合、上位1バイト変数は-1された値が確定値とされてしまいます。 この問題を避けるため、上記状態の可能性が高い場合、実処理上は読み込んだTCNT1の上位バイトが$00の場合、この割り込み処理内で割り込みを許可することでタイマ/カウンタ1のオーバーフロー割り込みを実行させ、その割り込みからの復帰後に上位1バイト変数を確定/複写します。 ゲート時間(80ms)計時完了時のタイマ/カウンタ0比較A一致割り込みは、主処理で必ず計数完了待機状態で起きます。 この計数完了待機は1及び2クロック実行命令で構成されるため、その誤差は1システム クロックです。 この誤差とタイマ/カウンタ1の1計数誤差が通常の誤差です。 本機に於ける最大誤差はタイマ/カウンタ0比較A一致割り込みとタイマ/カウンタ1のオーバーフロー割り込みが同時に発生した場合です。 この場合、ハードウェアによる優先順位によってタイマ/カウンタ1のオーバーフロー割り込みが先に実行されます。 従ってタイマ/カウンタ0比較A一致割り込みはタイマ/カウンタ1のオーバーフロー割り込み処理時間分送らされます。 然しながら、この最大誤差要因は連続的に発生する確率が非常に低いため、一般的には一過性となるでしょう。 * プログラムの流れ 1. 初期化 2. 主処理 2-1. 計数完了待機 (80ms計時完了(LED点灯)まで待機) 2-2. 24ビット バイナリをパック化BCD(8桁)に変換 2-3. パック化BCD(8桁)を8バイト文字列に変換 (含む0消去処理) 2-4. 送信文字列作成 (位置補正と小数点,単位付加) 2-5. LED消灯待機 2-6. RS232文字列送信 2-2.〜2-4.は概ね200μs程度で終了します。 2-5.は指定したゲートLED点灯時間に依存します。 既定は10msで、この時間経過後にLEDを消灯します。 2-6.は全部で12バイトを送信し、1バイトが約1msで、実際にはUSARTが2バイト分バッファすることになるため、ここでの処理時間は約10msです。 従って、2-1.での待機はゲートLED点灯時間が既定の10msならば60ms近くになります。 * ゲートLED点灯時間 既定は10msですが1ms単位でソースにて変更できます。 設定可能な最小値は1ですが、基本的に前記の2-1.での80ms計時完了から2-4.の送信文字列作成完了までの時間以下は無意味です。 また、この計時が最大1msの誤差を伴うため、極端に小さな値は点灯時間誤差が大きくなります。 設定可能な最大値は79ですが、69以上の値は採取値の処理欠落を引き起こします。 これによる見た目の影響は特にありませんが、受信側で値を記録している場合には問題になるでしょう。 80以上の値設定は動作不良を引き起こします。 * RS232送信形式 周波数表示は1ゲート時間毎に以下の形式(順)で送信されます。 ( 1) 100MHz桁 : '1'($31)から'9'($39)又は' '($20) ( 2) 10MHz桁 : '0'($30)から'9'($39)又は' '($20) ( 3) 1MHz桁 : '0'($30)から'9'($39) ( 4) 小数点 : '.'($2E) ( 5) 100kHz : '0'($30)から'9'($39) ( 6) 10kHz : '0'($30)から'9'($39) ( 7) 1kHz : '0'($30)から'9'($39) ( 8) 空白 : ' '($20) ( 9) M : 'M'($4D) (10) H : 'H'($48) (11) z : 'z'($7A) (12) CR : CR($0D) * パソコンでの受信 パソコン側ではターミナル プログラム(例えばハイパー ターミナルなど)で受信できます。 その場合、CR符号を復帰のみに設定すれば、1行内で繰り返し表示され、CR符号を復帰改行設定にすれば、ゲート時間毎に行表示が連続的に表示されます。 DOS環境(またはWindowsのコマンド プロンプト)では、HRSVとCOPYXで表示できます。 COM1で使用する場合は以下のコマンドを入力します。 C:>HRSV C:>COPYX AUX CON これによって1行内で繰り返し表示されます。 COPYXの終了はctrl+Zまたはctrl+Cで行います。