hallo, ich arbeite mit einem 32 bit TriCore von Infineon und habe mal eine Frage über dessen Timer/Counter Register(mit der name: System Timer STM): der STM von Infineon ist ein 56 bit Timer, besteht aus 7 REGISTER (TIM_T0 bis TIMER_T6) jeweils 32 bits groß der TIMER_T6: hat eine Auflösung von 2,863 min und bei 25Mhz eine RANGE von 91,6 Jahr. mein Problem: ich will eine Routine schreiben, mit der ich auch secunden darstellen kann, aber nur mit TIMER_6 weil 91,6 Jahr bis zum Overflow!!! --> geht doch wenn ich wenn ich einfach den Inhalt von ([TIMER_6*Auflösung]*60)%60 hinschreibe oder? --> nun sag mir mein betreuer: mit der gleichung hätte ich nicht ein kleinere Overflow als 91,6 Jahr!!! Frage: kann mir jemand das erklären? (der betreuer weiß auch nicht viel!!!) MfG
Wie du genau auf die Minuten und Jahres-Angabe kommst, kann ich mir so auf die schnell inicht erklären, aber allgemein gilt: Du kannst 32 bit in deinem Timer darstellen. Um es mal einfacher zu machen, nehmen wir an, du kannst nur 4 bit darstelle. Wenn du deinen Timer jetzt mit 1 Hz taktest, beträgt deine Auflösung 1 s, ein Überlauf tritt nach 16 s auf. Wenn du denn Takt auf 2 Hz erhöhst, hast du eine Auflösung von 0,5 s, ein Überlauf tritt aber schon nach 8 s auf. Wird dir das Prinzip klar? Du kannst mit deinem Timer nur bis 2^32 zählen, danach tritt ein Überlauf auf. Der Timer fängt wiedr von 0 an. Viele Grüße Michael
Hallo, Auflösung und RANGE bekommst du mit DaVe(Infineon Software) brauchst nur ablesen! trotzdem gibst du mir immer keine Antwort auf meine Frage! Noch mal: ich habe ein 32 Bit Timer: Auflösung 2,863min Overflow nach 91,6 Jahr! ich will eine Routine schreiben um auch secunden darstellen zu können! geht (dachte ich) mit: (((Inhalt des Timers)*auflösung)*60s)%60 Aber mir wurde gesagt ===> dadurch wird ein Overflow schneller auftretten!!! und ich weiß nicht warum? MfG
Erstmal was heißt hier immer und überall keine Antwort auf deine Frage. Ich denke ich habe dir grade zum ersten Mal geantwortet! Aber ich glaube ich verstehe jetzt, was du meinst: Du möchtest einfach die Anzeige auf Sekunden erweitern. Grundsätzlich ist das mit deiner obigen Formel möglich, wobei das natürlich wenig sinnvoll ist, da sich dein Timerwert und damit auch deine Sekundenanzeige nur alle 2,863 Minuten ändern wird. IMHO wenig sinnvoll.
Da dein vorgeschlagener Weg wenig sinnvoll ist, müsstest du eigentlich deine Auflösung erhöhen (beispielsweise 10 s). Damit reduziert sich dann natürlich auch dein darstellbarer Zeitbereich. Wobei das in der Regel kein Problem ist, bei einem Overflow einen Zähler in Software mitzuzählen. Dadurch kannst du deinen Timer erweitern.
Dann noch mal ganz langsam für mich: Wie möchtest du bei einer Timer-Auflösung von 2,863 Minuten eine Auflösung von Sekunden erreichen?
Man kann natürlich alles ganz kompliziert machen. Oder einfach so, wie man es auf anderen MCs macht: Man nehme einen Timercompareinterrupt alle Sekunde, das sind dann bei 25MHz genau 25000000 Zyklen. Und in dem Timerinterrupt zählt man dann einfach in einer Variablen die Sekunden weiter. Mit einer 32Bit-Variable kann man dann bis 136 Jahre zählen, sollte ja reichen. Peter
hallo anders gesagt mein Timer ist 56 bit lang! bestehend aus aus 2 Register_Timer TIMER_T0 & TIMER_T6 TIMER_T0 (bit 0-->31) : auflösung 40ns Overflow nach 2,863 min TIMER_T6 (bit 31-->55): auflösung 2,863 min Overflow 91,6 Jahr! wie kann ich den Inhalt der 56bit TIMER lesen? MfG
Iterativ. T6 lesen, T0 lesen, T6 nochmal lesen und mit vorigem Wert vergleichen. Wenn verschieden => nochmal das Ganze.
Sag das doch gleich :-)Das hört sich ja schon ganz anders an. Timerwert = Timer_T0 + Timer_T6*2^31 Dieser Wert ist dann deine Zeit als Vielfaches von 40ns. Viele Grüße Michael
Also ich habe es so verstanden, dass sein Timer 56 bit breit ist und aus zwei Registern besteht, die nur einzeln ausgelesen werden können. Entsprechend meiner Formel oben setzt man sich dann den gesamten Timerwert aus den beiden einzelnen Registern wieder zusammen.
Langsam! TIMER_T0 wie schon oben gesagtt! 32 Bit breit! TIMER_T6 auch 32 bit breit wobei (bit an der stellen 2^25 --> 2^32 0 sind) mit deinem Compiler kannst nur bis unsigned long Typen handlen! Nun sag mir konkret! wie du dir dass vorstellst? MfG
Normalerweise gibt es beim Compiler auch den Datentyp unsigned long long, dieser ist entsprechend 64 bit breit.
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.