Forum: Mikrocontroller und Digitale Elektronik Timer Abtastrate ?


von Michael H. (h_m)


Lesenswert?

Hallo,


ich habe einen Atmega328p mit einem exteren Quarz 16MHz beschaltet.

ich verwende den Timer1 im CTC-interupt-Modus. Ich will Die ISR ca im 
1MHz Takt aufrufen. Geht das überhaupt ?

den bei meinen Berechnungen komme ich immer nur auf zwei Khz (2000 mal 
in der sekunde) für den Vergleichswert.

ich rechne Taktfrequenz des Mikrocontrollers / Prescaler * die Zeit

das wäre jetzt 16000000/256*1e6 = 0,0625

mir ist natürlich klar das warscheinlich einen anderen Vorteiler zb 1 
brauche, aber ich komme irgendwie auf keinen grünen Zweig.

könnte mir bitte jemand den Rechenweg zb. jetzt für 1MHz zeigen


Grüsse Huber

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Michael H. schrieb:
> Ich will Die ISR ca im
> 1MHz Takt aufrufen. Geht das überhaupt ?

Tja, wenn deine ISR auch nur 16 Takte braucht, ist der MC voll 
ausgelastet, denn am Ende der 16 Takte steht schon die nächste ISR an.
Das wird also schon sehr, sehr knapp - egal, was du du in der ISR 
veranstalten willst.
Ich sehe folgende Lösungen
* MC Takt auf 20Mhz erhöhen, dann hast du 20 Takte Luft.
* externe Hardware verwenden.

Technisch geht das. Du stellt den Timer auf CTC und lädtst das CTC 
Register (meistens eines der OC Register) mit 15 vor. Prescaler auf 1.

von Falk B. (falk)


Lesenswert?

@Michael Huber (h_m)

>ich verwende den Timer1 im CTC-interupt-Modus. Ich will Die ISR ca im
>1MHz Takt aufrufen. Geht das überhaupt ?

Ja, dann hast du 16 Takte pro ISR. Ob das so sinnvoll ist?

>könnte mir bitte jemand den Rechenweg zb. jetzt für 1MHz zeigen

Wirklich?

PISA läßt grüßen.

von Peter D. (peda)


Lesenswert?

Michael H. schrieb:
> Ich will Die ISR ca im
> 1MHz Takt aufrufen. Geht das überhaupt ?

Schon eine leere ISR kostet auf dem AVR 10 Takte.
Also: Nein.
Typisch sollte man bei einer einfachen ISR >=50 Takte einplanen.
Eine komplexe ISR kann durchaus 500 Takte kosten.

Eine Timer-ISR würde ich daher nicht schneller als 10kHz (@16MHz) 
machen.
Es sollten ja noch weitere ISRs möglich sein und das Main soll auch noch 
was tun können.

von Michael H. (h_m)


Lesenswert?

Danke, jetzt bin ich schon schlauer

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wofür brauchst Du überhaupt einen Timer mit 1MHz-Takt? Eventuell lässt 
sich Dein Vorhaben ja auch ganz anders lösen.

von m.n. (Gast)


Lesenswert?

Michael H. schrieb:
> könnte mir bitte jemand den Rechenweg zb. jetzt für 1MHz zeigen

Wie man einen Timer auf 1 MHz einstellt?

Frank M. schrieb:
> Eventuell lässt
> sich Dein Vorhaben ja auch ganz anders lösen.

Das wäre aber eher etwas für ARMe Leute ;-)

von Axel S. (a-za-z0-9)


Lesenswert?

Michael H. schrieb:
> ich rechne Taktfrequenz des Mikrocontrollers / Prescaler * die Zeit
> das wäre jetzt 16000000/256*1e6 = 0,0625

Diese Rechnung ist unsinnig. Wenn du schon mit Frequenzen rechnest, dann 
mußt du die 16MHz Takt durch die 1MHz gewünschte Interruptfrequenz 
teilen. Man braucht sicher keinen Taschenrechner, um zu sehen, daß der 
Timer alle 16 Takte einen Interrupt auslösen muß. Genauso braucht es 
kein Genie, um zu erkennen daß in dieser Situation ein Vorteiler von 
256:1 irgendwie keinen Nutzen bringt.

von Falk B. (falk)


Lesenswert?

@Axel Schwenke (a-za-z0-9)

>teilen. Man braucht sicher keinen Taschenrechner, um zu sehen, daß der
>Timer alle 16 Takte einen Interrupt auslösen muß. Genauso braucht es
>kein Genie, um zu erkennen daß in dieser Situation ein Vorteiler von
>256:1 irgendwie keinen Nutzen bringt.

Meine Rede, PISA ist überall 8-(

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Falk B. schrieb:
> PISA

Jetzt weiß ich auch, warum Das 'PISA' genannt wird!!
Man wird dann schief (wie der berühmte Turm dort) angeguckt ;)

MfG

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Schon eine leere ISR kostet auf dem AVR 10 Takte.

Es sind 8 Takte. Man muss dazu nur die leere ISR dort plazieren, wo 
leere ISRs problemlos hinpassen: direkt auf dem Vektor, ist ja 
schließlich kein Hexenwerk, einfach

.ORG VECTORaddr
  reti

hinzuschreiben...

Ist natürlich (außer, wenn die ISR nur zum Aufwachen aus einem 
Schlafzustand dienen soll) einigermaßen sinnlos.

Aber über leere ISRs hinaus ist es durchaus relativ oft möglich, 
zumindest den zeitkritischen Teil extrem häufig durchlaufener ISR direkt 
im Vektor zu plazieren, insbesondere natürlich bei den Megas mit mehr 
als 8k Flash (weil dort pro Vektor halt zwei Worte verfügbar sind, 
wodurch mit nachfolgenden ungenutzten Vektoren zusammen oft einfach 
genug Flashpace für den zeitkritischen Teil der ISR zusammenkommt).

Man muss einfach nur wissen, was man tut und eine Sprache verwenden, die 
Leuten, die wissen, was sie tun, einfach erlaubt, eben dies zu tun...

> Typisch sollte man bei einer einfachen ISR >=50 Takte einplanen.

Eingeplant werden braucht garnix. Man schreibt sie und optimiert sie. 
Was sie dann noch dauert, das dauert sie halt.

> Eine komplexe ISR kann durchaus 500 Takte kosten.

Sogar zehn- oder hunderttausende von Takten. Kein Problem, den 
länglichen Teil darf man halt nur nicht exklusiv ausführen. Und man muß 
natürlich dafür sorgen, das zumindest der längliche Teil von 
nachfolgenden ISR-Instanzen desselben Interrupts so lange nicht erreicht 
werden kann, bis die aktuelle Instanz durch ist...

> Eine Timer-ISR würde ich daher nicht schneller als 10kHz (@16MHz)
> machen.
> Es sollten ja noch weitere ISRs möglich sein und das Main soll auch noch
> was tun können.

Es kommt halt einfach darauf an, was in dieser Timer-ISR passieren soll. 
Zwischen garnix und der Berechnung des Sinns des Lebens kann das ja so 
ziemlich alles sein. Bei garnix ist halt 1/16 des Systemtaktes absolut 
kein Problem. Außer, dass man das Systrem dann natürlich auch gleich 
komplett ohne diese ISR und mit 8Mhz betreiben könnte...

Soll heißen: wer exakt weiss, was sein Code an Rechenzeit braucht, dem 
fällt es auch sehr viel leichter ein "passendes" Interruptsystem zu 
kreiieren.

Nunja und der Rest programmiert halt nicht in Assembler...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.