Estoy desarrollando un pequeño analizador lógico con 7 entradas. Mi dispositivo objetivo es ATmega168
con una frecuencia de reloj de 20MHz. Para detectar cambios lógicos, uso interrupciones de cambio de pin. Ahora estoy tratando de encontrar la frecuencia de muestreo más baja que pueda detectar estos cambios de pin. Determiné un valor mínimo de 5.6 µs (178.5 kHz). Cada señal por debajo de esta velocidad no puedo capturar correctamente.
Mi código está escrito en C (avr-gcc). Mi rutina se ve así:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Mi cambio de señal capturado se encuentra en pinc
. Para localizarlo, tengo un valor de marca de tiempo de 4 bytes.
En la hoja de datos que leí, la rutina de servicio de interrupción toma 5 relojes para saltar y 5 relojes para volver al procedimiento principal. Supongo que cada comando en mi ISR()
toma 1 reloj para ejecutarse; En resumen, debería haber una sobrecarga de 5 + 5 + 5 = 15
relojes. La duración de un reloj debe estar de acuerdo con la velocidad del reloj de 20MHz 1/20000000 = 0.00000005 = 50 ns
. La sobrecarga total en el segundo debe ser a continuación: 15 * 50 ns = 750 ns = 0.75 µs
. Ahora no entiendo por qué no puedo capturar nada por debajo de 5.6 µs. ¿Alguien puede explicar lo que está pasando?