Alle 10µs Interrupt

Gast #1514654
Hallo,

irgendwie bin ich grad etwas durcheinander.

Ich möchte alle 10µs einen Interrupt erzeugen.

Ich habe einen 16 MHz Quarz. Ich nehme einen Prescaler von 32.

16M/32 = 500000

Also 500000 "zähler" pro Sekunde.

500000 * 10^-6 ergibt dann 0,5 Zähler pro µs.

Also müsste ein OCR Wert von 5 doch alle 10 µs zum Interrupt führen 
oder?
@  martin (Gast)

>Ich möchte alle 10µs einen Interrupt erzeugen.

Willst du das WIRKLICH? Wozu glaubst du das zu brauchen?
Damit ist dein AVR ziemlich zugebügelt.

>500000 * 10^-6 ergibt dann 0,5 Zähler pro µs.

Logisch bei 500kHz.

>Also müsste ein OCR Wert von 5 doch alle 10 µs zum Interrupt führen
>oder?

Nöö, da muss 4 rein, denn der Zähler zählst von 0..4 = 6 Takte. Aber der 
CTC Modus wäre hier sinnvoll. Wobei 10uS Interrupt alles andere als 
sinnvoll klingt. Auch bei 16 MHz.

MfG
Falk
Ups, Sorry

Denkfehler. Ich war irgendwie bei 0,5µs je Zählen hängengeblieben.

Dann sollte 5 natürlich als OCR-Wert stimmen.
CTC ist bei der Sache wirklich wichtig und man sollte darauf achten daß 
in der Interrupt-Routine nicht zu viel passiert. Sind ja nur 160 Takte 
zwischen den Interrupts...
tobi schrieb:
> ATmega32 Timer2 (Timer0 ist andersweitig belegt).
>
> Datenblatt seite 127.
Ah ja, da hat der Timer 2 noch ein paar mehr zur Verfügung, wieder was 
gelernt :-)

Falk Brunner schrieb:
>>Ich möchte alle 10µs einen Interrupt erzeugen.
>...
>>Also müsste ein OCR Wert von 5 doch alle 10 µs zum Interrupt führen
>>oder?
>
> Nöö, da muss 4 rein, denn der Zähler zählst von 0..4 = 6 Takte. Aber der
Ähm, ich bin aber auch für 5 :-)
Funktion:
Zählt los bei 0. Nach 2µs auf 1, nach 4µs auf 2, nach 6µs auf 3, nach 
8µs auf 4, nach 10µs auf 5 --> Compareinterrupt nach 10 µs.

> CTC Modus wäre hier sinnvoll. Wobei 10uS Interrupt alles andere als
> sinnvoll klingt. Auch bei 16 MHz.
ACK.

Reinhard
martin schrieb:
> Ich möchte für einen Test gucken wie lange ca. eine Berechnung dauert
> ohne den Assembler dafür durchzugehen.
Dann verzichte doch auf die hohe Interruptlast und lies' vor und nach 
der Berechnung den Wert eines frei laufenden Timers ein und bilde die 
Differenz zwischen danach und davor - und schon weißt Du, wie lange die 
Berechnung gedauert hat.

Das kannst Du noch beliebig ausbauen mit Max- und Minzeit, gemittelte 
Zeit, ...

Gruß,
Bernd
Gast
Freilaufender Timer?

Also einfach den Timer starten und den Interrupt augeschaltet lassen und 
dann vorher und nachher jeweils das TCNT2 Register lesen?

Daran hab ich garnicht gedacht.
@  martin (Gast)

>Ich möchte für einen Test gucken wie lange ca. eine Berechnung dauert
>ohne den Assembler dafür durchzugehen.

Was ja auch soooo aufwendig ist. Und vor allem durch die 100kHz 
Interrupts die Ganze Sache überhaupt nicht verfälscht wird.

Eieieiei. Siehe Netiquette.

MFG
Falk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.