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.
also was machst du da??? du addierst irgendwas in ein timer register???
Könntest du mir jetzt noch die Werte hineinschreiben wie ich sie oben angeben habe. So etwa: = 2* 8 /1024 * ? Was sind ticks?
@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.
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. ...
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 ...
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. ...
Er springt mir aber ca. alle 8 Sekunden in den Überlauf-Interrupt des Timers. Diese Zeit möchte ich jetzt genau.
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. ...
Ich möchte doch nur wissen wie lange der Timer benötigt bis er den Überlauf-Interrupt auslöst.
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. ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.