Я разрабатываю небольшой логический анализатор с 7 входами. Мое целевое устройство ATmega168
с тактовой частотой 20 МГц. Для обнаружения логических изменений я использую прерывания смены контактов. Сейчас я пытаюсь определить минимальную частоту дискретизации, которую я могу обнаружить при смене контактов. Я определил значение минимум 5,6 мкс (178,5 кГц). Каждый сигнал ниже этой скорости я не могу уловить правильно.
Мой код написан на 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
часов. Продолжительность одного тактового генератора должна соответствовать тактовой частоте 20 МГц 1/20000000 = 0.00000005 = 50 ns
. Общие накладные расходы в секундах должны быть то: 15 * 50 ns = 750 ns = 0.75 µs
. Теперь я не понимаю, почему я не могу сделать снимок ниже 5,6 мкс. Кто-нибудь может объяснить, что происходит?