mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer in Sekunden umrechnen


Autor: Toni (Gast)
Datum:

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

Autor: marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
= 2 * prescaler / fclk * ticks

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also was machst du da???
du addierst irgendwas in ein timer register???

Autor: Toni (Gast)
Datum:

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

So etwa:

= 2* 8 /1024 * ?

Was sind ticks?

Autor: Toni (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Jochen (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Toni (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...
Die zugehörigen Includes findest du im selben Thread etwas weiter
oben.

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

...

Autor: Toni (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: luchs2a (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

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.