Forum: Mikrocontroller und Digitale Elektronik Overflow : "Grundlagenfragen"


von HArdware'Ling (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von HArdware'Ling (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

von HArdware'Ling (Gast)


Lesenswert?

Hallo,
du verstehst mich einfach nicht!
trotzdem danke!

von J. J. (j_j)


Lesenswert?

Nein du verstehst Zähler nicht.

von Supa M. (supa_micha)


Lesenswert?

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?

von Supa M. (supa_micha)


Lesenswert?

Huch...

anderer Rechner, bin jetzt übrigens angemeldet :-)

von Peter D. (peda)


Lesenswert?

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

von HArdware'Ling (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

Iterativ. T6 lesen, T0 lesen, T6 nochmal lesen und mit vorigem Wert 
vergleichen. Wenn verschieden => nochmal das Ganze.

von Supa M. (supa_micha)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

> Timerwert = Timer_T0 + Timer_T6*2^31

2^31?

von Supa M. (supa_micha)


Lesenswert?

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.

von PAT (Gast)


Lesenswert?

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

von Supa M. (supa_micha)


Lesenswert?

Normalerweise gibt es beim Compiler auch den Datentyp unsigned long 
long, dieser ist entsprechend 64 bit breit.

von HArdware'Ling (Gast)


Lesenswert?

gib's keinen anderen Weg?

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.