Forum: Mikrocontroller und Digitale Elektronik Genaue 1-sec-Zeitbasis


von emil (Gast)


Lesenswert?

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??

von Joerg Wunsch (Gast)


Lesenswert?

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 ;-).

von emil (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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.

von edi (Gast)


Lesenswert?

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

von Armin Kniesel (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.