Estou desenvolvendo um pequeno analisador lógico com 7 entradas. Meu dispositivo de destino é um ATmega168
com uma taxa de clock de 20 MHz. Para detectar alterações lógicas, uso interrupções de alteração de pinos. Agora estou tentando descobrir a menor taxa de amostragem possível de detectar essas alterações de pinos. Eu determinei um valor mínimo de 5,6 µs (178,5 kHz). Não é possível capturar todos os sinais abaixo dessa taxa.
Meu código está escrito em C (avr-gcc). Minha rotina se parece com:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Minha alteração de sinal capturada está localizada em pinc
. Para localizá-lo, tenho um valor de carimbo de data / hora de 4 bytes.
Na folha de dados, li que a rotina de serviço de interrupção leva 5 relógios para saltar e 5 para retornar ao procedimento principal. Estou assumindo que cada comando no meu ISR()
está levando 1 relógio para ser executado; Então, em suma, deve haver uma sobrecarga de 5 + 5 + 5 = 15
relógios. A duração de um relógio deve estar de acordo com a taxa de clock de 20MHz 1/20000000 = 0.00000005 = 50 ns
. A sobrecarga total, em segundos deveria ser, em seguida,: 15 * 50 ns = 750 ns = 0.75 µs
. Agora não entendo por que não consigo capturar nada abaixo de 5,6 µs. Alguém pode explicar o que está acontecendo?