Ich entwickle einen kleinen Logikanalysator mit 7 Eingängen. Mein Zielgerät ist ein ATmega168
mit einer Taktrate von 20 MHz. Um logische Änderungen zu erkennen, verwende ich Pinwechsel-Interrupts. Jetzt versuche ich herauszufinden, mit welcher niedrigsten Abtastrate ich diese Pin-Änderungen feststellen kann. Ich habe einen Wert von mindestens 5,6 µs (178,5 kHz) bestimmt. Jedes Signal unterhalb dieser Rate kann ich nicht richtig erfassen.
Mein Code ist in C (avr-gcc) geschrieben. Meine Routine sieht aus wie:
ISR()
{
pinc = PINC; // char
timestamp_ll = TCNT1L; // char
timestamp_lh = TCNT1H; // char
timestamp_h = timerh; // 2 byte integer
stack_counter++;
}
Meine erfasste Signaländerung befindet sich unter pinc
. Um es zu lokalisieren, habe ich einen 4 Byte langen Zeitstempelwert.
Im Datenblatt habe ich gelesen, dass die Interrupt-Serviceroutine 5 Takte benötigt, um einzuspringen, und 5 Takte, um zur Hauptprozedur zurückzukehren. Ich gehe davon aus, dass jeder Befehl in meinem ISR()
1 Takt benötigt, um ausgeführt zu werden. Insgesamt sollte es also einen Overhead von 5 + 5 + 5 = 15
Uhren geben. Die Dauer eines Takts sollte der Taktrate von 20 MHz entsprechen 1/20000000 = 0.00000005 = 50 ns
. Der Gesamtaufwand in Sekunden sollte dann sein : 15 * 50 ns = 750 ns = 0.75 µs
. Jetzt verstehe ich nicht, warum ich nichts unter 5,6 µs erfassen kann. Kann jemand erklären, was los ist?