PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschwindigkeit des Interrupts



warnewave
18.12.2007, 17:18
Hallo!
Ich möchte mit dem Atmega 32 eine Frequenz von bis zu 900 kHz messen. Dafür liegt das Signal auf dem INT0. Es scheint mir allerdings, dass der Interrupt zu langsam ist und nur Frequenzen bis ca 25000 Hz messen kann. Kann mir vielleicht einer sagen wie schnell der Interrupt ist und ob es ansonsten irgendwie möglich ist soche Frequenzen mit diesem Board zu messen oder mit welchem anderen Board?

Gruß Sara

askazo
18.12.2007, 17:26
Wenn ich das im Datenblatt richtig verstanden habe, braucht der Interrupt 4 Taktzyklen bis die ISR aufgerufen wird. Das kritische ist aber wohl die Ausführungsdauer der ISR, und die hängt von der Qualität Deines Codes ab.
Was treibst Du denn alles in der ISR und wie hoch ist Deine Taktfrequenz?

askazo

uwegw
18.12.2007, 17:28
Wie schnell ist der AVR getaktet?

Mal durchrechnen:
Wenn der Interrupt reinkommt, muss der PC gepusht werden, und es erfolge ein Sprung auf den Interruptvektor. Von der Wirkung her mit einem RCALL vergleichbar, daher setze ich es mal mit 3 Takten an.
Am Interruptvektor steht dann ein RJMP zur Routine. Macht 2 Takte.
Dann erst kommt die eigentliche Interruptroutine dran. Wie lange die braucht, musst du wissen.
Schließlich dann noch mit RETI zurück zum Hauptprogramm, 4 Takte.
Macht also 7 Takte + Dauer der ISR für jeden Interrupt. Mit deinen 900kHz dürfte es selbst bei 16MHz Systemtakt sehr eng werden...

radbruch
18.12.2007, 17:52
Hallo


... es ansonsten irgendwie möglich ist solche Frequenzen mit diesem Board zu messen?
Vielleicht wäre man mit Pollen des Eingangs schnell genug? Warten auf die Flanke und dann solange einen Zähler hochzählen bis sich der Pegel am Pin wieder ändert. Wenn der AVR sonst nichts anderes macht würde sich die Frequenz über den Zählerstand und die Ausführungszeit für das Hochzählen mit Pinabfrage errechnen lassen:

zähler=0
while (pin==low)
do zähler++ while (pin==high)

Nach dem Kompilieren muss man dann im Assemblerlisting die Do-While-Schleife suchen und die Takte zusammenzählen und kann dann über die Prozessortaktfrequenz die Ausführungszeit der Zählschleife ermitteln. Oder man könnte den Zählwert auch kalibrieren, wenn man eine passende Vergleichsfrequenz zur Verfügung hat.

Angaben zum Board und der Art der Frequenz (Spannung, Kurvenform) währen hilfreich für weitere Ideen.

Oje, völlig falscher Ansatz, ich ziehe den Beitrag hiermit zurück. Wir müssen ja die Flanken über der Zeit Zählen und nicht die Länge des Impulses. Mit meinem Ansatz kommen wir bei weitem nicht in den geforderten Frequenzbereich.

[nocheinedit] Nach einem Blick ins Datenblatt (das sollte man wohl besser zuerst machen) denke ich, "Input Capture" (Seite 93ff) führt wohl zum gewünschten Ergebniss:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=327424#327424

Gruß

mic

oberallgeier
18.12.2007, 19:10
Hmmm, also ich hab mal schnell einen tiny2313 genommen, ext. Takt 16 MHz, prescaler 1 (also 1:1), waveform = CTC, preload =20 und den code der ISR:
tmr0cah: ;===
in ac,portb
com ac
out portb,ac
reti ;=====----->>>>>man möge mir die stümperhafte Registersicherung entschuldigen - es läuft ja im main blos label - goto label.

Dann kommt bei timebase 1 µs folgendes Bild.

Ein Test mit preload 5 zeigt auch noch keine "Unanständigkeiten" :) .

Besserwessi
18.12.2007, 22:11
Zum messen von hohen Frequenzen nimmt man am besten den T1 pin (pin 9 beim Tiny2313). Dann zählt der der Timer das externe Signal, das maximal die halbe (realistischer 1/3) Taktfrequenz haben darf. Die Frequenz wird dann wie bei einem klassischen Frequenzzähler als die Zahl der Pulse in 1 s gemessen.
Eine andere Alternative ist ein externer Teile um die Frequenz auf unter ca. 200 kHz zu kriegen und dann die Periodendauer mit der ICP Funktion messen. Bei mir geht das bei 20 MHz Takt bis etwas über 300 kHz.

Mit einer extra kurzen interruptroutine könnte es vielleicht gerade noch mit dem ICP oder INT0 pin gehen, wird aber schon sehr knapp. Da hat man dann kaum Zeit um den Verteil den der ICP pin bietet zu nutzen.

oberallgeier
18.12.2007, 22:54
... nimmt man am besten den T1 pin ...Schön :) , wieder was gelernt. Ja, man müsste halt hinschauen können . . .


... Bei mir geht das bei 20 MHz Takt bis etwas über 300 kHz ...Na zum Glück komme ich bei meiner Anwendung mit 10 kHz noch SEHR gut hin.