7つの入力を持つ小さなロジックアナライザーを開発しています。ターゲットデバイスはATmega168
20MHzのクロックレートです。ロジックの変更を検出するには、ピン変更割り込みを使用します。今、私はこれらのピンの変化を検出できる最低のサンプルレートを見つけようとしています。私は、最小5.6 µs(178.5 kHz)の値を決定しました。このレートを下回るすべての信号は適切にキャプチャできません。
私のコードはC(avr-gcc)で書かれています。私のルーチンは次のようになります。
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
キャプチャした信号の変化はにありpinc
ます。それをローカライズするために、4バイト長のタイムスタンプ値があります。
データシートで私が読んだ割り込みサービスルーチンは、ジャンプするのに5クロック、メインプロシージャに戻るのに5クロックかかります。私の各コマンドのISR()
実行には1クロックかかると想定しています。要するに、5 + 5 + 5 = 15
クロックのオーバーヘッドがあるはずです。1クロックの持続時間は、20MHzのクロックレートに従う必要があります1/20000000 = 0.00000005 = 50 ns
。秒単位の合計オーバーヘッドは、次のようになります15 * 50 ns = 750 ns = 0.75 µs
。5.6 µs未満をキャプチャできない理由がわかりません。誰かが何が起こっているのか説明できますか?