Estoy desarrollando un pequeño analizador lógico con 7 entradas. Mi dispositivo de destino es un ATmega168
con una frecuencia de reloj de 20MHz. Para detectar cambios lógicos utilizo 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 tasa no puedo capturar correctamente.
Mi código está escrito en C (avr-gcc). Mi rutina se ve como:
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 capturada se encuentra en pinc
. Para localizarlo tengo un valor de marca de tiempo largo de 4 bytes.
En la hoja de datos, leí que la rutina de servicio de interrupción requiere 5 relojes para saltar y 5 relojes para volver al procedimiento principal. Supongo que cada comando en mi ISR()
está tomando 1 reloj para ejecutarse; Entonces, en suma, debería haber una sobrecarga de 5 + 5 + 5 = 15
relojes. La duración de un reloj debe estar de acuerdo con la frecuencia de reloj de 20MHz 1/20000000 = 0.00000005 = 50 ns
. La sobrecarga total en segundos debe ser entonces: 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?