Sto sviluppando un piccolo analizzatore logico con 7 ingressi. Il mio dispositivo di destinazione è un ATmega168
con una frequenza di clock di 20 MHz. Per rilevare le modifiche logiche uso gli interrupt di modifica pin. Ora sto cercando di scoprire la frequenza di campionamento più bassa che posso rilevare queste modifiche ai pin. Ho determinato un valore di minimo 5,6 µs (178,5 kHz). Ogni segnale al di sotto di questa frequenza non riesco a catturare correttamente.
Il mio codice è scritto in C (avr-gcc). La mia routine è simile a:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Il mio cambio di segnale acquisito si trova in pinc
. Per localizzarlo ho un valore di timestamp lungo 4 byte.
Nel foglio dati ho letto che la routine di servizio di interruzione impiega 5 orologi per saltare e 5 orologi per tornare alla procedura principale. Suppongo che ogni comando nel mio ISR()
stia prendendo 1 clock da eseguire; Quindi in breve dovrebbe esserci un sovraccarico di 5 + 5 + 5 = 15
orologi. La durata di un clock dovrebbe essere in base alla frequenza di 20 MHz 1/20000000 = 0.00000005 = 50 ns
. L'overhead totale in secondi dovrebbe essere quindi: 15 * 50 ns = 750 ns = 0.75 µs
. Ora non capisco perché non riesco a catturare nulla al di sotto di 5,6 µs. Qualcuno può spiegare cosa sta succedendo?