Forum: Mikrocontroller und Digitale Elektronik Timer in Sekunden umrechnen


von Toni (Gast)


Lesenswert?

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.

von marcel (Gast)


Lesenswert?

= 2 * prescaler / fclk * ticks

von Jochen (Gast)


Lesenswert?

also was machst du da???
du addierst irgendwas in ein timer register???

von Toni (Gast)


Lesenswert?

Könntest du mir jetzt noch die Werte hineinschreiben wie ich sie oben
angeben habe.

So etwa:

= 2* 8 /1024 * ?

Was sind ticks?

von Toni (Gast)


Lesenswert?

@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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Jochen (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Toni (Gast)


Lesenswert?

Er springt mir aber ca. alle 8 Sekunden in den Überlauf-Interrupt des
Timers.
Diese Zeit möchte ich jetzt genau.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Toni (Gast)


Lesenswert?

Ich möchte doch nur wissen wie lange der Timer benötigt bis er den
Überlauf-Interrupt auslöst.

von Hannes L. (hannes)


Lesenswert?

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.

...

von luchs2a (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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

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.