Timer in Sekunden umrechnen

Gast #213164
Habe ein Problem. Ich möchte einen Zeitstempel generieren mit dem
Atmega32 und dessen Timer1. So habe ich den Timer definiert:

TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

Der µC hat 8MHZ. Im Datenblatt steht zu dem was ich eingestellt habe:
clkI/O/1024 (From prescaler)

Wenn ich jetzt an eine bestimmte Stelle gelange, möchte ich die Zeit in
Sekunden seit der µC gestartet wurde.
Wenn es einen Überlauf gibt wird ein Interrupt ausgelöst indem die Zeit
addiert wird

Die Zeit seit dem der Timer läuft steht ja in den Registern TCNT1H und
TCNT1L. Wie kann ich die Werte in diesen Registern in Sekunden
umrechnen.
Wenns möglich wäre in C.
Gast #213168
@Jochen
Ich möchte einfach die Zeit in Sekunden ausrechenen die in den beiden
Registern TCNT1H und TCNT1L steht, bzw. ausderen Werte man diese
ableiten können soll.
#213169
Schau dir im Datenblatt die Architektur des Timers an und programmiere
den Timer erstmal in ASM. Wenn du die Zusammenhänge verstanden hast,
dann dürfte es dir nicht schwer fallen, das in C zu machen. Mit einer
Formel, die man nicht versteht, zu rechnen, halte ich für Unfug.

...
Gast #213170
versuchs mal mit ner variable
unsigned long int time;
und zähl die jede ms hoch
müsste für knapp 50 Tage reichen

und dann einfach durch 3 600 000 teilen ist zwar net schön aber mir
doch egal

oder
mit
unsigned int millisek;
unsigned char sekunde,minute,stunde,tage;

und halt im timer interrupt hochzählen
nach 1000 ms ein sekunde
nach 60 sek ein stunde
...
#213171
Schau dir mal an, wie lange es dauert, bis bei 8 MHz Prozessortakt und
größtem Vorteiler der 16-Bit-Timer überläuft. Der Inhalt des Timers
kann dir höchstens die "Nachkommastellen" liefern, die Sekunden musst
du schon selbst zählen, dazu ist der Timer zu schnell.

...
#213173
Dann begrenze den Zählumfang des Timers...

Ein Beispiel, wie man mit Timer1 die Zeit generieren kann, ohne den
Timer für andere Anwendungen zu blockieren, findest du hier:
http://www.mikrocontroller.net/forum/read-1-164017.html#164207
Die zugehörigen Includes findest du im selben Thread etwas weiter
oben.

Weitere noch bessere Beispiele (auch in C) findest du in der
Codesammlung.

...
#213175
Dann schau ins Datenblatt.

Dort wirst du finden, dass es 65536 Timertakte sind.
1 Timertakt sind dann n Prozessortakte (n=Vorteilereinstellung).
Es sind also Vorteiler mal 65535 Prozessortakte.

Wenn du die Zeit ändern willst, dann musst du den Zählumfang des Timers
ändern. Schau dir das aber erstmal mit dem Timer0 an, der ist nicht so
komplex und daher leichter zu verstehen.

Gute Wahl für Zeitmessung ist Interrupt alle 10ms, dann je ein Register
(Byte, nicht Word) für HundertstelSekunde, Sekunde, Minute, Stunde,
Tage, Jahre...
Die Zählung der Hundertstel kann die ISR machen, bei Überlauf wird ein
(selbstdefiniertes) Steuerflag gesetzt, worauf das Hauptprogramm sie
Sekunde hochzählt (und das Flag löscht!) und bei Überlauf auf 0 setzt
und die Minute erhöht und so weiter.

...
Gast #213176
tach

auch mal ein erklärungs versuch meiner wäre;.

f=1/t   also ist t=1/f.

f osz=8e6 hz              // freq deines oszilators

f timer= fosz/1024        // taktfreq deines timers

t int= 1/(f timer)* 2^16  // dauer für 1 interruppt

t int = 8,388608 sek ( es gibt sicher noch ein paar kommastellen  die
genaue lösung wäre 131072/15625 )

aber wie schon vorher gesagt

SELBER VERSTEHEN SONST BRINGT DAS NICHTS

schönes wochenende  ich hab jetzt schluss

Mischa
Gast #213177
Hi,

nimm doch den CompareMatch interrupt. (...HanneS... hat das Beispiel
schon gegeben)

z.B. Takt: 6.144.000Hz  / 8 (Vorteiler)  = 768.000Hz -> Timer Compare
Wert auf 7680, also Compare Interrupt alle 100 Hz
Das dann in globaler Varaible hochzählen (100 entspricht dann 1
sekunde).

Gruss
Andreas

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.