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
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.
@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.
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.
Wofür brauchst Du überhaupt einen Timer mit 1MHz-Takt? Eventuell lässt sich Dein Vorhaben ja auch ganz anders lösen.
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 ;-)
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.
@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-(
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.