Tworzę mały analizator logiczny z 7 wejściami. Moje urządzenie docelowe to ATmega168
z częstotliwością taktowania 20 MHz. Aby wykryć zmiany logiczne, używam przerwań zmiany pinów. Teraz próbuję znaleźć najniższą częstotliwość próbkowania, jaką mogę wykryć te zmiany pinów. Ustaliłem wartość minimum 5,6 µs (178,5 kHz). Nie mogę poprawnie wychwycić każdego sygnału poniżej tego współczynnika.
Mój kod jest napisany w C (avr-gcc). Moja procedura wygląda następująco:
ISR () {pinc = PINC; // char timestamp_ll = TCNT1L; // char timestamp_lh = TCNT1H; // char timestamp_h = timerh; // 2-bajtowa liczba całkowita stack_counter ++;}
Moja przechwycona zmiana sygnału znajduje się w pinc
. Aby go zlokalizować, mam 4-bajtową wartość znacznika czasu.
W arkuszu danych przeczytałem, że procedura obsługi przerwań wymaga 5 zegarów, aby wskoczyć i 5 zegarów, aby powrócić do głównej procedury. Zakładam, że każde polecenie w moim ISR ()
wymaga 1 zegara do wykonania; Podsumowując, powinno to być narzut 5 + 5 + 5 = 15
. Czas trwania jednego zegara powinien być zgodny z częstotliwością zegara 20 MHz 1/20000000 = 0,00000005 = 50 ns
. Całkowity narzut w sekundach powinien zatem wynosić: 15 * 50 ns = 750 ns = 0,75 µs
. Teraz nie rozumiem, dlaczego nie mogę uchwycić niczego poniżej 5,6 µs. Czy ktoś może wyjaśnić, co się dzieje?