Forum: Projekte & Code Anfängerfrage Laufzeit ermitteln


von Andreas W. (andykaiser)


Lesenswert?

Hallo zusammen,

 ich bin auf der Suche nach einer Möglichkeit, eine Zeit zwischen zwei 
Punkten (in Sekunden) zu ermitteln.

Ich setze C unter einem C167 Prozessor ein (mit Tasking und CMX).

Bin aber schon beim Ermitteln der aktuellen Zeit auf Probleme gestossen.
Allein schon der Aufruf time() liefert mir stets 0xFFFFFFFF, d.h. die 
Funktion scheint wohl nicht unterstützt zu werden.

Gibt es überhaupt eine Möglichkeit, Sekunden auszulesen?
Es muss ja nicht eine genaue Uhrzeit sein - wird ja nirgends gesetzt.
Aber die Möglichkeit, irgendwo steigende Sekunden abzufragen würde mir 
ja reichen, um die Dauer zu berechnen.

Vielen Dank.

 Grüße, AndyKaiser

von Cyblord -. (cyblord)


Lesenswert?

Sowas geht mit einer ordentlichen Debugging Schnittstelle samt passendem 
Debugger.
Auf STM32 mit Lauterbach mache ich das dauernd.

Ansonsten nimm einen Ausgangspin und schalt den an Punkt 1 ein und an 
Punkt 2 aus und miss die Zeit mit einem Oszi oder LA. Das ist die 
Lowtech/LowCost Variante.

von N. M. (mani)


Lesenswert?

Du kannst ja einfach einen freilaufenden Timer (GPT) verwenden. Dann 
holen du dir den Wert an Stelle 1 und 2 ab, bildest eine Differenz und 
rechnest es in deine gewünschte Zeiteinheit um.
Im Idealfall Tickt der Timer z.B. mit 1ms. Damit kannst du dann direkt 
65s mit 1ms Auflösung abdecken.
Die neueren GPTs von Infineon kann man auch hintereinander Ketten. Ich 
weiß nicht ob das bei deinem alten Controller auch geht, musst du 
schauen. Dann könntest du einen größeren Zeitraum abdecken.

von Bruno V. (bruno_v)


Lesenswert?

Andreas W. schrieb:
> time()

In einem so kleinen Prozessor hat man normalerweise einen "Ticker": Eine 
variable "SysTicker", die in ms raufzählt oder einen Timer-Interrupt, 
der alle 1ms aufgerufen wird (und in dem man seinen eigenen SysTicker 
raufzählt).

Wichtig:
 * SysTicker volatile und unsigned
 * Nur in der Interruptroutine incrementieren, nicht irgendwo anders 
setzen, keine Behandlung des Überlaufs (-> das geht immer schief)
 * Wenn 16Bit, dann niemals für mehr als 30s verwenden (danach geht 
alles schief!)
 * Wenn 32Bit, dann nach spätestens 20 Tagen einen Reset machen (weil 
die Überläufe manchmal doch falsch behandelt werden und man das nicht 
sinnvoll testen kann)
 * Berechnungen von Zeiten/Differenzen maximal in der Breite des 
SysTickers
 * Niemals sowas wie "if(SysTicker>oldSysTicker + 100)" oder so.
 * Immer "diff = SysTicker - oldSysTicker; if(diff > 100)".
 * Nur wenn der SysTicker mindestens int-Breite hat (16 oder 32 Bit), 
dann geht auch sowas: "if((SysTicker - OldSysTicker) > 100)" (Klammern 
nur zur Verdeutlichung).

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Andreas W. schrieb:
> Ich setze C unter einem C167 Prozessor ein

Sicher, daß Du mit diesem Urgestein noch ein neues Projekt anfangen 
willst?
Infineon hat mit dem C167 den Fehler gemacht, nicht auf Flash 
umzusteigen, wie alle anderen µC-Hersteller. Daher ist er kaum 
verbreitet. Wer will sich heute noch mit Mask-ROM rumplagen.
Der Schritt zum XC167 mit Flash erfolgte viel zu spät (2005), so daß 
dieser schon wieder obsolet ist.

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.