Saya mengembangkan penganalisis logika kecil dengan 7 input. Perangkat target saya adalah ATmega168
dengan clock rate 20MHz. Untuk mendeteksi perubahan logika saya menggunakan interupsi perubahan pin. Sekarang saya mencoba mencari tahu laju sampel terendah yang dapat saya deteksi perubahan pin ini. Saya menentukan nilai minimum 5,6 μs (178,5 kHz). Setiap sinyal di bawah angka ini saya tidak bisa menangkap dengan benar.
Kode saya ditulis dalam C (avr-gcc). Rutinitas saya terlihat seperti:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Perubahan sinyal yang saya tangkap terletak di pinc
. Untuk melokalkannya saya memiliki nilai cap waktu yang panjang 4 byte.
Dalam datasheet saya membaca layanan rutin interupsi membutuhkan 5 jam untuk melompat dan 5 jam untuk kembali ke prosedur utama. Saya mengasumsikan setiap perintah di saya ISR()
mengambil 1 jam untuk dieksekusi; Jadi singkatnya harus ada overhead 5 + 5 + 5 = 15
jam. Durasi satu jam harus sesuai dengan laju jam 20MHz 1/20000000 = 0.00000005 = 50 ns
. Total overhead dalam detik harus kemudian: 15 * 50 ns = 750 ns = 0.75 µs
. Sekarang saya tidak mengerti mengapa saya tidak bisa menangkap apa pun di bawah 5,6 μs. Adakah yang bisa menjelaskan apa yang terjadi?