Je développe un petit analyseur logique avec 7 entrées. Mon appareil cible est un ATmega168
avec une fréquence d'horloge de 20 MHz. Pour détecter les changements logiques, j'utilise des interruptions de changement de broche. Maintenant, j'essaie de trouver le taux d'échantillonnage le plus bas que je puisse détecter ces changements de broches. J'ai déterminé une valeur minimale de 5,6 µs (178,5 kHz). Chaque signal en dessous de ce taux, je ne peux pas capturer correctement.
Mon code est écrit en C (avr-gcc). Ma routine ressemble à:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Mon changement de signal capturé est situé à pinc
. Pour le localiser, j'ai une valeur d'horodatage longue de 4 octets.
Dans la fiche technique, j'ai lu que la routine de service d'interruption prend 5 horloges pour sauter et 5 horloges pour revenir à la procédure principale. Je suppose que chaque commande de mon ISR()
prend 1 horloge à exécuter; Donc, en somme, il devrait y avoir une surcharge d' 5 + 5 + 5 = 15
horloges. La durée d'une horloge doit être fonction de la fréquence d'horloge de 20 MHz 1/20000000 = 0.00000005 = 50 ns
. Le total des coûts indirects en quelques secondes devrait être alors: 15 * 50 ns = 750 ns = 0.75 µs
. Maintenant, je ne comprends pas pourquoi je ne peux pas capturer quoi que ce soit en dessous de 5,6 µs. Quelqu'un peut-il expliquer ce qui se passe?