www.mikrocontroller.net

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


Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-).

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Armin Kniesel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.