-         

Ergebnis 1 bis 7 von 7

Thema: Geschwindigkeit des Interrupts

  1. #1

    Geschwindigkeit des Interrupts

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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...

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    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.

    [Edit]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.[/Edit]

    [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:
    http://www.roboternetz.de/phpBB2/zei...=327424#327424

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    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:
    Code:
    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" .
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken k2_1413.jpg  
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    ... nimmt man am besten den T1 pin ...
    Schön , wieder was gelernt. Ja, man müsste halt hinschauen können . . .

    Zitat Zitat von Besserwessi
    ... 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.
    Ciao sagt der JoeamBerg

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •