Entschuldigt mal die blöde Frage, will mir aber sicher sein: möchte gern' eine punktgenaue 1 sec Zeitbasis erzeugen; verwende den 16-bit Timer1 des Mega8 und einen 8.000Mhz Quartz; der Timer1 generiert Interrupt bei Overflow (meine Zeitbasis eben); Prescaller=256 => 8000000/256=32150 Die Frage: soll ich jetzt den Timer1 in der Interruptroutine mit 32149 oder mit 32150 aufladen, damit er genau jede Sekunde einen Interrupt generiert??
Beides nicht. Benutze lieber die Automatik, die sich da `CTC' nennt (clear timer on compare match). Das umgeht die race, falls die Interruptroutine mal nicht pünktlich gerufen werden kann. Wenn Du Dir das Timingdiagramm im Datenblatt ansiehst, wird Dir dann auch klar, auf welchen Wert Du das setzen mußt. Falls Du hingegen den overflow interrupt wirklich nutzen willst, mußt Dü übrigens -32150 voreinstellen (oder -32149, bin jetzt gerade zu faul, darüber nachzudenken ;-).
Danke für die Hilfe, Jörg! Praxis ist eben Praxis, würde selbst nie die Hürden mit dem ungenauen Interruptaufruf sehen, hm... Studiere eben nach CTC im Datenblatt. Und im Allgemeinen: ist dies (CTC) die gewöhnliche Methode, wenn man eine genaue Zeitbasis benötigt? Mache das zum ersten Mal, würde aber gerne kluger werden :) Wie macht Ihr denn sowas? lG, Emil
Ich denke schon. Kannst das natürlich auch irgendwie noch kaskadieren, entweder per Hardware (OC-Ausgang als Eingang für nächsten Zähler) oder per Software mittels Interrupt, da mußt Du dann nur sicherstellen, daß der Aufruf der Interruptroutinen innerhalb des Intervalls garantierbar ist. Im letzten Projekt, wo ich sowas benötigt habe, habe ich einen Timer im CTC-Modus mit 16 kHz tickern lassen, dessen OC-Interrupt dann softwaremäßig durch 160 nachgeteilt worden ist, um auf 10 ms timer tick rate (100 Hz) zu kommen. Damit wurde dann ein komplexeres Zeitgebersystem gesteuert, bei dem ich intern beliebig Software- Zeitgeber parallel aktivieren kann, die dann beim Erreichen der Zeit ein Software-Ereignis auslösen. Damit lassen sich mit einer Granularität von 10 ms praktisch beliebige weitere Zeiten generieren, z. B. 50 ms für eine Tasterentprellung, 250 ms für das Feststellen, ob der Taster länger gedrückt worden ist usw. usf. Die 16 kHz waren notwendig, weil der erste Zeitgeber nur ein 8-bittiger ist und weil kein Vorteiler benutzt werden konnte (wegen der Quarz- frequenz). Angenehmer Seiteneffekt: die 16 kHz sind schnell genug, daß man sie noch gut messen kann am OC-Ausgang (mit einem Zählfrequenzmesser) und dann mit einem Trimmer den Quarz auf Sollfrequenz ziehen kann. Das bedeutet aber auch, daß keine andere Interruptroutine auch nur annähernd an die 1/16 kHz =~ 62,5 µs Laufzeit herankommen darf (oder sonst irgendwie die Interrupts für so lange blockiert sein dürfen), andernfalls gehen Primärinterrupts verloren. Die Laufzeit dieser Interruptroutine kostet eben auch schon einen nicht unbeachtlichen Anteil an Gesamt-CPU.
hi, teste doch beide varianten und schaue mal welche zB nach 1000 s vo- oder nacheilt gegenueber einer stoppuhr. normalerweise kann man ein quarz mit einem kompensator 'etwas ziehen' vergesse nicht,dass temperatur an der 'zeit' nagt.(drift) ed
Das mit dem CTC kapiere ich nicht, ich habs im Datenblatt nicht richtig verstanden :-( Was ist am CTC anders als wenn ich beim normalen Timeroverflow- Interrupt den Timerwert auslese und beim neubeschreiben wieder mit draufaddiere? Durch diese Korrektur habe ich doch auch einen genauen Zeitwert, oder nicht? Armin
Daß der CTC-Modus das alles für Dich in Hardware macht, ohne Interrupt und alles. (Du kannst zwar noch einen Interrupt ausgelöst bekommen, wenn Du das möchtest, aber der Zähler wurde zu diesem Zeitpunkt dann bereits zurückgesetzt.) Das ist der einzige praktische Unterschied, aber er ist nicht ganz unerheblich, ist eben bequemer und kostet keine CPU-Zeit.
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.